<div dir="ltr">Hi Hal,<div><br></div><div>I've reverted this in 218944 to get the bots green again. I'm still working on a reduced test case, but I expect to have something for you tomorrow.</div><div><br></div><div>Cheers,</div><div>Lang.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Sep 30, 2014 at 3:43 PM, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: hfinkel<br>
Date: Tue Sep 30 17:43:40 2014<br>
New Revision: 218714<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=218714&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=218714&view=rev</a><br>
Log:<br>
[BasicAA] Make better use of zext and sign information<br>
<br>
Two related things:<br>
<br>
 1. Fixes a bug when calculating the offset in GetLinearExpression. The code<br>
    previously used zext to extend the offset, so negative offsets were converted<br>
    to large positive ones.<br>
<br>
 2. Enhance aliasGEP to deduce that, if the difference between two GEP<br>
    allocations is positive and all the variables that govern the offset are also<br>
    positive (i.e. the offset is strictly after the higher base pointer), then<br>
    locations that fit in the gap between the two base pointers are NoAlias.<br>
<br>
Patch by Nick White!<br>
<br>
Added:<br>
    llvm/trunk/test/Analysis/BasicAA/zext.ll<br>
Modified:<br>
    llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp<br>
    llvm/trunk/test/Analysis/BasicAA/phi-aa.ll<br>
<br>
Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=218714&r1=218713&r2=218714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=218714&r1=218713&r2=218714&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Tue Sep 30 17:43:40 2014<br>
@@ -254,7 +254,10 @@ static Value *GetLinearExpression(Value<br>
     Value *Result = GetLinearExpression(CastOp, Scale, Offset, Extension,<br>
                                         DL, Depth+1, AT, DT);<br>
     Scale = Scale.zext(OldWidth);<br>
-    Offset = Offset.zext(OldWidth);<br>
+<br>
+    // We have to sign-extend even if Extension == EK_ZeroExt as we can't<br>
+    // decompose a sign extension (i.e. zext(x - 1) != zext(x) - zext(-1)).<br>
+    Offset = Offset.sext(OldWidth);<br>
<br>
     return Result;<br>
   }<br>
@@ -1055,8 +1058,26 @@ BasicAliasAnalysis::aliasGEP(const GEPOp<br>
   // Grab the least significant bit set in any of the scales.<br>
   if (!GEP1VariableIndices.empty()) {<br>
     uint64_t Modulo = 0;<br>
-    for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i)<br>
+    bool AllPositive = true;<br>
+    for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i) {<br>
+      const Value *V = GEP1VariableIndices[i].V;<br>
       Modulo |= (uint64_t)GEP1VariableIndices[i].Scale;<br>
+<br>
+      // If the variable's been zero-extended or begins with a zero then<br>
+      //  we know it's positive. regardless of whether the value is signed<br>
+      // or unsigned.<br>
+      bool SignKnownZero, SignKnownOne;<br>
+      ComputeSignBit(<br>
+        const_cast<Value *>(V),<br>
+        SignKnownZero, SignKnownOne,<br>
+        DL, 0, AT, nullptr, DT);<br>
+      bool IsZExt = GEP1VariableIndices[i].Extension == EK_ZeroExt;<br>
+      AllPositive &= IsZExt || SignKnownZero;<br>
+<br>
+      // If the Value is currently positive but could change in a cycle,<br>
+      // then we can't guarantee it'll always br positive.<br>
+      AllPositive &= isValueEqualInPotentialCycles(V, V);<br>
+    }<br>
     Modulo = Modulo ^ (Modulo & (Modulo - 1));<br>
<br>
     // We can compute the difference between the two addresses<br>
@@ -1066,6 +1087,12 @@ BasicAliasAnalysis::aliasGEP(const GEPOp<br>
     if (V1Size != UnknownSize && V2Size != UnknownSize &&<br>
         ModOffset >= V2Size && V1Size <= Modulo - ModOffset)<br>
       return NoAlias;<br>
+<br>
+    // If we know all the variables are positive, then GEP1 >= GEP1BasePtr.<br>
+    // If GEP1BasePtr > V2 (GEP1BaseOffset > 0) then we know the pointers<br>
+    // don't alias if V2Size can fit in the gap between V2 and GEP1BasePtr.<br>
+    if (AllPositive && GEP1BaseOffset > 0 && V2Size <= (uint64_t) GEP1BaseOffset)<br>
+      return NoAlias;<br>
   }<br>
