]> granicus.if.org Git - llvm/commitdiff
[LoopUnrollRuntime] Bailout when multiple exiting blocks to the unique latch exit...
authorAnna Thomas <anna@azul.com>
Thu, 6 Jul 2017 18:39:26 +0000 (18:39 +0000)
committerAnna Thomas <anna@azul.com>
Thu, 6 Jul 2017 18:39:26 +0000 (18:39 +0000)
Currently, we do not support multiple exiting blocks to the
latch exit block. However, this bailout wasn't triggered when we had a
unique exit block (which is the latch exit), with multiple exiting
blocks to that unique exit.

Moved the bailout so that it's triggered in both cases and added
testcase.

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

lib/Transforms/Utils/LoopUnrollRuntime.cpp
test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll

index 9ad2b707e6b236743c15dc4a04683d8b70f6fe0e..f96c0bd149a0e9f99d502c08d6fada37ec7b5fc6 100644 (file)
@@ -504,10 +504,6 @@ bool llvm::UnrollRuntimeLoopRemainder(Loop *L, unsigned Count,
     // transformed.
     if (!PreserveLCSSA)
       return false;
-    // TODO: Support multiple exiting blocks jumping to the `LatchExit`. This
-    // will need updating the logic in connectEpilog.
-    if (!LatchExit->getSinglePredecessor())
-        return false;
     SmallVector<BasicBlock *, 4> Exits;
     L->getUniqueExitBlocks(Exits);
     for (auto *BB : Exits)
@@ -517,6 +513,11 @@ bool llvm::UnrollRuntimeLoopRemainder(Loop *L, unsigned Count,
 
   assert(LatchExit && "Latch Exit should exist!");
 
+  // TODO: Support multiple exiting blocks jumping to the `LatchExit` when
+  // UnrollRuntimeMultiExit is true. This will need updating the logic in
+  // connectEpilog.
+  if (!LatchExit->getSinglePredecessor())
+    return false;
   // Use Scalar Evolution to compute the trip count. This allows more loops to
   // be unrolled than relying on induction var simplification.
   if (!SE)
index 1f31a133e34d9a583c0af4fa792198e251d5be77..5cff94906d8ec939d8d336677fd82b32d2b1a8b4 100644 (file)
@@ -184,6 +184,36 @@ for.exit2:
   ret i32 42
 }
 
+; FIXME: Support multiple exiting blocks to the unique exit block.
+define void @unique_exit(i32 %arg) {
+; CHECK-LABEL: unique_exit
+; CHECK-NOT: .unr
+; CHECK-NOT: .epil
+entry:
+  %tmp = icmp sgt i32 undef, %arg
+  br i1 %tmp, label %preheader, label %returnblock
+
+preheader:                                 ; preds = %entry
+  br label %header
+
+LoopExit:                                ; preds = %header, %latch
+  %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ]
+  br label %returnblock
+
+returnblock:                                         ; preds = %LoopExit, %entry
+  %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %LoopExit ]
+  ret void
+
+header:                                           ; preds = %preheader, %latch
+  %tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
+  %inc = add nsw i32 %tmp4, 1
+  br i1 true, label %LoopExit, label %latch
+
+latch:                                            ; preds = %header
+  %cmp = icmp slt i32 %inc, undef
+  br i1 %cmp, label %header, label %LoopExit
+}
+
 ; two exiting and two exit blocks.
 ; the non-latch exiting block has duplicate edges to the non-latch exit block.
 define i64 @test5(i64 %trip, i64 %add, i1 %cond) {