Sanjoy Das | 0407108 | 2016-01-29 00:28:57 +0000 | [diff] [blame] | 1 | ; RUN: opt -S -rewrite-statepoints-for-gc < %s | FileCheck %s |
Fedor Sergeev | 4b86d79 | 2017-12-15 09:32:11 +0000 | [diff] [blame^] | 2 | ; RUN: opt -S -passes=rewrite-statepoints-for-gc < %s | FileCheck %s |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 3 | |
| 4 | declare void @g() |
| 5 | declare i32 @h() |
| 6 | |
| 7 | define i32 addrspace(1)* @f0(i32 addrspace(1)* %arg) gc "statepoint-example" { |
| 8 | ; CHECK-LABEL: @f0( |
| 9 | entry: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 10 | ; CHECK: [[TOKEN_0:%[^ ]+]] = call token {{[^@]*}} @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 11 | call void @g() [ "deopt"(i32 100) ] |
| 12 | |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 13 | ; CHECK: %arg.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[TOKEN_0]], i32 8, i32 8) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 14 | ret i32 addrspace(1)* %arg |
| 15 | } |
| 16 | |
| 17 | define i32 addrspace(1)* @f1(i32 addrspace(1)* %arg) gc "statepoint-example" personality i32 8 { |
| 18 | ; CHECK-LABEL: @f1( |
| 19 | entry: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 20 | ; CHECK: [[TOKEN_1:%[^ ]+]] = invoke token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 21 | invoke void @g() [ "deopt"(i32 100) ] to label %normal_dest unwind label %unwind_dest |
| 22 | |
| 23 | normal_dest: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 24 | ; CHECK: %arg.relocated1 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[TOKEN_1]], i32 8, i32 8) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 25 | ret i32 addrspace(1)* %arg |
| 26 | |
| 27 | unwind_dest: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 28 | %lpad = landingpad token cleanup |
| 29 | resume token undef |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 30 | } |
| 31 | |
| 32 | define i32 addrspace(1)* @f2(i32 addrspace(1)* %arg) gc "statepoint-example" { |
| 33 | ; CHECK-LABEL: @f2( |
| 34 | entry: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 35 | ; CHECK: [[TOKEN_2:%[^ ]+]] = call token (i64, i32, i32 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32f(i64 2882400000, i32 0, i32 ()* @h, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 36 | %val = call i32 @h() [ "deopt"(i32 100) ] |
| 37 | |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 38 | ; CHECK: [[RESULT_F2:%[^ ]+]] = call i32 @llvm.experimental.gc.result.i32(token [[TOKEN_2]]) |
| 39 | ; CHECK: %arg.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[TOKEN_2]], i32 8, i32 8) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 40 | ; CHECK: %arg.relocated.casted = bitcast i8 addrspace(1)* %arg.relocated to i32 addrspace(1)* |
| 41 | |
| 42 | store i32 %val, i32 addrspace(1)* %arg |
| 43 | ; CHECK: store i32 [[RESULT_F2]], i32 addrspace(1)* %arg.relocated.casted |
| 44 | ret i32 addrspace(1)* %arg |
| 45 | } |
| 46 | |
| 47 | define i32 addrspace(1)* @f3(i32 addrspace(1)* %arg) gc "statepoint-example" personality i32 8 { |
| 48 | ; CHECK-LABEL: @f3( |
| 49 | entry: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 50 | ; CHECK: [[TOKEN_3:%[^ ]+]] = invoke token (i64, i32, i32 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i32f(i64 2882400000, i32 0, i32 ()* @h, i32 0, i32 0, i32 0, i32 1, i32 100, i32 addrspace(1)* %arg) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 51 | %val = invoke i32 @h() [ "deopt"(i32 100) ] to label %normal_dest unwind label %unwind_dest |
| 52 | |
| 53 | normal_dest: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 54 | ; CHECK: [[RESULT_F3:%[^ ]+]] = call i32 @llvm.experimental.gc.result.i32(token [[TOKEN_3]]) |
| 55 | ; CHECK: [[ARG_RELOCATED:%[^ ]+]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[TOKEN_3]], i32 8, i32 8) |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 56 | ; CHECK: [[ARG_RELOCATED_CASTED:%[^ ]+]] = bitcast i8 addrspace(1)* [[ARG_RELOCATED]] to i32 addrspace(1)* |
| 57 | |
| 58 | store i32 %val, i32 addrspace(1)* %arg |
| 59 | |
| 60 | ; CHECK: store i32 [[RESULT_F3]], i32 addrspace(1)* [[ARG_RELOCATED_CASTED]] |
| 61 | ret i32 addrspace(1)* %arg |
| 62 | |
| 63 | unwind_dest: |
Chen Li | d71999e | 2015-12-26 07:54:32 +0000 | [diff] [blame] | 64 | %lpad = landingpad token cleanup |
| 65 | resume token undef |
Sanjoy Das | 25ec1a3 | 2015-10-16 02:41:00 +0000 | [diff] [blame] | 66 | } |
Sanjoy Das | a34ce95 | 2016-01-20 19:50:25 +0000 | [diff] [blame] | 67 | |
| 68 | define i32 addrspace(1)* @f4(i32 addrspace(1)* %arg) gc "statepoint-example" { |
| 69 | ; CHECK-LABEL: @f4( |
| 70 | entry: |
| 71 | ; CHECK: @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @g, i32 0, i32 1, i32 2, i32 400, i8 90, |
| 72 | call void @g() [ "gc-transition"(i32 400, i8 90) ] |
| 73 | ret i32 addrspace(1)* %arg |
| 74 | } |