Check not?<br><br><div class="gmail_quote"><div dir="ltr">On Tue, Jan 5, 2016, 9:53 PM Tim Shen <<a href="mailto:timshen@google.com">timshen@google.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">timshen updated this revision to Diff 44090.<br>
timshen added a comment.<br>
<br>
Yes, your test case is much simpler, thanks! :) I tweaked a bit (stride needs to be at least 2 to trigger interleave) to reveal the wrong behavior of the old opt. In such case it has to be a XFAIL, since what we hope is "interleave should not fire" - testing the correct code may be fragile.<br>
<br>
<br>
<a href="http://reviews.llvm.org/D15906" rel="noreferrer" target="_blank">http://reviews.llvm.org/D15906</a><br>
<br>
Files:<br>
  lib/Analysis/LoopAccessAnalysis.cpp<br>
  test/Analysis/LoopAccessAnalysis/interleave_innermost.ll<br>
<br>
Index: test/Analysis/LoopAccessAnalysis/interleave_innermost.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/Analysis/LoopAccessAnalysis/interleave_innermost.ll<br>
@@ -0,0 +1,31 @@<br>
+; RUN: opt -loop-vectorize -force-vector-interleave=1 -S < %s | FileCheck %s<br>
+; CHECK: %[[PTR:[^ ]+]] = extractelement <4 x i32*> %broadcast.splat{{.*}}, i32 {{[0-9]+}}<br>
+; CHECK: %[[ADJUSTED_PTR:[^ ]+]] = getelementptr i32, i32* %[[PTR]], i32 0<br>
+; CHECK: %{{[^ ]+}} = bitcast i32* %[[ADJUSTED_PTR]] to <8 x i32>*<br>
+; XFAIL: *<br>
+<br>
+target datalayout = "e-m:e-i64:64-n32:64"<br>
+target triple = "powerpc64le-unknown-linux-gnu"<br>
+<br>
+define void @TestFoo(i1 %X, i1 %Y) {<br>
+bb:<br>
+  br label %.loopexit5.outer<br>
+<br>
+.loopexit5.outer:<br>
+  br label %.lr.ph12<br>
+<br>
+.loopexit:<br>
+  br i1 %X, label %.loopexit5.outer, label %.lr.ph12<br>
+<br>
+.lr.ph12:<br>
+  %f.110 = phi i32* [ %tmp1, %.loopexit ], [ null, %.loopexit5.outer ]<br>
+  %tmp1 = getelementptr inbounds i32, i32* %f.110, i64 -2<br>
+  br i1 %Y, label %bb4, label %.loopexit<br>
+<br>
+bb4:<br>
+  %j.27 = phi i32 [ 0, %.lr.ph12 ], [ %tmp7, %bb4 ]<br>
+  %tmp5 = load i32, i32* %f.110, align 4<br>
+  %tmp7 = add nsw i32 %j.27, 1<br>
+  %exitcond = icmp eq i32 %tmp7, 0<br>
+  br i1 %exitcond, label %.loopexit, label %bb4<br>
+}<br>
Index: lib/Analysis/LoopAccessAnalysis.cpp<br>
===================================================================<br>
--- lib/Analysis/LoopAccessAnalysis.cpp<br>
+++ lib/Analysis/LoopAccessAnalysis.cpp<br>
@@ -845,6 +845,7 @@<br>
   if (Lp != AR->getLoop()) {<br>
     DEBUG(dbgs() << "LAA: Bad stride - Not striding over innermost loop " <<<br>
           *Ptr << " SCEV: " << *PtrScev << "\n");<br>
+    return 0;<br>
   }<br>
<br>
   // The address calculation must not wrap. Otherwise, a dependence could be<br>
<br>
<br>
</blockquote></div>