diff options
Diffstat (limited to 'llvm/lib/Analysis/ConstantFolding.cpp')
-rw-r--r-- | llvm/lib/Analysis/ConstantFolding.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ConstantFolding.cpp b/llvm/lib/Analysis/ConstantFolding.cpp index d645bf8..b0ba25c 100644 --- a/llvm/lib/Analysis/ConstantFolding.cpp +++ b/llvm/lib/Analysis/ConstantFolding.cpp @@ -943,18 +943,21 @@ Constant *SymbolicallyEvaluateGEP(const GEPOperator *GEP, // If the base value for this address is a literal integer value, fold the // getelementptr to the resulting integer value casted to the pointer type. - APInt BasePtr(BitWidth, 0); + APInt BasePtr(DL.getPointerTypeSizeInBits(Ptr->getType()), 0); if (auto *CE = dyn_cast<ConstantExpr>(Ptr)) { if (CE->getOpcode() == Instruction::IntToPtr) { if (auto *Base = dyn_cast<ConstantInt>(CE->getOperand(0))) - BasePtr = Base->getValue().zextOrTrunc(BitWidth); + BasePtr = Base->getValue().zextOrTrunc(BasePtr.getBitWidth()); } } auto *PTy = cast<PointerType>(Ptr->getType()); if ((Ptr->isNullValue() || BasePtr != 0) && !DL.isNonIntegralPointerType(PTy)) { - Constant *C = ConstantInt::get(Ptr->getContext(), Offset + BasePtr); + // If the index size is smaller than the pointer size, add to the low + // bits only. + BasePtr.insertBits(BasePtr.trunc(BitWidth) + Offset, 0); + Constant *C = ConstantInt::get(Ptr->getContext(), BasePtr); return ConstantExpr::getIntToPtr(C, ResTy); } |