mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-08 21:32:39 +00:00
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:
parent
ad83329ce5
commit
d3f3d5f0d7
31
test/Transforms/PlaceSafepoints/call-in-loop.ll
Normal file
31
test/Transforms/PlaceSafepoints/call-in-loop.ll
Normal 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
|
||||
}
|
80
test/Transforms/PlaceSafepoints/finite-loops.ll
Normal file
80
test/Transforms/PlaceSafepoints/finite-loops.ll
Normal 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
|
||||
}
|
46
test/Transforms/PlaceSafepoints/split-backedge.ll
Normal file
46
test/Transforms/PlaceSafepoints/split-backedge.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user