summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopUnroll
diff options
context:
space:
mode:
authorAnna Thomas <anna@azul.com>2019-01-08 17:16:25 +0000
committerAnna Thomas <anna@azul.com>2019-01-08 17:16:25 +0000
commit2dfa412efeabb4c249dcb089192b31badb3fc4d5 (patch)
tree00d70662dad2fd0461d3a93f26dbf3122fd03320 /llvm/test/Transforms/LoopUnroll
parentce79e3e5504acc67f7297ce49003dc96ba7223f5 (diff)
downloadbcm5719-llvm-2dfa412efeabb4c249dcb089192b31badb3fc4d5.tar.gz
bcm5719-llvm-2dfa412efeabb4c249dcb089192b31badb3fc4d5.zip
[UnrollRuntime] Fix domTree failures in multiexit unrolling
Summary: This fixes the IDom for exit blocks and all blocks reachable from the exit blocks, when runtime unrolling under multiexit/exiting case. We initially had a restrictive check that the IDom is only updated when it is the header of the loop. However, we also need to update the IDom to the correct one when the IDom is any block within the original loop. See added test cases (which fail dom tree verification without the patch). Reviewers: reames, mzolotukhin, mkazantsev, hfinkel Reviewed by: brzycki, kuhar Subscribers: zzheng, dmgreen, llvm-commits Differential Revision: https://reviews.llvm.org/D56284 llvm-svn: 350640
Diffstat (limited to 'llvm/test/Transforms/LoopUnroll')
-rw-r--r--llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll149
1 files changed, 149 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll
index 6014775028e..b3c0039dc15 100644
--- a/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll
+++ b/llvm/test/Transforms/LoopUnroll/runtime-loop-multiexit-dom-verify.ll
@@ -124,3 +124,152 @@ latchexit: ; preds = %latch
exitsucc: ; preds = %headerexit
ret i64 96
}
+
+; exit block (%default) has an exiting block and another exit block as predecessors.
+define void @test4(i16 %c3) {
+; CHECK-LABEL: test4
+
+; CHECK-LABEL: exiting.prol:
+; CHECK-NEXT: switch i16 %c3, label %default.loopexit.loopexit1 [
+
+; CHECK-LABEL: exiting:
+; CHECK-NEXT: switch i16 %c3, label %default.loopexit.loopexit [
+
+; CHECK-LABEL: default.loopexit.loopexit:
+; CHECK-NEXT: br label %default.loopexit
+
+; CHECK-LABEL: default.loopexit.loopexit1:
+; CHECK-NEXT: br label %default.loopexit
+
+; CHECK-LABEL: default.loopexit:
+; CHECK-NEXT: br label %default
+preheader:
+ %c1 = zext i32 undef to i64
+ br label %header
+
+header: ; preds = %latch, %preheader
+ %indvars.iv = phi i64 [ 0, %preheader ], [ %indvars.iv.next, %latch ]
+ br label %exiting
+
+exiting: ; preds = %header
+ switch i16 %c3, label %default [
+ i16 45, label %otherexit
+ i16 95, label %latch
+ ]
+
+latch: ; preds = %exiting
+ %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
+ %c2 = icmp ult i64 %indvars.iv.next, %c1
+ br i1 %c2, label %header, label %latchexit
+
+latchexit: ; preds = %latch
+ ret void
+
+default: ; preds = %otherexit, %exiting
+ ret void
+
+otherexit: ; preds = %exiting
+ br label %default
+}
+
+; exit block (%exitB) has an exiting block and another exit block as predecessors.
+; exiting block comes from inner loop.
+define void @test5() {
+; CHECK-LABEL: test5
+; CHECK-LABEL: bb1:
+; CHECK-NEXT: br i1 false, label %outerH.prol.preheader, label %outerH.prol.loopexit
+
+; CHECK-LABEL: outerH.prol.preheader:
+; CHECK-NEXT: br label %outerH.prol
+
+; CHECK-LABEL: outerH.prol:
+; CHECK-NEXT: %tmp4.prol = phi i32 [ %tmp6.prol, %outerLatch.prol ], [ undef, %outerH.prol.preheader ]
+; CHECK-NEXT: %prol.iter = phi i32 [ 0, %outerH.prol.preheader ], [ %prol.iter.sub, %outerLatch.prol ]
+; CHECK-NEXT: br label %innerH.prol
+bb:
+ %tmp = icmp sgt i32 undef, 79
+ br i1 %tmp, label %outerLatchExit, label %bb1
+
+bb1: ; preds = %bb
+ br label %outerH
+
+outerH: ; preds = %outerLatch, %bb1
+ %tmp4 = phi i32 [ %tmp6, %outerLatch ], [ undef, %bb1 ]
+ br label %innerH
+
+innerH: ; preds = %innerLatch, %outerH
+ br i1 undef, label %innerexiting, label %otherexitB
+
+innerexiting: ; preds = %innerH
+ br i1 undef, label %innerLatch, label %exitB
+
+innerLatch: ; preds = %innerexiting
+ %tmp13 = fcmp olt double undef, 2.000000e+00
+ br i1 %tmp13, label %innerH, label %outerLatch
+
+outerLatch: ; preds = %innerLatch
+ %tmp6 = add i32 %tmp4, 1
+ %tmp7 = icmp sgt i32 %tmp6, 79
+ br i1 %tmp7, label %outerLatchExit, label %outerH
+
+outerLatchExit: ; preds = %outerLatch, %bb
+ ret void
+
+exitB: ; preds = %innerexiting, %otherexitB
+ ret void
+
+otherexitB: ; preds = %innerH
+ br label %exitB
+
+}
+
+; Blocks reachable from exits (not_zero44) have the IDom as the block within the loop (Header).
+; Update the IDom to the preheader.
+define void @test6() {
+; CHECK-LABEL: test6
+; CHECK-LABEL: header.prol.preheader:
+; CHECK-NEXT: br label %header.prol
+
+; CHECK-LABEL: header.prol:
+; CHECK-NEXT: %indvars.iv.prol = phi i64 [ undef, %header.prol.preheader ], [ %indvars.iv.next.prol, %latch.prol ]
+; CHECK-NEXT: %prol.iter = phi i64 [ 1, %header.prol.preheader ], [ %prol.iter.sub, %latch.prol ]
+; CHECK-NEXT: br i1 false, label %latch.prol, label %otherexit.loopexit1
+
+; CHECK-LABEL: header.prol.loopexit.unr-lcssa:
+; CHECK-NEXT: %indvars.iv.unr.ph = phi i64 [ %indvars.iv.next.prol, %latch.prol ]
+; CHECK-NEXT: br label %header.prol.loopexit
+
+; CHECK-LABEL: header.prol.loopexit:
+; CHECK-NEXT: %indvars.iv.unr = phi i64 [ undef, %entry ], [ %indvars.iv.unr.ph, %header.prol.loopexit.unr-lcssa ]
+; CHECK-NEXT: br i1 true, label %latchexit, label %entry.new
+
+; CHECK-LABEL: entry.new:
+; CHECK-NEXT: br label %header
+entry:
+ br label %header
+
+header: ; preds = %latch, %entry
+ %indvars.iv = phi i64 [ undef, %entry ], [ %indvars.iv.next, %latch ]
+ br i1 undef, label %latch, label %otherexit
+
+latch: ; preds = %header
+ %indvars.iv.next = add nsw i64 %indvars.iv, 2
+ %0 = icmp slt i64 %indvars.iv.next, 616
+ br i1 %0, label %header, label %latchexit
+
+latchexit: ; preds = %latch
+ br label %latchexitsucc
+
+otherexit: ; preds = %header
+ br label %otherexitsucc
+
+otherexitsucc: ; preds = %otherexit
+ br label %not_zero44
+
+not_zero44: ; preds = %latchexitsucc, %otherexitsucc
+ unreachable
+
+latchexitsucc: ; preds = %latchexit
+ br label %not_zero44
+}
+
OpenPOWER on IntegriCloud