diff options
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 4d2f81e..70f81f6 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -457,10 +457,13 @@ static LinearExpression GetLinearExpression( /// an issue, for example, in particular for 32b pointers with negative indices /// that rely on two's complement wrap-arounds for precise alias information /// where the maximum index size is 64b. -static APInt adjustToIndexSize(const APInt &Offset, unsigned IndexSize) { +static void adjustToIndexSize(APInt &Offset, unsigned IndexSize) { assert(IndexSize <= Offset.getBitWidth() && "Invalid IndexSize!"); unsigned ShiftBits = Offset.getBitWidth() - IndexSize; - return (Offset << ShiftBits).ashr(ShiftBits); + if (ShiftBits != 0) { + Offset <<= ShiftBits; + Offset.ashrInPlace(ShiftBits); + } } namespace { @@ -685,7 +688,7 @@ BasicAAResult::DecomposeGEPExpression(const Value *V, const DataLayout &DL, // Make sure that we have a scale that makes sense for this target's // index size. - Scale = adjustToIndexSize(Scale, IndexSize); + adjustToIndexSize(Scale, IndexSize); if (!!Scale) { VariableGEPIndex Entry = {LE.Val, Scale, CxtI, LE.IsNSW, @@ -696,7 +699,7 @@ BasicAAResult::DecomposeGEPExpression(const Value *V, const DataLayout &DL, // Take care of wrap-arounds if (GepHasConstantOffset) - Decomposed.Offset = adjustToIndexSize(Decomposed.Offset, IndexSize); + adjustToIndexSize(Decomposed.Offset, IndexSize); // Analyze the base pointer next. V = GEPOp->getOperand(0); |