diff options
author | Chandler Carruth <chandlerc@gmail.com> | 2013-01-02 09:10:48 +0000 |
---|---|---|
committer | Chandler Carruth <chandlerc@gmail.com> | 2013-01-02 09:10:48 +0000 |
commit | c2c50cdcdc19a1bca993c06d13d8cdca87083ce4 (patch) | |
tree | e46b4b6d4d44228df1e870f690506dbf296954c1 /lib/VMCore/ConstantFold.cpp | |
parent | 3af932322859285988a4c53551540fc0658b2116 (diff) |
Rename VMCore directory to IR.
Aside from moving the actual files, this patch only updates the build
system and the source file comments under lib/... that are relevant.
I'll be updating other docs and other files in smaller subsequnet
commits.
While I've tried to test this, but it is entirely possible that there
will still be some build system fallout.
Also, note that I've not changed the library name itself: libLLVMCore.a
is still the library name. I'd be interested in others' opinions about
whether we should rename this as well (I think we should, just not sure
what it might break)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@171359 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 2066 |
1 files changed, 0 insertions, 2066 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp deleted file mode 100644 index dedae5a83f..0000000000 --- a/lib/VMCore/ConstantFold.cpp +++ /dev/null @@ -1,2066 +0,0 @@ -//===- ConstantFold.cpp - LLVM constant folder ----------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements folding of constants for LLVM. This implements the -// (internal) ConstantFold.h interface, which is used by the -// ConstantExpr::get* methods to automatically fold constants when possible. -// -// The current constant folding implementation is implemented in two pieces: the -// pieces that don't need DataLayout, and the pieces that do. This is to avoid -// a dependence in VMCore on Target. -// -//===----------------------------------------------------------------------===// - -#include "ConstantFold.h" -#include "llvm/ADT/SmallVector.h" -#include "llvm/Constants.h" -#include "llvm/DerivedTypes.h" -#include "llvm/Function.h" -#include "llvm/GlobalAlias.h" -#include "llvm/GlobalVariable.h" -#include "llvm/Instructions.h" -#include "llvm/Operator.h" -#include "llvm/Support/Compiler.h" -#include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/GetElementPtrTypeIterator.h" -#include "llvm/Support/ManagedStatic.h" -#include "llvm/Support/MathExtras.h" -#include <limits> -using namespace llvm; - -//===----------------------------------------------------------------------===// -// ConstantFold*Instruction Implementations -//===----------------------------------------------------------------------===// - -/// BitCastConstantVector - Convert the specified vector Constant node to the -/// specified vector type. At this point, we know that the elements of the -/// input vector constant are all simple integer or FP values. -static Constant *BitCastConstantVector(Constant *CV, VectorType *DstTy) { - - if (CV->isAllOnesValue()) return Constant::getAllOnesValue(DstTy); - if (CV->isNullValue()) return Constant::getNullValue(DstTy); - - // If this cast changes element count then we can't handle it here: - // doing so requires endianness information. This should be handled by - // Analysis/ConstantFolding.cpp - unsigned NumElts = DstTy->getNumElements(); - if (NumElts != CV->getType()->getVectorNumElements()) - return 0; - - Type *DstEltTy = DstTy->getElementType(); - - SmallVector<Constant*, 16> Result; - Type *Ty = IntegerType::get(CV->getContext(), 32); - for (unsigned i = 0; i != NumElts; ++i) { - Constant *C = - ConstantExpr::getExtractElement(CV, ConstantInt::get(Ty, i)); - C = ConstantExpr::getBitCast(C, DstEltTy); - Result.push_back(C); - } - - return ConstantVector::get(Result); -} - -/// This function determines which opcode to use to fold two constant cast -/// expressions together. It uses CastInst::isEliminableCastPair to determine -/// the opcode. Consequently its just a wrapper around that function. -/// @brief Determine if it is valid to fold a cast of a cast -static unsigned -foldConstantCastPair( - unsigned opc, ///< opcode of the second cast constant expression - ConstantExpr *Op, ///< the first cast constant expression - Type *DstTy ///< desintation type of the first cast -) { - assert(Op && Op->isCast() && "Can't fold cast of cast without a cast!"); - assert(DstTy && DstTy->isFirstClassType() && "Invalid cast destination type"); - assert(CastInst::isCast(opc) && "Invalid cast opcode"); - - // The the types and opcodes for the two Cast constant expressions - Type *SrcTy = Op->getOperand(0)->getType(); - Type *MidTy = Op->getType(); - Instruction::CastOps firstOp = Instruction::CastOps(Op->getOpcode()); - Instruction::CastOps secondOp = Instruction::CastOps(opc); - - // Assume that pointers are never more than 64 bits wide. - IntegerType *FakeIntPtrTy = Type::getInt64Ty(DstTy->getContext()); - - // Let CastInst::isEliminableCastPair do the heavy lifting. - return CastInst::isEliminableCastPair(firstOp, secondOp, SrcTy, MidTy, DstTy, - FakeIntPtrTy, FakeIntPtrTy, - FakeIntPtrTy); -} - -static Constant *FoldBitCast(Constant *V, Type *DestTy) { - Type *SrcTy = V->getType(); - if (SrcTy == DestTy) - return V; // no-op cast - - // Check to see if we are casting a pointer to an aggregate to a pointer to - // the first element. If so, return the appropriate GEP instruction. - if (PointerType *PTy = dyn_cast<PointerType>(V->getType())) - if (PointerType *DPTy = dyn_cast<PointerType>(DestTy)) - if (PTy->getAddressSpace() == DPTy->getAddressSpace() - && DPTy->getElementType()->isSized()) { - SmallVector<Value*, 8> IdxList; - Value *Zero = - Constant::getNullValue(Type::getInt32Ty(DPTy->getContext())); - IdxList.push_back(Zero); - Type *ElTy = PTy->getElementType(); - while (ElTy != DPTy->getElementType()) { - if (StructType *STy = dyn_cast<StructType>(ElTy)) { - if (STy->getNumElements() == 0) break; - ElTy = STy->getElementType(0); - IdxList.push_back(Zero); - } else if (SequentialType *STy = - dyn_cast<SequentialType>(ElTy)) { - if (ElTy->isPointerTy()) break; // Can't index into pointers! - ElTy = STy->getElementType(); - IdxList.push_back(Zero); - } else { - break; - } - } - - if (ElTy == DPTy->getElementType()) - // This GEP is inbounds because all indices are zero. - return ConstantExpr::getInBoundsGetElementPtr(V, IdxList); - } - - // Handle casts from one vector constant to another. We know that the src - // and dest type have the same size (otherwise its an illegal cast). - if (VectorType *DestPTy = dyn_cast<VectorType>(DestTy)) { - if (VectorType *SrcTy = dyn_cast<VectorType>(V->getType())) { - assert(DestPTy->getBitWidth() == SrcTy->getBitWidth() && - "Not cast between same sized vectors!"); - SrcTy = NULL; - // First, check for null. Undef is already handled. - if (isa<ConstantAggregateZero>(V)) - return Constant::getNullValue(DestTy); - - // Handle ConstantVector and ConstantAggregateVector. - return BitCastConstantVector(V, DestPTy); - } - - // Canonicalize scalar-to-vector bitcasts into vector-to-vector bitcasts - // This allows for other simplifications (although some of them - // can only be handled by Analysis/ConstantFolding.cpp). - if (isa<ConstantInt>(V) || isa<ConstantFP>(V)) - return ConstantExpr::getBitCast(ConstantVector::get(V), DestPTy); - } - - // Finally, implement bitcast folding now. The code below doesn't handle - // bitcast right. - if (isa<ConstantPointerNull>(V)) // ptr->ptr cast. - return ConstantPointerNull::get(cast<PointerType>(DestTy)); - - // Handle integral constant input. - if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { - if (DestTy->isIntegerTy()) - // Integral -> Integral. This is a no-op because the bit widths must - // be the same. Consequently, we just fold to V. - return V; - - if (DestTy->isFloatingPointTy()) - return ConstantFP::get(DestTy->getContext(), - APFloat(CI->getValue(), - !DestTy->isPPC_FP128Ty())); - - // Otherwise, can't fold this (vector?) - return 0; - } - - // Handle ConstantFP input: FP -> Integral. - if (ConstantFP *FP = dyn_cast<ConstantFP>(V)) - return ConstantInt::get(FP->getContext(), - FP->getValueAPF().bitcastToAPInt()); - - return 0; -} - - -/// ExtractConstantBytes - V is an integer constant which only has a subset of -/// its bytes used. The bytes used are indicated by ByteStart (which is the -/// first byte used, counting from the least significant byte) and ByteSize, -/// which is the number of bytes used. -/// -/// This function analyzes the specified constant to see if the specified byte -/// range can be returned as a simplified constant. If so, the constant is -/// returned, otherwise null is returned. -/// -static Constant *ExtractConstantBytes(Constant *C, unsigned ByteStart, - unsigned ByteSize) { - assert(C->getType()->isIntegerTy() && - (cast<IntegerType>(C->getType())->getBitWidth() & 7) == 0 && - "Non-byte sized integer input"); - unsigned CSize = cast<IntegerType>(C->getType())->getBitWidth()/8; - assert(ByteSize && "Must be accessing some piece"); - assert(ByteStart+ByteSize <= CSize && "Extracting invalid piece from input"); - assert(ByteSize != CSize && "Should not extract everything"); - - // Constant Integers are simple. - if (ConstantInt *CI = dyn_cast<ConstantInt>(C)) { - APInt V = CI->getValue(); - if (ByteStart) - V = V.lshr(ByteStart*8); - V = V.trunc(ByteSize*8); - return ConstantInt::get(CI->getContext(), V); - } - - // In the input is a constant expr, we might be able to recursively simplify. - // If not, we definitely can't do anything. - ConstantExpr *CE = dyn_cast<ConstantExpr>(C); - if (CE == 0) return 0; - - switch (CE->getOpcode()) { - default: return 0; - case Instruction::Or: { - Constant *RHS = ExtractConstantBytes(CE->getOperand(1), ByteStart,ByteSize); - if (RHS == 0) - return 0; - - // X | -1 -> -1. - if (ConstantInt *RHSC = dyn_cast<ConstantInt>(RHS)) - if (RHSC->isAllOnesValue()) - return RHSC; - - Constant *LHS = ExtractConstantBytes(CE->getOperand(0), ByteStart,ByteSize); - if (LHS == 0) - return 0; - return ConstantExpr::getOr(LHS, RHS); - } - case Instruction::And: { - Constant *RHS = ExtractConstantBytes(CE->getOperand(1), ByteStart,ByteSize); - if (RHS == 0) - return 0; - - // X & 0 -> 0. - if (RHS->isNullValue()) - return RHS; - - Constant *LHS = ExtractConstantBytes(CE->getOperand(0), ByteStart,ByteSize); - if (LHS == 0) - return 0; - return ConstantExpr::getAnd(LHS, RHS); - } - case Instruction::LShr: { - ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1)); - if (Amt == 0) - return 0; - unsigned ShAmt = Amt->getZExtValue(); - // Cannot analyze non-byte shifts. - if ((ShAmt & 7) != 0) - return 0; - ShAmt >>= 3; - - // If the extract is known to be all zeros, return zero. - if (ByteStart >= CSize-ShAmt) - return Constant::getNullValue(IntegerType::get(CE->getContext(), - ByteSize*8)); - // If the extract is known to be fully in the input, extract it. - if (ByteStart+ByteSize+ShAmt <= CSize) - return ExtractConstantBytes(CE->getOperand(0), ByteStart+ShAmt, ByteSize); - - // TODO: Handle the 'partially zero' case. - return 0; - } - - case Instruction::Shl: { - ConstantInt *Amt = dyn_cast<ConstantInt>(CE->getOperand(1)); - if (Amt == 0) - return 0; - unsigned ShAmt = Amt->getZExtValue(); - // Cannot analyze non-byte shifts. - if ((ShAmt & 7) != 0) - return 0; - ShAmt >>= 3; - - // If the extract is known to be all zeros, return zero. - if (ByteStart+ByteSize <= ShAmt) - return Constant::getNullValue(IntegerType::get(CE->getContext(), - ByteSize*8)); - // If the extract is known to be fully in the input, extract it. - if (ByteStart >= ShAmt) - return ExtractConstantBytes(CE->getOperand(0), ByteStart-ShAmt, ByteSize); - - // TODO: Handle the 'partially zero' case. - return 0; - } - - case Instruction::ZExt: { - unsigned SrcBitSize = - cast<IntegerType>(CE->getOperand(0)->getType())->getBitWidth(); - - // If extracting something that is completely zero, return 0. - if (ByteStart*8 >= SrcBitSize) - return Constant::getNullValue(IntegerType::get(CE->getContext(), - ByteSize*8)); - - // If exactly extracting the input, return it. - if (ByteStart == 0 && ByteSize*8 == SrcBitSize) - return CE->getOperand(0); - - // If extracting something completely in the input, if if the input is a - // multiple of 8 bits, recurse. - if ((SrcBitSize&7) == 0 && (ByteStart+ByteSize)*8 <= SrcBitSize) - return ExtractConstantBytes(CE->getOperand(0), ByteStart, ByteSize); - - // Otherwise, if extracting a subset of the input, which is not multiple of - // 8 bits, do a shift and trunc to get the bits. - if ((ByteStart+ByteSize)*8 < SrcBitSize) { - assert((SrcBitSize&7) && "Shouldn't get byte sized case here"); - Constant *Res = CE->getOperand(0); - if (ByteStart) - Res = ConstantExpr::getLShr(Res, - ConstantInt::get(Res->getType(), ByteStart*8)); - return ConstantExpr::getTrunc(Res, IntegerType::get(C->getContext(), - ByteSize*8)); - } - - // TODO: Handle the 'partially zero' case. - return 0; - } - } -} - -/// getFoldedSizeOf - Return a ConstantExpr with type DestTy for sizeof -/// on Ty, with any known factors factored out. If Folded is false, -/// return null if no factoring was possible, to avoid endlessly -/// bouncing an unfoldable expression back into the top-level folder. -/// -static Constant *getFoldedSizeOf(Type *Ty, Type *DestTy, - bool Folded) { - if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { - Constant *N = ConstantInt::get(DestTy, ATy->getNumElements()); - Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true); - return ConstantExpr::getNUWMul(E, N); - } - - if (StructType *STy = dyn_cast<StructType>(Ty)) - if (!STy->isPacked()) { - unsigned NumElems = STy->getNumElements(); - // An empty struct has size zero. - if (NumElems == 0) - return ConstantExpr::getNullValue(DestTy); - // Check for a struct with all members having the same size. - Constant *MemberSize = - getFoldedSizeOf(STy->getElementType(0), DestTy, true); - bool AllSame = true; - for (unsigned i = 1; i != NumElems; ++i) - if (MemberSize != - getFoldedSizeOf(STy->getElementType(i), DestTy, true)) { - AllSame = false; - break; - } - if (AllSame) { - Constant *N = ConstantInt::get(DestTy, NumElems); - return ConstantExpr::getNUWMul(MemberSize, N); - } - } - - // Pointer size doesn't depend on the pointee type, so canonicalize them - // to an arbitrary pointee. - if (PointerType *PTy = dyn_cast<PointerType>(Ty)) - if (!PTy->getElementType()->isIntegerTy(1)) - return - getFoldedSizeOf(PointerType::get(IntegerType::get(PTy->getContext(), 1), - PTy->getAddressSpace()), - DestTy, true); - - // If there's no interesting folding happening, bail so that we don't create - // a constant that looks like it needs folding but really doesn't. - if (!Folded) - return 0; - - // Base case: Get a regular sizeof expression. - Constant *C = ConstantExpr::getSizeOf(Ty); - C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false, - DestTy, false), - C, DestTy); - return C; -} - -/// getFoldedAlignOf - Return a ConstantExpr with type DestTy for alignof -/// on Ty, with any known factors factored out. If Folded is false, -/// return null if no factoring was possible, to avoid endlessly -/// bouncing an unfoldable expression back into the top-level folder. -/// -static Constant *getFoldedAlignOf(Type *Ty, Type *DestTy, - bool Folded) { - // The alignment of an array is equal to the alignment of the - // array element. Note that this is not always true for vectors. - if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { - Constant *C = ConstantExpr::getAlignOf(ATy->getElementType()); - C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false, - DestTy, - false), - C, DestTy); - return C; - } - - if (StructType *STy = dyn_cast<StructType>(Ty)) { - // Packed structs always have an alignment of 1. - if (STy->isPacked()) - return ConstantInt::get(DestTy, 1); - - // Otherwise, struct alignment is the maximum alignment of any member. - // Without target data, we can't compare much, but we can check to see - // if all the members have the same alignment. - unsigned NumElems = STy->getNumElements(); - // An empty struct has minimal alignment. - if (NumElems == 0) - return ConstantInt::get(DestTy, 1); - // Check for a struct with all members having the same alignment. - Constant *MemberAlign = - getFoldedAlignOf(STy->getElementType(0), DestTy, true); - bool AllSame = true; - for (unsigned i = 1; i != NumElems; ++i) - if (MemberAlign != getFoldedAlignOf(STy->getElementType(i), DestTy, true)) { - AllSame = false; - break; - } - if (AllSame) - return MemberAlign; - } - - // Pointer alignment doesn't depend on the pointee type, so canonicalize them - // to an arbitrary pointee. - if (PointerType *PTy = dyn_cast<PointerType>(Ty)) - if (!PTy->getElementType()->isIntegerTy(1)) - return - getFoldedAlignOf(PointerType::get(IntegerType::get(PTy->getContext(), - 1), - PTy->getAddressSpace()), - DestTy, true); - - // If there's no interesting folding happening, bail so that we don't create - // a constant that looks like it needs folding but really doesn't. - if (!Folded) - return 0; - - // Base case: Get a regular alignof expression. - Constant *C = ConstantExpr::getAlignOf(Ty); - C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false, - DestTy, false), - C, DestTy); - return C; -} - -/// getFoldedOffsetOf - Return a ConstantExpr with type DestTy for offsetof -/// on Ty and FieldNo, with any known factors factored out. If Folded is false, -/// return null if no factoring was possible, to avoid endlessly -/// bouncing an unfoldable expression back into the top-level folder. -/// -static Constant *getFoldedOffsetOf(Type *Ty, Constant *FieldNo, - Type *DestTy, - bool Folded) { - if (ArrayType *ATy = dyn_cast<ArrayType>(Ty)) { - Constant *N = ConstantExpr::getCast(CastInst::getCastOpcode(FieldNo, false, - DestTy, false), - FieldNo, DestTy); - Constant *E = getFoldedSizeOf(ATy->getElementType(), DestTy, true); - return ConstantExpr::getNUWMul(E, N); - } - - if (StructType *STy = dyn_cast<StructType>(Ty)) - if (!STy->isPacked()) { - unsigned NumElems = STy->getNumElements(); - // An empty struct has no members. - if (NumElems == 0) - return 0; - // Check for a struct with all members having the same size. - Constant *MemberSize = - getFoldedSizeOf(STy->getElementType(0), DestTy, true); - bool AllSame = true; - for (unsigned i = 1; i != NumElems; ++i) - if (MemberSize != - getFoldedSizeOf(STy->getElementType(i), DestTy, true)) { - AllSame = false; - break; - } - if (AllSame) { - Constant *N = ConstantExpr::getCast(CastInst::getCastOpcode(FieldNo, - false, - DestTy, - false), - FieldNo, DestTy); - return ConstantExpr::getNUWMul(MemberSize, N); - } - } - - // If there's no interesting folding happening, bail so that we don't create - // a constant that looks like it needs folding but really doesn't. - if (!Folded) - return 0; - - // Base case: Get a regular offsetof expression. - Constant *C = ConstantExpr::getOffsetOf(Ty, FieldNo); - C = ConstantExpr::getCast(CastInst::getCastOpcode(C, false, - DestTy, false), - C, DestTy); - return C; -} - -Constant *llvm::ConstantFoldCastInstruction(unsigned opc, Constant *V, - Type *DestTy) { - if (isa<UndefValue>(V)) { - // zext(undef) = 0, because the top bits will be zero. - // sext(undef) = 0, because the top bits will all be the same. - // [us]itofp(undef) = 0, because the result value is bounded. - if (opc == Instruction::ZExt || opc == Instruction::SExt || - opc == Instruction::UIToFP || opc == Instruction::SIToFP) - return Constant::getNullValue(DestTy); - return UndefValue::get(DestTy); - } - - if (V->isNullValue() && !DestTy->isX86_MMXTy()) - return Constant::getNullValue(DestTy); - - // If the cast operand is a constant expression, there's a few things we can - // do to try to simplify it. - if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { - if (CE->isCast()) { - // Try hard to fold cast of cast because they are often eliminable. - if (unsigned newOpc = foldConstantCastPair(opc, CE, DestTy)) - return ConstantExpr::getCast(newOpc, CE->getOperand(0), DestTy); - } else if (CE->getOpcode() == Instruction::GetElementPtr) { - // If all of the indexes in the GEP are null values, there is no pointer - // adjustment going on. We might as well cast the source pointer. - bool isAllNull = true; - for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) - if (!CE->getOperand(i)->isNullValue()) { - isAllNull = false; - break; - } - if (isAllNull) - // This is casting one pointer type to another, always BitCast - return ConstantExpr::getPointerCast(CE->getOperand(0), DestTy); - } - } - - // If the cast operand is a constant vector, perform the cast by - // operating on each element. In the cast of bitcasts, the element - // count may be mismatched; don't attempt to handle that here. - if ((isa<ConstantVector>(V) || isa<ConstantDataVector>(V)) && - DestTy->isVectorTy() && - DestTy->getVectorNumElements() == V->getType()->getVectorNumElements()) { - SmallVector<Constant*, 16> res; - VectorType *DestVecTy = cast<VectorType>(DestTy); - Type *DstEltTy = DestVecTy->getElementType(); - Type *Ty = IntegerType::get(V->getContext(), 32); - for (unsigned i = 0, e = V->getType()->getVectorNumElements(); i != e; ++i) { - Constant *C = - ConstantExpr::getExtractElement(V, ConstantInt::get(Ty, i)); - res.push_back(ConstantExpr::getCast(opc, C, DstEltTy)); - } - return ConstantVector::get(res); - } - - // We actually have to do a cast now. Perform the cast according to the - // opcode specified. - switch (opc) { - default: - llvm_unreachable("Failed to cast constant expression"); - case Instruction::FPTrunc: - case Instruction::FPExt: - if (ConstantFP *FPC = dyn_cast<ConstantFP>(V)) { - bool ignored; - APFloat Val = FPC->getValueAPF(); - Val.convert(DestTy->isHalfTy() ? APFloat::IEEEhalf : - DestTy->isFloatTy() ? APFloat::IEEEsingle : - DestTy->isDoubleTy() ? APFloat::IEEEdouble : - DestTy->isX86_FP80Ty() ? APFloat::x87DoubleExtended : - DestTy->isFP128Ty() ? APFloat::IEEEquad : - DestTy->isPPC_FP128Ty() ? APFloat::PPCDoubleDouble : - APFloat::Bogus, - APFloat::rmNearestTiesToEven, &ignored); - return ConstantFP::get(V->getContext(), Val); - } - return 0; // Can't fold. - case Instruction::FPToUI: - case Instruction::FPToSI: - if (ConstantFP *FPC = dyn_cast<ConstantFP>(V)) { - const APFloat &V = FPC->getValueAPF(); - bool ignored; - uint64_t x[2]; - uint32_t DestBitWidth = cast<IntegerType>(DestTy)->getBitWidth(); - (void) V.convertToInteger(x, DestBitWidth, opc==Instruction::FPToSI, - APFloat::rmTowardZero, &ignored); - APInt Val(DestBitWidth, x); - return ConstantInt::get(FPC->getContext(), Val); - } - return 0; // Can't fold. - case Instruction::IntToPtr: //always treated as unsigned - if (V->isNullValue()) // Is it an integral null value? - return ConstantPointerNull::get(cast<PointerType>(DestTy)); - return 0; // Other pointer types cannot be casted - case Instruction::PtrToInt: // always treated as unsigned - // Is it a null pointer value? - if (V->isNullValue()) - return ConstantInt::get(DestTy, 0); - // If this is a sizeof-like expression, pull out multiplications by - // known factors to expose them to subsequent folding. If it's an - // alignof-like expression, factor out known factors. - if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) - if (CE->getOpcode() == Instruction::GetElementPtr && - CE->getOperand(0)->isNullValue()) { - Type *Ty = - cast<PointerType>(CE->getOperand(0)->getType())->getElementType(); - if (CE->getNumOperands() == 2) { - // Handle a sizeof-like expression. - Constant *Idx = CE->getOperand(1); - bool isOne = isa<ConstantInt>(Idx) && cast<ConstantInt>(Idx)->isOne(); - if (Constant *C = getFoldedSizeOf(Ty, DestTy, !isOne)) { - Idx = ConstantExpr::getCast(CastInst::getCastOpcode(Idx, true, - DestTy, false), - Idx, DestTy); - return ConstantExpr::getMul(C, Idx); - } - } else if (CE->getNumOperands() == 3 && - CE->getOperand(1)->isNullValue()) { - // Handle an alignof-like expression. - if (StructType *STy = dyn_cast<StructType>(Ty)) - if (!STy->isPacked()) { - ConstantInt *CI = cast<ConstantInt>(CE->getOperand(2)); - if (CI->isOne() && - STy->getNumElements() == 2 && - STy->getElementType(0)->isIntegerTy(1)) { - return getFoldedAlignOf(STy->getElementType(1), DestTy, false); - } - } - // Handle an offsetof-like expression. - if (Ty->isStructTy() || Ty->isArrayTy()) { - if (Constant *C = getFoldedOffsetOf(Ty, CE->getOperand(2), - DestTy, false)) - return C; - } - } - } - // Other pointer types cannot be casted - return 0; - case Instruction::UIToFP: - case Instruction::SIToFP: - if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { - APInt api = CI->getValue(); - APFloat apf(APInt::getNullValue(DestTy->getPrimitiveSizeInBits()), - !DestTy->isPPC_FP128Ty() /* isEEEE */); - (void)apf.convertFromAPInt(api, - opc==Instruction::SIToFP, - APFloat::rmNearestTiesToEven); - return ConstantFP::get(V->getContext(), apf); - } - return 0; - case Instruction::ZExt: - if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { - uint32_t BitWidth = cast<IntegerType>(DestTy)->getBitWidth(); - return ConstantInt::get(V->getContext(), - CI->getValue().zext(BitWidth)); - } - return 0; - case Instruction::SExt: - if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { - uint32_t BitWidth = cast<IntegerType>(DestTy)->getBitWidth(); - return ConstantInt::get(V->getContext(), - CI->getValue().sext(BitWidth)); - } - return 0; - case Instruction::Trunc: { - uint32_t DestBitWidth = cast<IntegerType>(DestTy)->getBitWidth(); - if (ConstantInt *CI = dyn_cast<ConstantInt>(V)) { - return ConstantInt::get(V->getContext(), - CI->getValue().trunc(DestBitWidth)); - } - - // The input must be a constantexpr. See if we can simplify this based on - // the bytes we are demanding. Only do this if the source and dest are an - // even multiple of a byte. - if ((DestBitWidth & 7) == 0 && - (cast<IntegerType>(V->getType())->getBitWidth() & 7) == 0) - if (Constant *Res = ExtractConstantBytes(V, 0, DestBitWidth / 8)) - return Res; - - return 0; - } - case Instruction::BitCast: - return FoldBitCast(V, DestTy); - } -} - -Constant *llvm::ConstantFoldSelectInstruction(Constant *Cond, - Constant *V1, Constant *V2) { - // Check for i1 and vector true/false conditions. - if (Cond->isNullValue()) return V2; - if (Cond->isAllOnesValue()) return V1; - - // If the condition is a vector constant, fold the result elementwise. - if (ConstantVector *CondV = dyn_cast<ConstantVector>(Cond)) { - SmallVector<Constant*, 16> Result; - Type *Ty = IntegerType::get(CondV->getContext(), 32); - for (unsigned i = 0, e = V1->getType()->getVectorNumElements(); i != e;++i){ - ConstantInt *Cond = dyn_cast<ConstantInt>(CondV->getOperand(i)); - if (Cond == 0) break; - - Constant *V = Cond->isNullValue() ? V2 : V1; - Constant *Res = ConstantExpr::getExtractElement(V, ConstantInt::get(Ty, i)); - Result.push_back(Res); - } - - // If we were able to build the vector, return it. - if (Result.size() == V1->getType()->getVectorNumElements()) - return ConstantVector::get(Result); - } - - if (isa<UndefValue>(Cond)) { - if (isa<UndefValue>(V1)) return V1; - return V2; - } - if (isa<UndefValue>(V1)) return V2; - if (isa<UndefValue>(V2)) return V1; - if (V1 == V2) return V1; - - if (ConstantExpr *TrueVal = dyn_cast<ConstantExpr>(V1)) { - if (TrueVal->getOpcode() == Instruction::Select) - if (TrueVal->getOperand(0) == Cond) - return ConstantExpr::getSelect(Cond, TrueVal->getOperand(1), V2); - } - if (ConstantExpr *FalseVal = dyn_cast<ConstantExpr>(V2)) { - if (FalseVal->getOpcode() == Instruction::Select) - if (FalseVal->getOperand(0) == Cond) - return ConstantExpr::getSelect(Cond, V1, FalseVal->getOperand(2)); - } - - return 0; -} - -Constant *llvm::ConstantFoldExtractElementInstruction(Constant *Val, - Constant *Idx) { - if (isa<UndefValue>(Val)) // ee(undef, x) -> undef - return UndefValue::get(Val->getType()->getVectorElementType()); - if (Val->isNullValue()) // ee(zero, x) -> zero - return Constant::getNullValue(Val->getType()->getVectorElementType()); - // ee({w,x,y,z}, undef) -> undef - if (isa<UndefValue>(Idx)) - return UndefValue::get(Val->getType()->getVectorElementType()); - - if (ConstantInt *CIdx = dyn_cast<ConstantInt>(Idx)) { - uint64_t Index = CIdx->getZExtValue(); - // ee({w,x,y,z}, wrong_value) -> undef - if (Index >= Val->getType()->getVectorNumElements()) - return UndefValue::get(Val->getType()->getVectorElementType()); - return Val->getAggregateElement(Index); - } - return 0; -} - -Constant *llvm::ConstantFoldInsertElementInstruction(Constant *Val, - Constant *Elt, - Constant *Idx) { - ConstantInt *CIdx = dyn_cast<ConstantInt>(Idx); - if (!CIdx) return 0; - const APInt &IdxVal = CIdx->getValue(); - - SmallVector<Constant*, 16> Result; - Type *Ty = IntegerType::get(Val->getContext(), 32); - for (unsigned i = 0, e = Val->getType()->getVectorNumElements(); i != e; ++i){ - if (i == IdxVal) { - Result.push_back(Elt); - continue; - } - - Constant *C = - ConstantExpr::getExtractElement(Val, ConstantInt::get(Ty, i)); - Result.push_back(C); - } - - return ConstantVector::get(Result); -} - -Constant *llvm::ConstantFoldShuffleVectorInstruction(Constant *V1, - Constant *V2, - Constant *Mask) { - unsigned MaskNumElts = Mask->getType()->getVectorNumElements(); - Type *EltTy = V1->getType()->getVectorElementType(); - - // Undefined shuffle mask -> undefined value. - if (isa<UndefValue>(Mask)) - return UndefValue::get(VectorType::get(EltTy, MaskNumElts)); - - // Don't break the bitcode reader hack. - if (isa<ConstantExpr>(Mask)) return 0; - - unsigned SrcNumElts = V1->getType()->getVectorNumElements(); - - // Loop over the shuffle mask, evaluating each element. - SmallVector<Constant*, 32> Result; - for (unsigned i = 0; i != MaskNumElts; ++i) { - int Elt = ShuffleVectorInst::getMaskValue(Mask, i); - if (Elt == -1) { - Result.push_back(UndefValue::get(EltTy)); - continue; - } - Constant *InElt; - if (unsigned(Elt) >= SrcNumElts*2) - InElt = UndefValue::get(EltTy); - else if (unsigned(Elt) >= SrcNumElts) { - Type *Ty = IntegerType::get(V2->getContext(), 32); - InElt = - ConstantExpr::getExtractElement(V2, - ConstantInt::get(Ty, Elt - SrcNumElts)); - } else { - Type *Ty = IntegerType::get(V1->getContext(), 32); - InElt = ConstantExpr::getExtractElement(V1, ConstantInt::get(Ty, Elt)); - } - Result.push_back(InElt); - } - - return ConstantVector::get(Result); -} - -Constant *llvm::ConstantFoldExtractValueInstruction(Constant *Agg, - ArrayRef<unsigned> Idxs) { - // Base case: no indices, so return the entire value. - if (Idxs.empty()) - return Agg; - - if (Constant *C = Agg->getAggregateElement(Idxs[0])) - return ConstantFoldExtractValueInstruction(C, Idxs.slice(1)); - - return 0; -} - -Constant *llvm::ConstantFoldInsertValueInstruction(Constant *Agg, - Constant *Val, - ArrayRef<unsigned> Idxs) { - // Base case: no indices, so replace the entire value. - if (Idxs.empty()) - return Val; - - unsigned NumElts; - if (StructType *ST = dyn_cast<StructType>(Agg->getType())) - NumElts = ST->getNumElements(); - else if (ArrayType *AT = dyn_cast<ArrayType>(Agg->getType())) - NumElts = AT->getNumElements(); - else - NumElts = AT->getVectorNumElements(); - - SmallVector<Constant*, 32> Result; - for (unsigned i = 0; i != NumElts; ++i) { - Constant *C = Agg->getAggregateElement(i); - if (C == 0) return 0; - - if (Idxs[0] == i) - C = ConstantFoldInsertValueInstruction(C, Val, Idxs.slice(1)); - - Result.push_back(C); - } - - if (StructType *ST = dyn_cast<StructType>(Agg->getType())) - return ConstantStruct::get(ST, Result); - if (ArrayType *AT = dyn_cast<ArrayType>(Agg->getType())) - return ConstantArray::get(AT, Result); - return ConstantVector::get(Result); -} - - -Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode, - Constant *C1, Constant *C2) { - // Handle UndefValue up front. - if (isa<UndefValue>(C1) || isa<UndefValue>(C2)) { - switch (Opcode) { - case Instruction::Xor: - if (isa<UndefValue>(C1) && isa<UndefValue>(C2)) - |