<br>
   // Statically, we can see that the base objects are the same, but the<br>
<br>
Modified: llvm/trunk/test/Analysis/BasicAA/phi-aa.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/phi-aa.ll?rev=218714&r1=218713&r2=218714&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/phi-aa.ll?rev=218714&r1=218713&r2=218714&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/BasicAA/phi-aa.ll (original)<br>
+++ llvm/trunk/test/Analysis/BasicAA/phi-aa.ll Tue Sep 30 17:43:40 2014<br>
@@ -39,6 +39,7 @@ return:<br>
<br>
 ; CHECK-LABEL: pr18068<br>
 ; CHECK: MayAlias: i32* %0, i32* %arrayidx5<br>
+; CHECK: NoAlias: i32* %arrayidx13, i32* %arrayidx5<br>
<br>
 define i32 @pr18068(i32* %jj7, i32* %j) {<br>
 entry:<br>
<br>
Added: llvm/trunk/test/Analysis/BasicAA/zext.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/zext.ll?rev=218714&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/zext.ll?rev=218714&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/BasicAA/zext.ll (added)<br>
+++ llvm/trunk/test/Analysis/BasicAA/zext.ll Tue Sep 30 17:43:40 2014<br>
@@ -0,0 +1,65 @@<br>
+; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s<br>
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"<br>
+target triple = "x86_64-unknown-linux-gnu"<br>
+<br>
+; CHECK-LABEL: test_with_zext<br>
+; CHECK:  NoAlias: i8* %a, i8* %b<br>
+<br>
+define void @test_with_zext() {<br>
+  %1 = tail call i8* @malloc(i64 120)<br>
+  %a = getelementptr inbounds i8* %1, i64 8<br>
+  %2 = getelementptr inbounds i8* %1, i64 16<br>
+  %3 = zext i32 3 to i64<br>
+  %b = getelementptr inbounds i8* %2, i64 %3<br>
+  ret void<br>
+}<br>
+<br>
+; CHECK-LABEL: test_with_lshr<br>
+; CHECK:  NoAlias: i8* %a, i8* %b<br>
+<br>
+define void @test_with_lshr(i64 %i) {<br>
+  %1 = tail call i8* @malloc(i64 120)<br>
+  %a = getelementptr inbounds i8* %1, i64 8<br>
+  %2 = getelementptr inbounds i8* %1, i64 16<br>
+  %3 = lshr i64 %i, 2<br>
+  %b = getelementptr inbounds i8* %2, i64 %3<br>
+  ret void<br>
+}<br>
+<br>
+; CHECK-LABEL: test_with_a_loop<br>
+; CHECK:  NoAlias: i8* %a, i8* %b<br>
+<br>
+define void @test_with_a_loop() {<br>
+  %1 = tail call i8* @malloc(i64 120)<br>
+  %a = getelementptr inbounds i8* %1, i64 8<br>
+  %2 = getelementptr inbounds i8* %1, i64 16<br>
+  br label %for.loop<br>
+<br>
+for.loop:<br>
+  %i = phi i32 [ 0, %0 ], [ %i.next, %for.loop ]<br>
+  %3 = zext i32 %i to i64<br>
+  %b = getelementptr inbounds i8* %2, i64 %3<br>
+  %i.next = add nuw nsw i32 %i, 1<br>
+  %4 = icmp eq i32 %i.next, 10<br>
+  br i1 %4, label %for.loop.exit, label %for.loop<br>
+<br>
+for.loop.exit:<br>
+  ret void<br>
+}<br>
+<br>
+; CHECK-LABEL: test_sign_extension<br>
+; CHECK:  PartialAlias: i64* %b.i64, i8* %a<br>
+<br>
+define void @test_sign_extension(i32 %p) {<br>
+  %1 = tail call i8* @malloc(i64 120)<br>
+  %p.64 = zext i32 %p to i64<br>
+  %a = getelementptr inbounds i8* %1, i64 %p.64<br>
+  %p.minus1 = add i32 %p, -1<br>
+  %p.minus1.64 = zext i32 %p.minus1 to i64<br>
+  %b.i8 = getelementptr inbounds i8* %1, i64 %p.minus1.64<br>
+  %b.i64 = bitcast i8* %b.i8 to i64*<br>
+  ret void<br>
+}<br>
+<br>
+; Function Attrs: nounwind<br>
+declare noalias i8* @malloc(i64)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>