diff options
-rw-r--r-- | lib/Analysis/BasicAliasAnalysis.cpp | 11 | ||||
-rw-r--r-- | test/Analysis/BasicAA/gep-alias.ll | 15 |
2 files changed, 25 insertions, 1 deletions
diff --git a/lib/Analysis/BasicAliasAnalysis.cpp b/lib/Analysis/BasicAliasAnalysis.cpp index c038b20705..e10e1f2d4c 100644 --- a/lib/Analysis/BasicAliasAnalysis.cpp +++ b/lib/Analysis/BasicAliasAnalysis.cpp @@ -400,7 +400,16 @@ static Value *GetLinearExpression(Value *V, APInt &Scale, APInt &Offset, V = GetLinearExpression(BOp->getOperand(0), Scale, Offset, TD); Offset += RHSC->getValue(); return V; - // TODO: SHL, MUL. + case Instruction::Mul: + V = GetLinearExpression(BOp->getOperand(0), Scale, Offset, TD); + Offset *= RHSC->getValue(); + Scale *= RHSC->getValue(); + return V; + case Instruction::Shl: + V = GetLinearExpression(BOp->getOperand(0), Scale, Offset, TD); + Offset <<= RHSC->getValue().getLimitedValue(); + Scale <<= RHSC->getValue().getLimitedValue(); + return V; } } } diff --git a/test/Analysis/BasicAA/gep-alias.ll b/test/Analysis/BasicAA/gep-alias.ll index 320c9907d5..68722fbfd0 100644 --- a/test/Analysis/BasicAA/gep-alias.ll +++ b/test/Analysis/BasicAA/gep-alias.ll @@ -101,3 +101,18 @@ define i32 @test6(i32* %p, i64 %i1) { ; CHECK: ret i32 0 } +; P[1] != P[i*4] +define i32 @test7(i32* %p, i64 %i) { + %pi = getelementptr i32* %p, i64 1 + %i.next = shl i64 %i, 2 + %pi.next = getelementptr i32* %p, i64 %i.next + %x = load i32* %pi + store i32 42, i32* %pi.next + %y = load i32* %pi + %z = sub i32 %x, %y + ret i32 %z +; CHECK: @test7 +; CHECK: ret i32 0 +} + + |