mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[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. llvm-svn: 350135
This commit is contained in:
parent
7e2c50dd6b
commit
c2716159d0
@ -207,43 +207,165 @@ exit2.loopexit:
|
|||||||
}
|
}
|
||||||
|
|
||||||
; FIXME: Support multiple exiting blocks to the same latch exit block.
|
; FIXME: Support multiple exiting blocks to the same latch exit block.
|
||||||
define i32 @test4(i32* nocapture %a, i64 %n, i1 %cond) {
|
; Three exiting blocks where header and latch exit to same LatchExit.
|
||||||
; EPILOG: test4(
|
define i32 @hdr_latch_same_exit(i32* nocapture %a, i64 %n, i1 %cond) {
|
||||||
|
; EPILOG: hdr_latch_same_exit(
|
||||||
; EPILOG-NOT: .unr
|
; EPILOG-NOT: .unr
|
||||||
; EPILOG-NOT: .epil
|
; EPILOG-NOT: .epil
|
||||||
|
|
||||||
; PROLOG: test4(
|
; PROLOG: hdr_latch_same_exit(
|
||||||
; PROLOG-NOT: .unr
|
; PROLOG-NOT: .unr
|
||||||
; PROLOG-NOT: .prol
|
; PROLOG-NOT: .prol
|
||||||
entry:
|
entry:
|
||||||
br label %header
|
br label %header
|
||||||
|
|
||||||
header:
|
header:
|
||||||
%indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
|
%indvars.iv = phi i64 [ %indvars.iv.next, %latch ], [ 0, %entry ]
|
||||||
%sum.02 = phi i32 [ %add, %for.body ], [ 0, %entry ]
|
%sum.02 = phi i32 [ %add, %latch ], [ 0, %entry ]
|
||||||
br i1 %cond, label %for.end, label %for.exiting_block
|
br i1 %cond, label %latchExit, label %for.exiting_block
|
||||||
|
|
||||||
for.exiting_block:
|
for.exiting_block:
|
||||||
%cmp = icmp eq i64 %n, 42
|
%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
|
%arrayidx = getelementptr inbounds i32, i32* %a, i64 %indvars.iv
|
||||||
%0 = load i32, i32* %arrayidx, align 4
|
%0 = load i32, i32* %arrayidx, align 4
|
||||||
%add = add nsw i32 %0, %sum.02
|
%add = add nsw i32 %0, %sum.02
|
||||||
%indvars.iv.next = add i64 %indvars.iv, 1
|
%indvars.iv.next = add i64 %indvars.iv, 1
|
||||||
%exitcond = icmp eq i64 %indvars.iv.next, %n
|
%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
|
latchExit: ; preds = %latch, %entry
|
||||||
%sum.0.lcssa = phi i32 [ 0, %header ], [ %add, %for.body ]
|
%result = phi i32 [ 0, %header ], [ %add, %latch ]
|
||||||
ret i32 %sum.0.lcssa
|
ret i32 %result
|
||||||
|
|
||||||
for.exit2:
|
for.exit2:
|
||||||
ret i32 42
|
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) {
|
define void @unique_exit(i32 %arg) {
|
||||||
; EPILOG: unique_exit(
|
; EPILOG: unique_exit(
|
||||||
; EPILOG-NOT: .unr
|
; EPILOG-NOT: .unr
|
||||||
@ -259,22 +381,22 @@ entry:
|
|||||||
preheader: ; preds = %entry
|
preheader: ; preds = %entry
|
||||||
br label %header
|
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
|
header: ; preds = %preheader, %latch
|
||||||
%tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
|
%tmp4 = phi i32 [ %inc, %latch ], [ %arg, %preheader ]
|
||||||
%inc = add nsw i32 %tmp4, 1
|
%inc = add nsw i32 %tmp4, 1
|
||||||
br i1 true, label %LoopExit, label %latch
|
br i1 true, label %latchExit, label %latch
|
||||||
|
|
||||||
latch: ; preds = %header
|
latch: ; preds = %header
|
||||||
%cmp = icmp slt i32 %inc, undef
|
%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.
|
; two exiting and two exit blocks.
|
||||||
|
Loading…
Reference in New Issue
Block a user