[llvm] r335036 - [LoopSimplifyCFG] Invalidate SCEV in LoopSimplifyCFG

David Green via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 19 02:43:36 PDT 2018


Author: dmgreen
Date: Tue Jun 19 02:43:36 2018
New Revision: 335036

URL: http://llvm.org/viewvc/llvm-project?rev=335036&view=rev
Log:
[LoopSimplifyCFG] Invalidate SCEV in LoopSimplifyCFG

LoopSimplifyCFG, being a loop pass, needs to preserve scalar
evolution. This invalidates SE for the loops altered during
block merging.

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


Added:
    llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=335036&r1=335035&r2=335036&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp Tue Jun 19 02:43:36 2018
@@ -37,7 +37,8 @@ using namespace llvm;
 
 #define DEBUG_TYPE "loop-simplifycfg"
 
-static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI) {
+static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI,
+                            ScalarEvolution &SE) {
   bool Changed = false;
   // Copy blocks into a temporary array to avoid iterator invalidation issues
   // as we remove them.
@@ -59,6 +60,8 @@ static bool simplifyLoopCFG(Loop &L, Dom
       L.moveToHeader(Succ);
     LI.removeBlock(Pred);
     MergeBasicBlockIntoOnlyPred(Succ, &DT);
+
+    SE.forgetLoop(&L);
     Changed = true;
   }
 
@@ -68,7 +71,7 @@ static bool simplifyLoopCFG(Loop &L, Dom
 PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM,
                                            LoopStandardAnalysisResults &AR,
                                            LPMUpdater &) {
-  if (!simplifyLoopCFG(L, AR.DT, AR.LI))
+  if (!simplifyLoopCFG(L, AR.DT, AR.LI, AR.SE))
     return PreservedAnalyses::all();
 
   return getLoopPassPreservedAnalyses();
@@ -88,7 +91,8 @@ public:
 
     DominatorTree &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
     LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
-    return simplifyLoopCFG(*L, DT, LI);
+    ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
+    return simplifyLoopCFG(*L, DT, LI, SE);
   }
 
   void getAnalysisUsage(AnalysisUsage &AU) const override {

Added: llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll?rev=335036&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll (added)
+++ llvm/trunk/test/Transforms/LoopSimplifyCFG/scev.ll Tue Jun 19 02:43:36 2018
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -loop-simplifycfg -verify-scev < %s | FileCheck %s
+
+; Verify that the scev information is still valid. Verification should not fail
+
+define void @t_run_test() {
+; CHECK-LABEL: @t_run_test(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[LOOP_PH:%.*]]
+; CHECK:       loop.ph:
+; CHECK-NEXT:    br label [[LOOP_BODY:%.*]]
+; CHECK:       loop.body:
+; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[LOOP_PH]] ], [ [[INC:%.*]], [[LOOP_BODY]] ]
+; CHECK-NEXT:    [[INC]] = add i32 [[IV]], 1
+; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[INC]], 10
+; CHECK-NEXT:    br i1 [[CMP]], label [[LOOP_BODY]], label [[EXIT:%.*]]
+; CHECK:       exit:
+; CHECK-NEXT:    br label [[LOOP_BODY2:%.*]]
+; CHECK:       loop.body2:
+; CHECK-NEXT:    [[IV2:%.*]] = phi i32 [ 0, [[EXIT]] ], [ [[INC2:%.*]], [[LOOP_BODY2]] ]
+; CHECK-NEXT:    [[INC2]] = add i32 [[IV2]], 1
+; CHECK-NEXT:    [[CMP2:%.*]] = icmp ult i32 [[INC2]], 10
+; CHECK-NEXT:    br i1 [[CMP2]], label [[LOOP_BODY2]], label [[EXIT2:%.*]]
+; CHECK:       exit2:
+; CHECK-NEXT:    ret void
+;
+entry:
+  br label %loop.ph
+
+loop.ph:
+  br label %loop.header
+
+loop.header:
+  %iv = phi i32 [0, %loop.ph], [%inc, %loop.body]
+  br label %loop.body1
+
+loop.body1:
+  br label %loop.body
+
+loop.body:
+  %inc = add i32 %iv, 1
+  %cmp = icmp ult i32 %inc, 10
+  br i1 %cmp, label %loop.header, label %exit
+
+exit:
+  br label %loop.body2
+
+loop.body2:
+  %iv2 = phi i32 [0, %exit], [%inc2, %loop.body2]
+  %inc2 = add i32 %iv2, 1
+  %cmp2 = icmp ult i32 %inc2, 10
+  br i1 %cmp2, label %loop.body2, label %exit2
+
+exit2:
+  ret void
+}
+




More information about the llvm-commits mailing list