diff options
author | Reid Spencer <rspencer@reidspencer.com> | 2006-12-04 02:46:44 +0000 |
---|---|---|
committer | Reid Spencer <rspencer@reidspencer.com> | 2006-12-04 02:46:44 +0000 |
commit | 575d95ce373f1e405e6c27ce8d9f244bba3bdd0d (patch) | |
tree | 7dbef38ce90d354f1eebb43931b7ecc2d12cf74e /lib/VMCore/ConstantFold.cpp | |
parent | 56667123b7f6d6dda8b4dc178c8be4192299ae6e (diff) |
Change inferred casts to explicit casts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32165 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/ConstantFold.cpp')
-rw-r--r-- | lib/VMCore/ConstantFold.cpp | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/lib/VMCore/ConstantFold.cpp b/lib/VMCore/ConstantFold.cpp index 49bdca2c5e..ef929d7315 100644 --- a/lib/VMCore/ConstantFold.cpp +++ b/lib/VMCore/ConstantFold.cpp @@ -777,7 +777,8 @@ static Constant *CastConstantPacked(ConstantPacked *CP, uint64_t V = DoubleToBits(cast<ConstantFP>(CP->getOperand(i))->getValue()); Constant *C = ConstantInt::get(Type::ULongTy, V); - Result.push_back(ConstantExpr::getCast(C, DstEltTy)); + Result.push_back( + ConstantExpr::getInferredCast(C, false, DstEltTy, false)); } return ConstantPacked::get(Result); } @@ -786,7 +787,8 @@ static Constant *CastConstantPacked(ConstantPacked *CP, for (unsigned i = 0; i != SrcNumElts; ++i) { uint32_t V = FloatToBits(cast<ConstantFP>(CP->getOperand(i))->getValue()); Constant *C = ConstantInt::get(Type::UIntTy, V); - Result.push_back(ConstantExpr::getCast(C, DstEltTy)); + Result.push_back( + ConstantExpr::getInferredCast(C, false, DstEltTy, false)); } return ConstantPacked::get(Result); } @@ -839,8 +841,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, // do to try to simplify it. if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { if (CE->isCast()) { - // Try hard to fold cast of cast because they are almost always - // eliminable. + // 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) { @@ -853,6 +854,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V, break; } if (isAllNull) + // This is casting one pointer type to another, always BitCast return ConstantExpr::getCast(CE->getOperand(0), DestTy); } } @@ -1632,9 +1634,13 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, // gep null, C is equal to C*sizeof(nullty). If nullty is a known llvm // type, we can statically fold this. Constant *R = ConstantInt::get(Type::UIntTy, ElSize); - R = ConstantExpr::getCast(R, Idx0->getType()); - R = ConstantExpr::getMul(R, Idx0); - return ConstantExpr::getCast(R, C->getType()); + // We know R is unsigned, Idx0 is signed because it must be an index + // through a sequential type (gep pointer operand) which is always + // signed. + R = ConstantExpr::getInferredCast(R, false, Idx0->getType(), true); + R = ConstantExpr::getMul(R, Idx0); // signed multiply + // R is a signed integer, C is the GEP pointer so -> IntToPtr + return ConstantExpr::getCast(Instruction::IntToPtr, R, C->getType()); } } } @@ -1662,11 +1668,16 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C, // Otherwise it must be an array. if (!Idx0->isNullValue()) { const Type *IdxTy = Combined->getType(); - if (IdxTy != Idx0->getType()) IdxTy = Type::LongTy; - Combined = - ConstantExpr::get(Instruction::Add, - ConstantExpr::getCast(Idx0, IdxTy), - ConstantExpr::getCast(Combined, IdxTy)); + if (IdxTy != Idx0->getType()) { + Constant *C1 = ConstantExpr::getInferredCast( + Idx0, true, Type::LongTy, true); + Constant *C2 = ConstantExpr::getInferredCast( + Combined, true, Type::LongTy, true); + Combined = ConstantExpr::get(Instruction::Add, C1, C2); + } else { + Combined = + ConstantExpr::get(Instruction::Add, Idx0, Combined); + } } NewIndices.push_back(Combined); |