[LAA] Use cross-iteration alias analysis
authorNikita Popov <npopov@redhat.com>
Mon, 14 Nov 2022 15:13:51 +0000 (16:13 +0100)
committerNikita Popov <npopov@redhat.com>
Mon, 5 Dec 2022 08:27:13 +0000 (09:27 +0100)
LAA analyzes cross-iteration memory dependencies, as such AA should
not make assumptions about equality of values inside the loop, as
they may come from different iterations.

Fix this by exposing the MayBeCrossIteration AA flag and enabling
it for LAA.

Differential Revision: https://reviews.llvm.org/D137958

llvm/include/llvm/Analysis/AliasAnalysis.h
llvm/lib/Analysis/LoopAccessAnalysis.cpp
llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll [new file with mode: 0644]

index c50cb2d..99d10cb 100644 (file)
@@ -651,6 +651,11 @@ public:
                                 DominatorTree *DT) {
     return AA.callCapturesBefore(I, MemLoc, DT, AAQI);
   }
+
+  /// Assume that values may come from different cycle iterations.
+  void enableCrossIterationMode() {
+    AAQI.MayBeCrossIteration = true;
+  }
 };
 
 /// Temporary typedef for legacy code that uses a generic \c AliasAnalysis
index 1bc2f6b..4e68856 100644 (file)
@@ -622,7 +622,10 @@ public:
   AccessAnalysis(Loop *TheLoop, AAResults *AA, LoopInfo *LI,
                  MemoryDepChecker::DepCandidates &DA,
                  PredicatedScalarEvolution &PSE)
-      : TheLoop(TheLoop), BAA(*AA), AST(BAA), LI(LI), DepCands(DA), PSE(PSE) {}
+      : TheLoop(TheLoop), BAA(*AA), AST(BAA), LI(LI), DepCands(DA), PSE(PSE) {
+    // We're analyzing dependences across loop iterations.
+    BAA.enableCrossIterationMode();
+  }
 
   /// Register a load  and whether it is only read from.
   void addLoad(MemoryLocation &Loc, Type *AccessTy, bool IsReadOnly) {
diff --git a/llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll b/llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll
new file mode 100644 (file)
index 0000000..07e32f4
--- /dev/null
@@ -0,0 +1,30 @@
+; RUN: opt -passes='print<access-info>' -disable-output 2>&1 < %s | FileCheck %s
+
+; CHECK: Dependences:
+; CHECK-NEXT: Unknown:
+; CHECK-NEXT: %t63 = load double, ptr %t62, align 8 ->
+; CHECK-NEXT: store double %t63, ptr %t64, align 8
+
+define i32 @test() {
+   %a1 = alloca [128 x double], align 8
+   %a2 = alloca [128 x double], align 8
+   %a3 = alloca [128 x double], align 8
+   %t30 = getelementptr double, ptr %a2, i64 -32
+   br label %loop
+
+loop:
+   %t58 = phi i64 [ %t65, %loop ], [ 0, %0 ]
+   %t59 = icmp ule i64 %t58, 32
+   %t60 = select i1 %t59, ptr %a1, ptr %t30
+   %t62 = getelementptr inbounds double, ptr %t60, i64 %t58
+   %t63 = load double, ptr %t62, align 8
+   %t61 = select i1 %t59, ptr %a2, ptr %a3
+   %t64 = getelementptr inbounds double, ptr %t61, i64 %t58
+   store double %t63, ptr %t64, align 8
+   %t65 = add nuw nsw i64 %t58, 1
+   %t66 = icmp eq i64 %t65, 94
+   br i1 %t66, label %exit, label %loop
+
+exit:
+   ret i32 0
+}