[LoopLoadElim] Pass ScalarEvolution in old pass manager. PR49141
authorMax Kazantsev <mkazantsev@azul.com>
Mon, 15 Feb 2021 11:06:33 +0000 (18:06 +0700)
committerMax Kazantsev <mkazantsev@azul.com>
Mon, 15 Feb 2021 11:08:23 +0000 (18:08 +0700)
Loop canonicalization may end up deleting blocks from CFG. And
Scalar Evolution may still keep cached referenced to those blocks
unless updated properly.

llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp
llvm/test/Transforms/LoopLoadElim/pr-49141.ll [new file with mode: 0644]

index 0586121..e7b5a26 100644 (file)
@@ -664,10 +664,11 @@ public:
     auto *BFI = (PSI && PSI->hasProfileSummary()) ?
                 &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI() :
                 nullptr;
+    auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
 
     // Process each loop nest in the function.
     return eliminateLoadsAcrossLoops(
-        F, LI, DT, BFI, PSI, /*SE*/ nullptr, /*AC*/ nullptr,
+        F, LI, DT, BFI, PSI, SE, /*AC*/ nullptr,
         [&LAA](Loop &L) -> const LoopAccessInfo & { return LAA.getInfo(&L); });
   }
 
diff --git a/llvm/test/Transforms/LoopLoadElim/pr-49141.ll b/llvm/test/Transforms/LoopLoadElim/pr-49141.ll
new file mode 100644 (file)
index 0000000..df7a975
--- /dev/null
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -indvars -loop-load-elim < %s 2>&1 | FileCheck %s
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @test() {
+; CHECK-LABEL: @test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    [[A_01:%.*]] = phi i16 [ undef, [[ENTRY:%.*]] ], [ [[INC:%.*]], [[FOR_BODY]] ]
+; CHECK-NEXT:    [[INC]] = add nsw i16 [[A_01]], 1
+; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i16 [[INC]], 2
+; CHECK-NEXT:    [[OR_COND:%.*]] = and i1 false, [[CMP]]
+; CHECK-NEXT:    br i1 [[OR_COND]], label [[FOR_BODY]], label [[FOR_END:%.*]]
+; CHECK:       for.end:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %for.body
+
+for.cond:                                         ; preds = %for.body
+  %a.0 = phi i16 [ %inc, %for.body ]
+  %cmp = icmp sle i16 %a.0, 2
+  br i1 %cmp, label %for.body, label %for.end
+
+for.body:                                         ; preds = %for.cond, %entry
+  %a.01 = phi i16 [ undef, %entry ], [ %a.0, %for.cond ]
+  %inc = add nsw i16 %a.01, 1
+  br i1 false, label %for.cond, label %for.end
+
+for.end:                                          ; preds = %for.body, %for.cond
+  ret void
+}