ValueTracking.h revision 846a2f2703f6bb894098274964faf5dce0b68c4d
158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//===- llvm/Analysis/ValueTracking.h - Walk computations --------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// License. See LICENSE.TXT for details. 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)//===----------------------------------------------------------------------===// 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// 1058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// This file contains routines that help analyze properties that chains of 1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// computations have. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===// 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#ifndef LLVM_ANALYSIS_VALUETRACKING_H 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#define LLVM_ANALYSIS_VALUETRACKING_H 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "llvm/Support/DataTypes.h" 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <string> 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace llvm { 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Value; 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class Instruction; 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class APInt; 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class TargetData; 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) class LLVMContext; 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// ComputeMaskedBits - Determine which of the bits specified in Mask are 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// known to be either zero or one and return them in the KnownZero/KnownOne 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// bit sets. This code only analyzes bits in Mask, in order to short-circuit 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// processing. 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void ComputeMaskedBits(Value *V, const APInt &Mask, APInt &KnownZero, 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) APInt &KnownOne, const TargetData *TD = 0, 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) unsigned Depth = 0); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// MaskedValueIsZero - Return true if 'V & Mask' is known to be zero. We use 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// this predicate to simplify operations downstream. Mask is known to be 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// zero for bits that V cannot have. 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool MaskedValueIsZero(Value *V, const APInt &Mask, 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const TargetData *TD = 0, unsigned Depth = 0); 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// ComputeNumSignBits - Return the number of times the sign bit of the 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// register is replicated into the other bits. We know that at least 1 bit 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// is always equal to the sign bit (itself), but other cases can give us 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// information. For example, immediately after an "ashr X, 2", we know that 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// the top 3 bits are all equal to each other, so we return 3. 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// 'Op' must have a scalar integer type. 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned ComputeNumSignBits(Value *Op, const TargetData *TD = 0, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned Depth = 0); 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// CannotBeNegativeZero - Return true if we can prove that the specified FP 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// value is never equal to -0.0. 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool CannotBeNegativeZero(const Value *V, unsigned Depth = 0); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// FindScalarValue - Given an aggregrate and an sequence of indices, see if 6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// the scalar value indexed is already around as a register, for example if 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// it were inserted directly into the aggregrate. 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// If InsertBefore is not null, this function will duplicate (modified) 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// insertvalues when a part of a nested struct is extracted. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Value *FindInsertedValue(Value *V, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const unsigned *idx_begin, 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const unsigned *idx_end, 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LLVMContext &Context, 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Instruction *InsertBefore = 0); 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// This is a convenience wrapper for finding values indexed by a single index 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// only. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) inline Value *FindInsertedValue(Value *V, const unsigned Idx, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LLVMContext &Context, 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) Instruction *InsertBefore = 0) { 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const unsigned Idxs[1] = { Idx }; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return FindInsertedValue(V, &Idxs[0], &Idxs[1], Context, InsertBefore); 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// GetConstantStringInfo - This function computes the length of a 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// null-terminated C string pointed to by V. If successful, it returns true 8258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) /// and returns the string in Str. If unsuccessful, it returns false. If 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) /// StopAtNul is set to true (the default), the returned string is truncated 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// by a nul character in the global. If StopAtNul is false, the nul 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// character is included in the result string. 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool GetConstantStringInfo(Value *V, std::string &Str, uint64_t Offset = 0, 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool StopAtNul = true); 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // end namespace llvm 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)