1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

PR7959: Handle negative scales in GEPs correctly in BasicAA for non-64-bit

targets.

llvm-svn: 114015
This commit is contained in:
Eli Friedman 2010-09-15 20:08:03 +00:00
parent c85818a952
commit b5aea103fc
2 changed files with 18 additions and 3 deletions

View File

@ -386,8 +386,8 @@ DecomposeGEPExpression(const Value *V, int64_t &BaseOffs,
// The GEP index scale ("Scale") scales C1*V+C2, yielding (C1*V+C2)*Scale.
// This gives us an aggregate computation of (C1*Scale)*V + C2*Scale.
BaseOffs += IndexOffset.getZExtValue()*Scale;
Scale *= IndexScale.getZExtValue();
BaseOffs += IndexOffset.getSExtValue()*Scale;
Scale *= IndexScale.getSExtValue();
// If we already had an occurrance of this index variable, merge this
@ -407,7 +407,7 @@ DecomposeGEPExpression(const Value *V, int64_t &BaseOffs,
// pointer size.
if (unsigned ShiftBits = 64-TD->getPointerSizeInBits()) {
Scale <<= ShiftBits;
Scale >>= ShiftBits;
Scale = (int64_t)Scale >> ShiftBits;
}
if (Scale) {

View File

@ -0,0 +1,15 @@
; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output |& grep {1 may alias}
; PR7959
target datalayout = "e-p:32:32:32"
define i32 @test(i32* %tab, i32 %indvar) nounwind {
%tmp31 = mul i32 %indvar, -2
%tmp32 = add i32 %tmp31, 30
%t.5 = getelementptr i32* %tab, i32 %tmp32
%loada = load i32* %tab
store i32 0, i32* %t.5
%loadb = load i32* %tab
%rval = add i32 %loada, %loadb
ret i32 %rval
}