diff options
| author | Anna Thomas <anna@azul.com> | 2019-01-08 17:16:25 +0000 |
|---|---|---|
| committer | Anna Thomas <anna@azul.com> | 2019-01-08 17:16:25 +0000 |
| commit | 2dfa412efeabb4c249dcb089192b31badb3fc4d5 (patch) | |
| tree | 00d70662dad2fd0461d3a93f26dbf3122fd03320 /llvm/test/Transforms/LoopUnroll | |
| parent | ce79e3e5504acc67f7297ce49003dc96ba7223f5 (diff) | |
| download | bcm5719-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.ll | 149 |
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 +} + |

