From 934af9cfe08ba402882b061364aa693d47855547 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Fri, 23 Oct 2009 17:10:01 +0000 Subject: [PATCH] Make LoopDeletion check the maximum backedge taken count, rather than the exact backedge taken count, when checking for infinite loops. This allows it to delete loops with multiple exit conditions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84952 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopDeletion.cpp | 2 +- .../LoopDeletion/multiple-exit-conditions.ll | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/LoopDeletion/multiple-exit-conditions.ll diff --git a/lib/Transforms/Scalar/LoopDeletion.cpp b/lib/Transforms/Scalar/LoopDeletion.cpp index 5f93756a05c..8133a06f3f8 100644 --- a/lib/Transforms/Scalar/LoopDeletion.cpp +++ b/lib/Transforms/Scalar/LoopDeletion.cpp @@ -167,7 +167,7 @@ bool LoopDeletion::runOnLoop(Loop* L, LPPassManager& LPM) { // Don't remove loops for which we can't solve the trip count. // They could be infinite, in which case we'd be changing program behavior. ScalarEvolution& SE = getAnalysis(); - const SCEV *S = SE.getBackedgeTakenCount(L); + const SCEV *S = SE.getMaxBackedgeTakenCount(L); if (isa(S)) return Changed; diff --git a/test/Transforms/LoopDeletion/multiple-exit-conditions.ll b/test/Transforms/LoopDeletion/multiple-exit-conditions.ll new file mode 100644 index 00000000000..87f8f461050 --- /dev/null +++ b/test/Transforms/LoopDeletion/multiple-exit-conditions.ll @@ -0,0 +1,27 @@ +; RUN: opt < %s -loop-deletion -S | FileCheck %s + +; ScalarEvolution can prove the loop iteration is finite, even though +; it can't represent the exact trip count as an expression. That's +; good enough to let the loop be deleted. + +; CHECK: entry: +; CHECK-NEXT: br label %return + +; CHECK: return: +; CHECK-NEXT: ret void + +define void @foo(i64 %n, i64 %m) nounwind { +entry: + br label %bb + +bb: + %x.0 = phi i64 [ 0, %entry ], [ %t0, %bb ] + %t0 = add i64 %x.0, 1 + %t1 = icmp slt i64 %x.0, %n + %t3 = icmp sgt i64 %x.0, %m + %t4 = and i1 %t1, %t3 + br i1 %t4, label %bb, label %return + +return: + ret void +} -- 2.34.1