Introduce more tests for PlaceSafepoints

These tests the two optimizations for backedge insertion currently implemented and the split backedge flag which is currently off by default.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228617 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Philip Reames 2015-02-09 22:10:15 +00:00
parent ad83329ce5
commit d3f3d5f0d7
3 changed files with 157 additions and 0 deletions

View File

@ -0,0 +1,31 @@
; If there's a call in the loop which dominates the backedge, we
; don't need a safepoint poll (since the callee must contain a
; poll test).
;; RUN: opt %s -place-safepoints -S | FileCheck %s
declare void @foo()
define void @test1() {
; CHECK-LABEL: test1
entry:
; CHECK-LABEL: entry
; CHECK: statepoint
br label %loop
loop:
; CHECK-LABEL: loop
; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo
; CHECK-NOT: statepoint
call void @foo()
br label %loop
}
; This function is inlined when inserting a poll.
declare void @do_safepoint()
define void @gc.safepoint_poll() {
; CHECK-LABEL: gc.safepoint_poll
entry:
call void @do_safepoint()
ret void
}

View File

@ -0,0 +1,80 @@
; Tests to ensure that we are not placing backedge safepoints in
; loops which are clearly finite.
;; RUN: opt %s -place-safepoints -S | FileCheck %s
; A simple counted loop with trivially known range
define void @test1(i32) {
; CHECK-LABEL: test1
; CHECK-LABEL: entry
; CHECK: statepoint
; CHECK-LABEL: loop
; CHECK-NOT: statepoint
entry:
br label %loop
loop:
%counter = phi i32 [ 0 , %entry ], [ %counter.inc , %loop ]
%counter.inc = add i32 %counter, 1
%counter.cmp = icmp slt i32 %counter.inc, 16
br i1 %counter.cmp, label %loop, label %exit
exit:
ret void
}
; The same counted loop, but with an unknown early exit
define void @test2(i32) {
; CHECK-LABEL: test2
; CHECK-LABEL: entry
; CHECK: statepoint
; CHECK-LABEL: loop
; CHECK-NOT: statepoint
entry:
br label %loop
loop:
%counter = phi i32 [ 0 , %entry ], [ %counter.inc , %continue ]
%counter.inc = add i32 %counter, 1
%counter.cmp = icmp slt i32 %counter.inc, 16
br i1 undef, label %continue, label %exit
continue:
br i1 %counter.cmp, label %loop, label %exit
exit:
ret void
}
; The range is a 8 bit value and we can't overflow
define void @test3(i8 %upper) {
; CHECK-LABEL: test3
; CHECK-LABEL: entry
; CHECK: statepoint
; CHECK-LABEL: loop
; CHECK-NOT: statepoint
entry:
br label %loop
loop:
%counter = phi i8 [ 0 , %entry ], [ %counter.inc , %loop ]
%counter.inc = add nsw i8 %counter, 1
%counter.cmp = icmp slt i8 %counter.inc, %upper
br i1 %counter.cmp, label %loop, label %exit
exit:
ret void
}
; This function is inlined when inserting a poll.
declare void @do_safepoint()
define void @gc.safepoint_poll() {
; CHECK-LABEL: gc.safepoint_poll
entry:
call void @do_safepoint()
ret void
}

View File

@ -0,0 +1,46 @@
;; A very basic test to make sure that splitting the backedge keeps working
;; RUN: opt -place-safepoints -spp-split-backedge=1 -S %s | FileCheck %s
define void @test(i32, i1 %cond) {
; CHECK-LABEL: @test
; CHECK-LABEL: loop.loop_crit_edge
; CHECK: gc.statepoint
; CHECK-NEXT: br label %loop
entry:
br label %loop
loop:
br i1 %cond, label %loop, label %exit
exit:
ret void
}
; Test for the case where a single conditional branch jumps to two
; different loop header blocks. Since we're currently using LoopSimplfy
; this doesn't hit the interesting case, but once we remove that, we need
; to be sure this keeps working.
define void @test2(i32, i1 %cond) {
; CHECK-LABEL: @test2
; CHECK-LABE: loop.loopexit.split
; CHECK: gc.statepoint
; CHECK-NEXT: br label %loop
; CHECK-LABEL: loop2.loop2_crit_edge
; CHECK: gc.statepoint
; CHECK-NEXT: br label %loop2
entry:
br label %loop
loop:
br label %loop2
loop2:
br i1 %cond, label %loop, label %loop2
}
declare void @do_safepoint()
define void @gc.safepoint_poll() {
entry:
call void @do_safepoint()
ret void
}