]> granicus.if.org Git - llvm/commitdiff
Use all_of instead of a raw loop; NFC
authorSanjoy Das <sanjoy@playingwithpointers.com>
Tue, 3 May 2016 17:50:06 +0000 (17:50 +0000)
committerSanjoy Das <sanjoy@playingwithpointers.com>
Tue, 3 May 2016 17:50:06 +0000 (17:50 +0000)
Added some tests despite being NFC, since it looks like nothing was
exercising the "all incoming values to exit PHIs are same" logic.

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

lib/Transforms/Scalar/LoopDeletion.cpp
test/Transforms/LoopDeletion/multiple-exits.ll

index f888ad9e4f9f52e507b14331e18a7072505083a5..2e07f3436818a01e0b554305d5435cb56d280410 100644 (file)
@@ -86,12 +86,10 @@ bool LoopDeletion::isLoopDead(Loop *L, ScalarEvolution &SE,
     // block.  If there are different incoming values for different exiting
     // blocks, then it is impossible to statically determine which value should
     // be used.
-    for (unsigned i = 1, e = exitingBlocks.size(); i < e; ++i) {
-      if (incoming != P->getIncomingValueForBlock(exitingBlocks[i])) {
-        AllOutgoingValuesSame = false;
-        break;
-      }
-    }
+    AllOutgoingValuesSame =
+        all_of(makeArrayRef(exitingBlocks).slice(1), [&](BasicBlock *BB) {
+          return incoming == P->getIncomingValueForBlock(BB);
+        });
 
     if (!AllOutgoingValuesSame)
       break;
index 6af413b49cd998219d078ab88e44d1826decd606..dcf79057db541d96482a8ecc79df310c42f109c9 100644 (file)
@@ -2,13 +2,13 @@
 
 ; Checks whether dead loops with multiple exits can be eliminated
 
+define void @foo(i64 %n, i64 %m) nounwind {
+; CHECK-LABEL: @foo(
 ; 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
 
@@ -24,3 +24,57 @@ bb2:
 return:
   ret void
 }
+
+define i64 @bar(i64 %n, i64 %m) nounwind {
+; CHECK-LABEL:  @bar(
+; CHECK: entry:
+; CHECK-NEXT:  br label %return
+
+; CHECK: return:
+; CHECK-NEXT:  ret i64 10
+
+entry:
+  br label %bb
+
+bb:
+  %x.0 = phi i64 [ 0, %entry ], [ %t0, %bb3 ]
+  %t0 = add i64 %x.0, 1
+  %t1 = icmp slt i64 %x.0, %n
+  br i1 %t1, label %bb2, label %return
+bb2:
+  %t2 = icmp slt i64 %x.0, %m
+  br i1 %t2, label %bb3, label %return
+bb3:
+  %t3 = icmp slt i64 %x.0, %m
+  br i1 %t3, label %bb, label %return
+
+return:
+  %x.lcssa = phi i64 [ 10, %bb ], [ 10, %bb2 ], [ 10, %bb3 ]
+  ret i64 %x.lcssa
+}
+
+define i64 @baz(i64 %n, i64 %m) nounwind {
+; CHECK-LABEL:  @baz(
+; CHECK: return:
+; CHECK-NEXT:  %x.lcssa = phi i64 [ 12, %bb ], [ 10, %bb2 ]
+; CHECK-NEXT:  ret i64 %x.lcssa
+
+entry:
+  br label %bb
+
+bb:
+  %x.0 = phi i64 [ 0, %entry ], [ %t0, %bb3 ]
+  %t0 = add i64 %x.0, 1
+  %t1 = icmp slt i64 %x.0, %n
+  br i1 %t1, label %bb2, label %return
+bb2:
+  %t2 = icmp slt i64 %x.0, %m
+  br i1 %t2, label %bb3, label %return
+bb3:
+  %t3 = icmp slt i64 %x.0, %m
+  br i1 %t3, label %bb, label %return
+
+return:
+  %x.lcssa = phi i64 [ 12, %bb ], [ 10, %bb2 ], [ 10, %bb3 ]
+  ret i64 %x.lcssa
+}