1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 20:43:44 +02:00
llvm-mirror/test/Transforms/RewriteStatepointsForGC/codegen-cond.ll
Fedor Sergeev 9146e8f676 [PM] port Rewrite Statepoints For GC to the new pass manager.
Summary:
The port is nearly straightforward.
The only complication is related to the analyses handling,
since one of the analyses used in this module pass is domtree,
which is a function analysis. That requires asking for the results
of each function and disallows a single interface for run-on-module
pass action.

Decided to copy-paste the main body of this pass.
Most of its code is requesting analyses anyway, so not that much
of a copy-paste.

The rest of the code movement is to transform all the implementation
helper functions like stripNonValidData into non-member statics.

Extended all the related LLVM tests with new-pass-manager use.
No failures.

Reviewers: sanjoy, anna, reames

Reviewed By: anna

Subscribers: skatkov, llvm-commits

Differential Revision: https://reviews.llvm.org/D41162

llvm-svn: 320796
2017-12-15 09:32:11 +00:00

83 lines
2.4 KiB
LLVM

; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
; RUN: opt -passes=rewrite-statepoints-for-gc -S < %s | FileCheck %s
; A null test of a single value
define i1 @test(i8 addrspace(1)* %p, i1 %rare) gc "statepoint-example" {
; CHECK-LABEL: @test
entry:
%cond = icmp eq i8 addrspace(1)* %p, null
br i1 %rare, label %safepoint, label %continue, !prof !0
safepoint: ; preds = %entry
call void @safepoint() [ "deopt"() ]
br label %continue
continue: ; preds = %safepoint, %entry
; CHECK-LABEL: continue:
; CHECK: phi
; CHECK-DAG: [ %p.relocated, %safepoint ]
; CHECK-DAG: [ %p, %entry ]
; CHECK: %cond = icmp
; CHECK: br i1 %cond
; Comparing two pointers
br i1 %cond, label %taken, label %untaken
taken: ; preds = %continue
ret i1 true
untaken: ; preds = %continue
ret i1 false
}
define i1 @test2(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" {
; CHECK-LABEL: @test2
entry:
%cond = icmp eq i8 addrspace(1)* %p, %q
br i1 %rare, label %safepoint, label %continue, !prof !0
safepoint: ; preds = %entry
call void @safepoint() [ "deopt"() ]
br label %continue
continue: ; preds = %safepoint, %entry
; CHECK-LABEL: continue:
; CHECK: phi
; CHECK-DAG: [ %q.relocated, %safepoint ]
; CHECK-DAG: [ %q, %entry ]
; CHECK: phi
; CHECK-DAG: [ %p.relocated, %safepoint ]
; CHECK-DAG: [ %p, %entry ]
; CHECK: %cond = icmp
; CHECK: br i1 %cond
; Sanity check that nothing bad happens if already last instruction
; before terminator
br i1 %cond, label %taken, label %untaken
taken: ; preds = %continue
ret i1 true
untaken: ; preds = %continue
ret i1 false
}
define i1 @test3(i8 addrspace(1)* %p, i8 addrspace(1)* %q, i1 %rare) gc "statepoint-example" {
; CHECK-LABEL: @test3
; CHECK: gc.statepoint
; CHECK: %cond = icmp
; CHECK: br i1 %cond
entry:
call void @safepoint() [ "deopt"() ]
%cond = icmp eq i8 addrspace(1)* %p, %q
br i1 %cond, label %taken, label %untaken
taken: ; preds = %entry
ret i1 true
untaken: ; preds = %entry
ret i1 false
}
declare void @safepoint()
!0 = !{!"branch_weights", i32 1, i32 10000}