summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp10
-rw-r--r--llvm/test/Transforms/LoopSimplifyCFG/scev.ll57
2 files changed, 64 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
index c6d037359f0..49de71e5119 100644
--- a/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopSimplifyCFG.cpp
@@ -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, DominatorTree &DT, LoopInfo &LI) {
L.moveToHeader(Succ);
LI.removeBlock(Pred);
MergeBasicBlockIntoOnlyPred(Succ, &DT);
+
+ SE.forgetLoop(&L);
Changed = true;
}
@@ -68,7 +71,7 @@ static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI) {
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 {
diff --git a/llvm/test/Transforms/LoopSimplifyCFG/scev.ll b/llvm/test/Transforms/LoopSimplifyCFG/scev.ll
new file mode 100644
index 00000000000..a2e8e5c6393
--- /dev/null
+++ b/llvm/test/Transforms/LoopSimplifyCFG/scev.ll
@@ -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
+}
+
OpenPOWER on IntegriCloud