From 1ac2f5ca3d0b3005ded113d0bccc908c85a64c8b Mon Sep 17 00:00:00 2001 From: Anna Thomas Date: Fri, 28 Dec 2018 19:21:50 +0000 Subject: [PATCH] [UnrollRuntime] NFC: Updated exiting tests and added more tests Added more tests for multiple exiting blocks to the LatchExit. Today these cases are not supported. Patch to follow soon. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@350135 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../LoopUnroll/runtime-loop-multiple-exits.ll | 168 +++++++++++++++--- 1 file changed, 145 insertions(+), 23 deletions(-) diff --git a/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll b/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll index 8ba5ffc4233..397e907a8e9 100644 --- a/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll +++ b/test/Transforms/LoopUnroll/runtime-loop-multiple-exits.ll @@ -207,43 +207,165 @@ exit2.loopexit: } ; FIXME: Support multiple exiting blocks to the same latch exit block. -define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) { -; EPILOG: test4( +; Three exiting blocks where header and latch exit to same LatchExit. +define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { +; EPILOG: hdr_latch_same_exit( ; EPILOG-NOT: .unr ; EPILOG-NOT: .epil -; PROLOG: test4( +; PROLOG: hdr_latch_same_exit( ; PROLOG-NOT: .unr ; PROLOG-NOT: .prol entry: br label %header header: - %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ] - %sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ] - br i1 %cond, label %for.end, label %for.exiting_block + %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] + %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] + br i1 %cond, label %latchExit, label %for.exiting_block for.exiting_block: %cmp = icmp eq i64 %n, 42 - br i1 %cmp, label %for.exit2, label %for.body + br i1 %cmp, label %for.exit2, label %latch -for.body: ; preds = %for.body, %entry +latch: ; preds = %latch, %entry %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv %0 = load i32, i32* %arrayidx, align 4 %add = add nsw i32 %0, %sum.02 %indvars.iv.next = add i64 %indvars.iv, 1 %exitcond = icmp eq i64 %indvars.iv.next, %n - br i1 %exitcond, label %for.end, label %header + br i1 %exitcond, label %latchExit, label %header -for.end: ; preds = %for.body, %entry - %sum.0.lcssa = phi i32 [ 0, %header ], [ %add, %for.body ] - ret i32 %sum.0.lcssa +latchExit: ; preds = %latch, %entry + %result = phi i32 [ 0, %header ], [ %add, %latch ] + ret i32 %result for.exit2: ret i32 42 } -; FIXME: Support multiple exiting blocks to the unique exit block. +; Two exiting blocks to latch where the exiting blocks are Latch and a +; non-header +; FIXME: We should unroll this loop. +define i32 @otherblock_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) { +; EPILOG: otherblock_latch_same_exit( +; EPILOG-NOT: .unr +; EPILOG-NOT: .epil + +; PROLOG: otherblock_latch_same_exit( +; PROLOG-NOT: .unr +; PROLOG-NOT: .prol +entry: + br label %header + +header: + %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] + %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] + br i1 %cond, label %for.exit2, label %for.exiting_block + +for.exiting_block: + %cmp = icmp eq i64 %n, 42 + br i1 %cmp, label %latchExit, label %latch + +latch: ; preds = %latch, %entry + %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv + %0 = load i32, i32* %arrayidx, align 4 + %add = add nsw i32 %0, %sum.02 + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, %n + br i1 %exitcond, label %latchExit, label %header + +latchExit: ; preds = %latch, %entry + %result = phi i32 [ 2, %for.exiting_block ], [ %add, %latch ] + ret i32 %result + +for.exit2: + ret i32 42 +} + +; Two exiting blocks to latch where the exiting blocks are Latch and a +; non-header +; Same as above test except the incoming value for latch Phi is from the header +; FIXME: We should be able to runtime unroll. +define i32 @otherblock_latch_same_exit2(i32* nocapture %a, i64 %n, i1 %cond) { +; EPILOG: otherblock_latch_same_exit2( +; EPILOG-NOT: .unr +; EPILOG-NOT: .epil + +; PROLOG: otherblock_latch_same_exit2( +; PROLOG-NOT: .unr +; PROLOG-NOT: .prol +entry: + br label %header + +header: + %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] + %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] + br i1 %cond, label %for.exit2, label %for.exiting_block + +for.exiting_block: + %cmp = icmp eq i64 %n, 42 + br i1 %cmp, label %latchExit, label %latch + +latch: ; preds = %latch, %entry + %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv + %0 = load i32, i32* %arrayidx, align 4 + %add = add nsw i32 %0, %sum.02 + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, %n + br i1 %exitcond, label %latchExit, label %header + +latchExit: ; preds = %latch, %entry + %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] + ret i32 %result + +for.exit2: + ret i32 42 +} + +; Two exiting blocks to latch where the exiting blocks are Latch and a +; non-header +; Same as above test except the incoming value for cloned latch Phi is from the +; for.exiting_block. +; FIXME: We should be able to runtime unroll. +define i32 @otherblock_latch_same_exit3(i32* nocapture %a, i64 %n, i1 %cond) { +; EPILOG: otherblock_latch_same_exit3( +; EPILOG-NOT: .unr +; EPILOG-NOT: .epil + +; PROLOG: otherblock_latch_same_exit3( +; PROLOG-NOT: .unr +; PROLOG-NOT: .prol +entry: + br label %header + +header: + %indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ] + %sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ] + br i1 %cond, label %for.exit2, label %for.exiting_block + +for.exiting_block: + %arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv + %0 = load i32, i32* %arrayidx, align 4 + %add = add nsw i32 %0, %sum.02 + %cmp = icmp eq i64 %n, 42 + br i1 %cmp, label %latchExit, label %latch + +latch: ; preds = %latch, %entry + %indvars.iv.next = add i64 %indvars.iv, 1 + %exitcond = icmp eq i64 %indvars.iv.next, %n + br i1 %exitcond, label %latchExit, label %header + +latchExit: ; preds = %latch, %entry + %result = phi i32 [ %sum.02, %for.exiting_block ], [ %add, %latch ] + ret i32 %result + +for.exit2: + ret i32 42 +} + +; FIXME: Support multiple exiting blocks to the unique exit block (LatchExit). +; Only 2 blocks in loop: header and latch where both exit to same LatchExit. define void @unique_exit(i32 %arg) { ; EPILOG: unique_exit( ; EPILOG-NOT: .unr @@ -259,22 +381,22 @@ entry: 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 + br i1 true, label %latchExit, label %latch latch: ; preds = %header %cmp = icmp slt i32 %inc, undef - br i1 %cmp, label %header, label %LoopExit + br i1 %cmp, label %header, label %latchExit + +latchExit: ; preds = %header, %latch + %tmp2.ph = phi i32 [ %tmp4, %header ], [ -1, %latch ] + br label %returnblock + +returnblock: ; preds = %latchExit, %entry + %tmp2 = phi i32 [ -1, %entry ], [ %tmp2.ph, %latchExit ] + ret void } ; two exiting and two exit blocks. -- 2.50.1