Changes in directory llvm/lib/VMCore:
ConstantFolding.cpp updated: 1.105 -> 1.106 --- Log message: Change inferred casts to explicit casts. --- Diffs of the changes: (+23 -12) ConstantFolding.cpp | 35 +++++++++++++++++++++++------------ 1 files changed, 23 insertions(+), 12 deletions(-) Index: llvm/lib/VMCore/ConstantFolding.cpp diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.105 llvm/lib/VMCore/ConstantFolding.cpp:1.106 --- llvm/lib/VMCore/ConstantFolding.cpp:1.105 Fri Dec 1 13:50:54 2006 +++ llvm/lib/VMCore/ConstantFolding.cpp Sun Dec 3 20:45:43 2006 @@ -777,7 +777,8 @@ 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 @@ 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 @@ // 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 @@ break; } if (isAllNull) + // This is casting one pointer type to another, always BitCast return ConstantExpr::getCast(CE->getOperand(0), DestTy); } } @@ -1632,9 +1634,13 @@ // 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 @@ // 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); _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits