1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -passes=rewrite-statepoints-for-gc < %s | FileCheck %s 3 4declare void @g() 5declare i32 @h() 6 7define ptr addrspace(1) @f0(ptr addrspace(1) %arg) gc "statepoint-example" { 8; CHECK-LABEL: @f0( 9; CHECK-NEXT: entry: 10; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @g, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 100), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ] 11; CHECK-NEXT: [[ARG_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 12; CHECK-NEXT: ret ptr addrspace(1) [[ARG_RELOCATED]] 13; 14 entry: 15 call void @g() [ "deopt"(i32 100) ] 16 17 ret ptr addrspace(1) %arg 18} 19 20define ptr addrspace(1) @f1(ptr addrspace(1) %arg) gc "statepoint-example" personality i32 8 { 21; CHECK-LABEL: @f1( 22; CHECK-NEXT: entry: 23; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @g, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 100), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ] 24; CHECK-NEXT: to label [[NORMAL_DEST:%.*]] unwind label [[UNWIND_DEST:%.*]] 25; CHECK: normal_dest: 26; CHECK-NEXT: [[ARG_RELOCATED1:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 27; CHECK-NEXT: ret ptr addrspace(1) [[ARG_RELOCATED1]] 28; CHECK: unwind_dest: 29; CHECK-NEXT: [[LPAD:%.*]] = landingpad token 30; CHECK-NEXT: cleanup 31; CHECK-NEXT: [[ARG_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 0) 32; CHECK-NEXT: resume token undef 33; 34 entry: 35 invoke void @g() [ "deopt"(i32 100) ] to label %normal_dest unwind label %unwind_dest 36 37 normal_dest: 38 ret ptr addrspace(1) %arg 39 40 unwind_dest: 41 %lpad = landingpad token cleanup 42 resume token undef 43} 44 45define ptr addrspace(1) @f2(ptr addrspace(1) %arg) gc "statepoint-example" { 46; CHECK-LABEL: @f2( 47; CHECK-NEXT: entry: 48; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(i32 ()) @h, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 100), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ] 49; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.experimental.gc.result.i32(token [[STATEPOINT_TOKEN]]) 50; CHECK-NEXT: [[ARG_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 51; CHECK-NEXT: store i32 [[VAL1]], ptr addrspace(1) [[ARG_RELOCATED]], align 4 52; CHECK-NEXT: ret ptr addrspace(1) [[ARG_RELOCATED]] 53; 54 entry: 55 %val = call i32 @h() [ "deopt"(i32 100) ] 56 57 58 store i32 %val, ptr addrspace(1) %arg 59 ret ptr addrspace(1) %arg 60} 61 62define ptr addrspace(1) @f3(ptr addrspace(1) %arg) gc "statepoint-example" personality i32 8 { 63; CHECK-LABEL: @f3( 64; CHECK-NEXT: entry: 65; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(i32 ()) @h, i32 0, i32 0, i32 0, i32 0) [ "deopt"(i32 100), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ] 66; CHECK-NEXT: to label [[NORMAL_DEST:%.*]] unwind label [[UNWIND_DEST:%.*]] 67; CHECK: normal_dest: 68; CHECK-NEXT: [[VAL1:%.*]] = call i32 @llvm.experimental.gc.result.i32(token [[STATEPOINT_TOKEN]]) 69; CHECK-NEXT: [[ARG_RELOCATED2:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 70; CHECK-NEXT: store i32 [[VAL1]], ptr addrspace(1) [[ARG_RELOCATED2]], align 4 71; CHECK-NEXT: ret ptr addrspace(1) [[ARG_RELOCATED2]] 72; CHECK: unwind_dest: 73; CHECK-NEXT: [[LPAD:%.*]] = landingpad token 74; CHECK-NEXT: cleanup 75; CHECK-NEXT: [[ARG_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 0) 76; CHECK-NEXT: resume token undef 77; 78 entry: 79 %val = invoke i32 @h() [ "deopt"(i32 100) ] to label %normal_dest unwind label %unwind_dest 80 81 normal_dest: 82 83 store i32 %val, ptr addrspace(1) %arg 84 85 ret ptr addrspace(1) %arg 86 87 unwind_dest: 88 %lpad = landingpad token cleanup 89 resume token undef 90} 91 92define ptr addrspace(1) @f4(ptr addrspace(1) %arg) gc "statepoint-example" { 93; CHECK-LABEL: @f4( 94; CHECK-NEXT: entry: 95; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @g, i32 0, i32 1, i32 0, i32 0) [ "gc-transition"(i32 400, i8 90), "gc-live"(ptr addrspace(1) [[ARG:%.*]]) ] 96; CHECK-NEXT: [[ARG_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 97; CHECK-NEXT: ret ptr addrspace(1) [[ARG_RELOCATED]] 98; 99 entry: 100 call void @g() [ "gc-transition"(i32 400, i8 90) ] 101 ret ptr addrspace(1) %arg 102} 103