[PATCH] D137958: [LAA] Use cross-iteration alias analysis

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 14 09:03:07 PST 2022


nikic created this revision.
nikic added reviewers: reames, fhahn, asbirlea, craig.topper.
Herald added subscribers: jeroen.dobbelaere, StephenFan, hiraditya.
Herald added a project: All.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

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.

Depends on D137955 <https://reviews.llvm.org/D137955>.


https://reviews.llvm.org/D137958

Files:
  llvm/include/llvm/Analysis/AliasAnalysis.h
  llvm/lib/Analysis/LoopAccessAnalysis.cpp
  llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll


Index: llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll
===================================================================
--- /dev/null
+++ llvm/test/Analysis/LoopAccessAnalysis/select-dependence.ll
@@ -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
+}
Index: llvm/lib/Analysis/LoopAccessAnalysis.cpp
===================================================================
--- llvm/lib/Analysis/LoopAccessAnalysis.cpp
+++ llvm/lib/Analysis/LoopAccessAnalysis.cpp
@@ -622,7 +622,10 @@
   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) {
Index: llvm/include/llvm/Analysis/AliasAnalysis.h
===================================================================
--- llvm/include/llvm/Analysis/AliasAnalysis.h
+++ llvm/include/llvm/Analysis/AliasAnalysis.h
@@ -651,6 +651,11 @@
                                 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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137958.475159.patch
Type: text/x-patch
Size: 2568 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221114/3f6337b5/attachment.bin>


More information about the llvm-commits mailing list