When lowering an inbounds gep, the intermediate adds can have

unsigned overflow (e.g. due to a negative array index), but
the scales on array size multiplications are known to not
sign wrap.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@125409 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2011-02-11 21:37:43 +00:00
parent 84cb033bf3
commit 6aa68a7647

View File

@@ -420,8 +420,7 @@ Value *InstCombiner::EmitGEPOffset(User *GEP) {
if (Size) if (Size)
Result = Builder->CreateAdd(Result, ConstantInt::get(IntPtrTy, Size), Result = Builder->CreateAdd(Result, ConstantInt::get(IntPtrTy, Size),
GEP->getName()+".offs", GEP->getName()+".offs");
isInBounds /*NUW*/);
continue; continue;
} }
@@ -430,8 +429,7 @@ Value *InstCombiner::EmitGEPOffset(User *GEP) {
ConstantExpr::getIntegerCast(OpC, IntPtrTy, true /*SExt*/); ConstantExpr::getIntegerCast(OpC, IntPtrTy, true /*SExt*/);
Scale = ConstantExpr::getMul(OC, Scale, isInBounds/*NUW*/); Scale = ConstantExpr::getMul(OC, Scale, isInBounds/*NUW*/);
// Emit an add instruction. // Emit an add instruction.
Result = Builder->CreateAdd(Result, Scale, GEP->getName()+".offs", Result = Builder->CreateAdd(Result, Scale, GEP->getName()+".offs");
isInBounds /*NUW*/);
continue; continue;
} }
// Convert to correct type. // Convert to correct type.
@@ -444,8 +442,7 @@ Value *InstCombiner::EmitGEPOffset(User *GEP) {
} }
// Emit an add instruction. // Emit an add instruction.
Result = Builder->CreateAdd(Op, Result, GEP->getName()+".offs", Result = Builder->CreateAdd(Op, Result, GEP->getName()+".offs");
isInBounds /*NUW*/);
} }
return Result; return Result;
} }