]> granicus.if.org Git - llvm/commitdiff
[LICM] Kill SCEV loop dispositions if needed
authorSanjoy Das <sanjoy@playingwithpointers.com>
Tue, 3 May 2016 17:50:11 +0000 (17:50 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Tue, 3 May 2016 17:50:11 +0000 (17:50 +0000)
SCEV caches whether SCEV expressions are loop invariant, variant or
computable.  LICM breaks this cache, almost by definition; so clear the
SCEV disposition cache if LICM changed anything.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268408 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/LICM.cpp
test/Transforms/LICM/update-scev.ll [new file with mode: 0644]

index 72f04165e662dc2a0d45554e43c38d7e7053e934..e6ad42bb4c38472bb5893e2a38ee6aa5ec7d0bf4 100644 (file)
@@ -258,6 +258,10 @@ bool LICM::runOnLoop(Loop *L, LPPassManager &LPM) {
     LoopToAliasSetMap[L] = CurAST;
   else
     delete CurAST;
+
+  if (Changed)
+    if (auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>())
+      SEWP->getSE().forgetLoopDispositions(L);
   return Changed;
 }
 
diff --git a/test/Transforms/LICM/update-scev.ll b/test/Transforms/LICM/update-scev.ll
new file mode 100644 (file)
index 0000000..221c124
--- /dev/null
@@ -0,0 +1,31 @@
+; RUN: opt -S -licm < %s | FileCheck %s --check-prefix=IR-AFTER-TRANSFORM
+; RUN: opt -analyze -scalar-evolution -licm -scalar-evolution < %s | FileCheck %s --check-prefix=SCEV-EXPRS
+
+declare void @clobber()
+
+define void @f_0(i1* %loc) {
+; IR-AFTER-TRANSFORM-LABEL: @f_0(
+; IR-AFTER-TRANSFORM: loop.outer:
+; IR-AFTER-TRANSFORM-NEXT:  call void @clobber()
+; IR-AFTER-TRANSFORM-NEXT:  %cond = load i1, i1* %loc
+; IR-AFTER-TRANSFORM-NEXT:  br label %loop.inner
+
+; SCEV-EXPRS: Classifying expressions for: @f_0
+; SCEV-EXPRS: Classifying expressions for: @f_0
+; SCEV-EXPRS:  %cond = load i1, i1* %loc
+; SCEV-EXPRS-NEXT:   -->  {{.*}} LoopDispositions: { %loop.outer: Variant, %loop.inner: Invariant }
+
+entry:
+  br label %loop.outer
+
+loop.outer:
+  call void @clobber()
+  br label %loop.inner
+
+loop.inner:
+  %cond = load i1, i1* %loc
+  br i1 %cond, label %loop.inner, label %leave.inner
+
+leave.inner:
+  br label %loop.outer
+}