1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s 2>&1 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-pc-linux-gnu" 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare void @"some_call"(i64 addrspace(1)*) 6*9880d681SAndroid Build Coastguard Workerdeclare i64 addrspace(1)* @"some_other_call"(i64 addrspace(1)*) 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i32 @"personality_function"() 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdefine i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, 11*9880d681SAndroid Build Coastguard Worker i64 addrspace(1)* %obj1) 12*9880d681SAndroid Build Coastguard Workergc "statepoint-example" personality i32 ()* @"personality_function" { 13*9880d681SAndroid Build Coastguard Workerentry: 14*9880d681SAndroid Build Coastguard Worker ; CHECK: Ltmp{{[0-9]+}}: 15*9880d681SAndroid Build Coastguard Worker ; CHECK: callq some_call 16*9880d681SAndroid Build Coastguard Worker ; CHECK: Ltmp{{[0-9]+}}: 17*9880d681SAndroid Build Coastguard Worker %0 = invoke token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 0, i32 0, void (i64 addrspace(1)*)* @some_call, i32 1, i32 0, i64 addrspace(1)* %obj, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) 18*9880d681SAndroid Build Coastguard Worker to label %invoke_safepoint_normal_dest unwind label %exceptional_return 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerinvoke_safepoint_normal_dest: 21*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 22*9880d681SAndroid Build Coastguard Worker %obj.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %0, i32 13, i32 13) 23*9880d681SAndroid Build Coastguard Worker %obj1.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %0, i32 14, i32 14) 24*9880d681SAndroid Build Coastguard Worker br label %normal_return 25*9880d681SAndroid Build Coastguard Worker 26*9880d681SAndroid Build Coastguard Workernormal_return: 27*9880d681SAndroid Build Coastguard Worker ; CHECK: retq 28*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %obj.relocated 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerexceptional_return: 31*9880d681SAndroid Build Coastguard Worker ; CHECK: Ltmp{{[0-9]+}}: 32*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 33*9880d681SAndroid Build Coastguard Worker ; CHECK: retq 34*9880d681SAndroid Build Coastguard Worker %landing_pad = landingpad token 35*9880d681SAndroid Build Coastguard Worker cleanup 36*9880d681SAndroid Build Coastguard Worker %obj.relocated1 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 13, i32 13) 37*9880d681SAndroid Build Coastguard Worker %obj1.relocated1 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 14, i32 14) 38*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %obj1.relocated1 39*9880d681SAndroid Build Coastguard Worker} 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: GCC_except_table{{[0-9]+}}: 41*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp{{[0-9]+}}-.Ltmp{{[0-9]+}} 42*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp{{[0-9]+}}-.Lfunc_begin{{[0-9]+}} 43*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 0 44*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 4 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Workerdefine i64 addrspace(1)* @test_result(i64 addrspace(1)* %obj, 47*9880d681SAndroid Build Coastguard Worker i64 addrspace(1)* %obj1) 48*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" personality i32 ()* @personality_function { 49*9880d681SAndroid Build Coastguard Workerentry: 50*9880d681SAndroid Build Coastguard Worker ; CHECK: .Ltmp{{[0-9]+}}: 51*9880d681SAndroid Build Coastguard Worker ; CHECK: callq some_other_call 52*9880d681SAndroid Build Coastguard Worker ; CHECK: .Ltmp{{[0-9]+}}: 53*9880d681SAndroid Build Coastguard Worker %0 = invoke token (i64, i32, i64 addrspace(1)* (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i64p1i64f(i64 0, i32 0, i64 addrspace(1)* (i64 addrspace(1)*)* @some_other_call, i32 1, i32 0, i64 addrspace(1)* %obj, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) 54*9880d681SAndroid Build Coastguard Worker to label %normal_return unwind label %exceptional_return 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workernormal_return: 57*9880d681SAndroid Build Coastguard Worker ; CHECK: popq 58*9880d681SAndroid Build Coastguard Worker ; CHECK: retq 59*9880d681SAndroid Build Coastguard Worker %ret_val = call i64 addrspace(1)* @llvm.experimental.gc.result.p1i64(token %0) 60*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %ret_val 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Workerexceptional_return: 63*9880d681SAndroid Build Coastguard Worker ; CHECK: .Ltmp{{[0-9]+}}: 64*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 65*9880d681SAndroid Build Coastguard Worker %landing_pad = landingpad token 66*9880d681SAndroid Build Coastguard Worker cleanup 67*9880d681SAndroid Build Coastguard Worker %obj.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 13, i32 13) 68*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %obj.relocated 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: GCC_except_table{{[0-9]+}}: 71*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp{{[0-9]+}}-.Ltmp{{[0-9]+}} 72*9880d681SAndroid Build Coastguard Worker; CHECK: .long .Ltmp{{[0-9]+}}-.Lfunc_begin{{[0-9]+}} 73*9880d681SAndroid Build Coastguard Worker; CHECK: .byte 0 74*9880d681SAndroid Build Coastguard Worker; CHECK: .p2align 4 75*9880d681SAndroid Build Coastguard Worker 76*9880d681SAndroid Build Coastguard Workerdefine i64 addrspace(1)* @test_same_val(i1 %cond, i64 addrspace(1)* %val1, i64 addrspace(1)* %val2, i64 addrspace(1)* %val3) 77*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" personality i32 ()* @"personality_function" { 78*9880d681SAndroid Build Coastguard Workerentry: 79*9880d681SAndroid Build Coastguard Worker br i1 %cond, label %left, label %right 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerleft: 82*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: %left 83*9880d681SAndroid Build Coastguard Worker ; CHECK: movq %rdx, 8(%rsp) 84*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 85*9880d681SAndroid Build Coastguard Worker ; CHECK: callq some_call 86*9880d681SAndroid Build Coastguard Worker %sp1 = invoke token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 0, i32 0, void (i64 addrspace(1)*)* @some_call, i32 1, i32 0, i64 addrspace(1)* %val1, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i64 addrspace(1)* %val1, i64 addrspace(1)* %val2) 87*9880d681SAndroid Build Coastguard Worker to label %left.relocs unwind label %exceptional_return.left 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerleft.relocs: 90*9880d681SAndroid Build Coastguard Worker ; CHECK: movq (%rsp), 91*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 8(%rsp), [[REGVAL2:%[a-z]+]] 92*9880d681SAndroid Build Coastguard Worker %val1.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp1, i32 13, i32 13) 93*9880d681SAndroid Build Coastguard Worker %val2.relocated_left = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp1, i32 14, i32 14) 94*9880d681SAndroid Build Coastguard Worker br label %normal_return 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Workerright: 97*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: %right 98*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 99*9880d681SAndroid Build Coastguard Worker ; CHECK: movq %rdx, (%rsp) 100*9880d681SAndroid Build Coastguard Worker ; CHECK: callq some_call 101*9880d681SAndroid Build Coastguard Worker %sp2 = invoke token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 0, i32 0, void (i64 addrspace(1)*)* @some_call, i32 1, i32 0, i64 addrspace(1)* %val1, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i64 addrspace(1)* %val2, i64 addrspace(1)* %val3) 102*9880d681SAndroid Build Coastguard Worker to label %right.relocs unwind label %exceptional_return.right 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerright.relocs: 105*9880d681SAndroid Build Coastguard Worker ; CHECK: movq (%rsp), [[REGVAL2]] 106*9880d681SAndroid Build Coastguard Worker ; CHECK: movq 107*9880d681SAndroid Build Coastguard Worker %val2.relocated_right = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp2, i32 13, i32 13) 108*9880d681SAndroid Build Coastguard Worker %val3.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp2, i32 14, i32 14) 109*9880d681SAndroid Build Coastguard Worker br label %normal_return 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Workernormal_return: 112*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: %normal_return 113*9880d681SAndroid Build Coastguard Worker ; CHECK: cmoveq {{.*}}[[REGVAL2]]{{.*}} 114*9880d681SAndroid Build Coastguard Worker ; CHECK: retq 115*9880d681SAndroid Build Coastguard Worker %a1 = phi i64 addrspace(1)* [%val1.relocated, %left.relocs], [%val3.relocated, %right.relocs] 116*9880d681SAndroid Build Coastguard Worker %a2 = phi i64 addrspace(1)* [%val2.relocated_left, %left.relocs], [%val2.relocated_right, %right.relocs] 117*9880d681SAndroid Build Coastguard Worker %ret = select i1 %cond, i64 addrspace(1)* %a1, i64 addrspace(1)* %a2 118*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %ret 119*9880d681SAndroid Build Coastguard Worker 120*9880d681SAndroid Build Coastguard Workerexceptional_return.left: 121*9880d681SAndroid Build Coastguard Worker %landing_pad = landingpad token 122*9880d681SAndroid Build Coastguard Worker cleanup 123*9880d681SAndroid Build Coastguard Worker %val.relocated2 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 13, i32 13) 124*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %val.relocated2 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Workerexceptional_return.right: 127*9880d681SAndroid Build Coastguard Worker %landing_pad1 = landingpad token 128*9880d681SAndroid Build Coastguard Worker cleanup 129*9880d681SAndroid Build Coastguard Worker %val.relocated3 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad1, i32 13, i32 13) 130*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %val.relocated3 131*9880d681SAndroid Build Coastguard Worker} 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Workerdefine i64 addrspace(1)* @test_null_undef(i64 addrspace(1)* %val1) 134*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" personality i32 ()* @"personality_function" { 135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_null_undef: 136*9880d681SAndroid Build Coastguard Workerentry: 137*9880d681SAndroid Build Coastguard Worker ; CHECK: callq some_call 138*9880d681SAndroid Build Coastguard Worker %sp1 = invoke token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 0, i32 0, void (i64 addrspace(1)*)* @some_call, i32 1, i32 0, i64 addrspace(1)* %val1, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i64 addrspace(1)* null, i64 addrspace(1)* undef) 139*9880d681SAndroid Build Coastguard Worker to label %normal_return unwind label %exceptional_return 140*9880d681SAndroid Build Coastguard Worker 141*9880d681SAndroid Build Coastguard Workernormal_return: 142*9880d681SAndroid Build Coastguard Worker ; CHECK-LABEL: %normal_return 143*9880d681SAndroid Build Coastguard Worker ; CHECK: xorl %eax, %eax 144*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: popq 145*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: retq 146*9880d681SAndroid Build Coastguard Worker %null.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp1, i32 13, i32 13) 147*9880d681SAndroid Build Coastguard Worker %undef.relocated = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %sp1, i32 14, i32 14) 148*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %null.relocated 149*9880d681SAndroid Build Coastguard Worker 150*9880d681SAndroid Build Coastguard Workerexceptional_return: 151*9880d681SAndroid Build Coastguard Worker %landing_pad = landingpad token 152*9880d681SAndroid Build Coastguard Worker cleanup 153*9880d681SAndroid Build Coastguard Worker %null.relocated2 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 13, i32 13) 154*9880d681SAndroid Build Coastguard Worker %undef.relocated2 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 14, i32 14) 155*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %null.relocated2 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workerdefine i64 addrspace(1)* @test_alloca_and_const(i64 addrspace(1)* %val1) 159*9880d681SAndroid Build Coastguard Worker gc "statepoint-example" personality i32 ()* @"personality_function" { 160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_alloca_and_const: 161*9880d681SAndroid Build Coastguard Workerentry: 162*9880d681SAndroid Build Coastguard Worker %a = alloca i32 163*9880d681SAndroid Build Coastguard Worker %aa = addrspacecast i32* %a to i32 addrspace(1)* 164*9880d681SAndroid Build Coastguard Worker %c = inttoptr i64 15 to i64 addrspace(1)* 165*9880d681SAndroid Build Coastguard Worker ; CHECK: callq 166*9880d681SAndroid Build Coastguard Worker %sp = invoke token (i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64 0, i32 0, void (i64 addrspace(1)*)* @some_call, i32 1, i32 0, i64 addrspace(1)* %val1, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i32 addrspace(1)* %aa, i64 addrspace(1)* %c) 167*9880d681SAndroid Build Coastguard Worker to label %normal_return unwind label %exceptional_return 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workernormal_return: 170*9880d681SAndroid Build Coastguard Worker ; CHECK: leaq 171*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: popq 172*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: retq 173*9880d681SAndroid Build Coastguard Worker %aa.rel = call coldcc i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token %sp, i32 13, i32 13) 174*9880d681SAndroid Build Coastguard Worker %aa.converted = bitcast i32 addrspace(1)* %aa.rel to i64 addrspace(1)* 175*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %aa.converted 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerexceptional_return: 178*9880d681SAndroid Build Coastguard Worker ; CHECK: movl $15 179*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: popq 180*9880d681SAndroid Build Coastguard Worker ; CHECK-NEXT: retq 181*9880d681SAndroid Build Coastguard Worker %landing_pad = landingpad token 182*9880d681SAndroid Build Coastguard Worker cleanup 183*9880d681SAndroid Build Coastguard Worker %aa.rel2 = call coldcc i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token %landing_pad, i32 14, i32 14) 184*9880d681SAndroid Build Coastguard Worker ret i64 addrspace(1)* %aa.rel2 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_isVoidp1i64f(i64, i32, void (i64 addrspace(1)*)*, i32, i32, ...) 188*9880d681SAndroid Build Coastguard Workerdeclare token @llvm.experimental.gc.statepoint.p0f_p1i64p1i64f(i64, i32, i64 addrspace(1)* (i64 addrspace(1)*)*, i32, i32, ...) 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdeclare i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token, i32, i32) 191*9880d681SAndroid Build Coastguard Workerdeclare i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(token, i32, i32) 192*9880d681SAndroid Build Coastguard Workerdeclare i64 addrspace(1)* @llvm.experimental.gc.result.p1i64(token) 193