diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-08-11 18:28:09 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-08-11 18:28:09 +0000 |
commit | ff297a8eeb39e43729faef7567be4d96483f694d (patch) | |
tree | 142a74bd5f7125b0d966361ecd1eb2a096699844 /lib/VMCore/Constants.cpp | |
parent | 6d2667ac9276f116d4e3e5dfbb822bab8b000f74 (diff) | |
download | external_llvm-ff297a8eeb39e43729faef7567be4d96483f694d.zip external_llvm-ff297a8eeb39e43729faef7567be4d96483f694d.tar.gz external_llvm-ff297a8eeb39e43729faef7567be4d96483f694d.tar.bz2 |
Simplify ConstantExpr::getInBoundsGetElementPtr and fix a possible crash, if
constant folding eliminated the GEP instruction.
- clang was hitting this on its test suite (for x86_64, at least).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78698 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore/Constants.cpp')
-rw-r--r-- | lib/VMCore/Constants.cpp | 13 |
1 files changed, 5 insertions, 8 deletions
diff --git a/lib/VMCore/Constants.cpp b/lib/VMCore/Constants.cpp index 89578fb..70d4357 100644 --- a/lib/VMCore/Constants.cpp +++ b/lib/VMCore/Constants.cpp @@ -1442,14 +1442,11 @@ Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs, Constant *ConstantExpr::getInBoundsGetElementPtr(Constant *C, Value* const *Idxs, unsigned NumIdx) { - // Get the result type of the getelementptr! - const Type *Ty = - GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx); - assert(Ty && "GEP indices invalid!"); - unsigned As = cast<PointerType>(C->getType())->getAddressSpace(); - Constant *Result = getGetElementPtrTy(PointerType::get(Ty, As), C, - Idxs, NumIdx); - cast<GEPOperator>(Result)->setIsInBounds(true); + Constant *Result = getGetElementPtr(C, Idxs, NumIdx); + // Set in bounds attribute, assuming constant folding didn't eliminate the + // GEP. + if (GEPOperator *GEP = dyn_cast<GEPOperator>(Result)) + GEP->setIsInBounds(true); return Result; } |