1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs < %s 2>&1 | FileCheck %s 3 4target triple = "x86_64-pc-linux-gnu" 5 6declare void @"some_call"(ptr addrspace(1)) 7declare ptr addrspace(1) @"some_other_call"(ptr addrspace(1)) 8 9declare i32 @"personality_function"() 10 11define ptr addrspace(1) @test_basic(ptr addrspace(1) %obj, 12; CHECK-LABEL: test_basic: 13; CHECK: # %bb.0: # %entry 14; CHECK-NEXT: subq $24, %rsp 15; CHECK-NEXT: .cfi_def_cfa_offset 32 16; CHECK-NEXT: movq %rdi, {{[0-9]+}}(%rsp) 17; CHECK-NEXT: movq %rsi, {{[0-9]+}}(%rsp) 18; CHECK-NEXT: .Ltmp0: 19; CHECK-NEXT: callq some_call@PLT 20; CHECK-NEXT: .Ltmp3: 21; CHECK-NEXT: .Ltmp1: 22; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest 23; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax 24; CHECK-NEXT: addq $24, %rsp 25; CHECK-NEXT: .cfi_def_cfa_offset 8 26; CHECK-NEXT: retq 27; CHECK-NEXT: .LBB0_2: # %exceptional_return 28; CHECK-NEXT: .cfi_def_cfa_offset 32 29; CHECK-NEXT: .Ltmp2: 30; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax 31; CHECK-NEXT: addq $24, %rsp 32; CHECK-NEXT: .cfi_def_cfa_offset 8 33; CHECK-NEXT: retq 34 ptr addrspace(1) %obj1) 35gc "statepoint-example" personality ptr @"personality_function" { 36entry: 37 %0 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %obj, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %obj, ptr addrspace(1) %obj1), "deopt" (i32 0, i32 -1, i32 0, i32 0, i32 0)] 38 to label %invoke_safepoint_normal_dest unwind label %exceptional_return 39 40invoke_safepoint_normal_dest: 41 %obj.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %0, i32 0, i32 0) 42 %obj1.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %0, i32 1, i32 1) 43 br label %normal_return 44 45normal_return: 46 ret ptr addrspace(1) %obj.relocated 47 48exceptional_return: 49 %landing_pad = landingpad token 50 cleanup 51 %obj.relocated1 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 0, i32 0) 52 %obj1.relocated1 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 1, i32 1) 53 ret ptr addrspace(1) %obj1.relocated1 54} 55; CHECK-LABEL: GCC_except_table{{[0-9]+}}: 56; CHECK: .uleb128 .Ltmp{{[0-9]+}}-.Ltmp{{[0-9]+}} 57; CHECK: .uleb128 .Ltmp{{[0-9]+}}-.Lfunc_begin{{[0-9]+}} 58; CHECK: .byte 0 59; CHECK: .p2align 4 60 61define ptr addrspace(1) @test_result(ptr addrspace(1) %obj, 62; CHECK-LABEL: test_result: 63; CHECK: # %bb.0: # %entry 64; CHECK-NEXT: pushq %rax 65; CHECK-NEXT: .cfi_def_cfa_offset 16 66; CHECK-NEXT: movq %rdi, (%rsp) 67; CHECK-NEXT: .Ltmp4: 68; CHECK-NEXT: callq some_other_call@PLT 69; CHECK-NEXT: .Ltmp7: 70; CHECK-NEXT: .Ltmp5: 71; CHECK-NEXT: # %bb.1: # %normal_return 72; CHECK-NEXT: popq %rcx 73; CHECK-NEXT: .cfi_def_cfa_offset 8 74; CHECK-NEXT: retq 75; CHECK-NEXT: .LBB1_2: # %exceptional_return 76; CHECK-NEXT: .cfi_def_cfa_offset 16 77; CHECK-NEXT: .Ltmp6: 78; CHECK-NEXT: movq (%rsp), %rax 79; CHECK-NEXT: popq %rcx 80; CHECK-NEXT: .cfi_def_cfa_offset 8 81; CHECK-NEXT: retq 82 ptr addrspace(1) %obj1) 83 gc "statepoint-example" personality ptr @personality_function { 84entry: 85 %0 = invoke token (i64, i32, ptr addrspace(1) (ptr addrspace(1))*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr addrspace(1) (ptr addrspace(1))* elementtype(ptr addrspace(1) (ptr addrspace(1))) @some_other_call, i32 1, i32 0, ptr addrspace(1) %obj, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %obj, ptr addrspace(1) %obj1)] 86 to label %normal_return unwind label %exceptional_return 87 88normal_return: 89 %ret_val = call ptr addrspace(1) @llvm.experimental.gc.result.p1(token %0) 90 ret ptr addrspace(1) %ret_val 91 92exceptional_return: 93 %landing_pad = landingpad token 94 cleanup 95 %obj.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 0, i32 0) 96 ret ptr addrspace(1) %obj.relocated 97} 98; CHECK-LABEL: GCC_except_table{{[0-9]+}}: 99; CHECK: .uleb128 .Ltmp{{[0-9]+}}-.Ltmp{{[0-9]+}} 100; CHECK: .uleb128 .Ltmp{{[0-9]+}}-.Lfunc_begin{{[0-9]+}} 101; CHECK: .byte 0 102; CHECK: .p2align 4 103 104define ptr addrspace(1) @test_same_val(i1 %cond, ptr addrspace(1) %val1, ptr addrspace(1) %val2, ptr addrspace(1) %val3) 105; CHECK-LABEL: test_same_val: 106; CHECK: # %bb.0: # %entry 107; CHECK-NEXT: pushq %rbx 108; CHECK-NEXT: .cfi_def_cfa_offset 16 109; CHECK-NEXT: subq $16, %rsp 110; CHECK-NEXT: .cfi_def_cfa_offset 32 111; CHECK-NEXT: .cfi_offset %rbx, -16 112; CHECK-NEXT: movl %edi, %ebx 113; CHECK-NEXT: testb $1, %bl 114; CHECK-NEXT: je .LBB2_3 115; CHECK-NEXT: # %bb.1: # %left 116; CHECK-NEXT: movq %rsi, (%rsp) 117; CHECK-NEXT: movq %rdx, {{[0-9]+}}(%rsp) 118; CHECK-NEXT: .Ltmp11: 119; CHECK-NEXT: movq %rsi, %rdi 120; CHECK-NEXT: callq some_call@PLT 121; CHECK-NEXT: .Ltmp14: 122; CHECK-NEXT: .Ltmp12: 123; CHECK-NEXT: # %bb.2: # %left.relocs 124; CHECK-NEXT: movq (%rsp), %rax 125; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rcx 126; CHECK-NEXT: jmp .LBB2_5 127; CHECK-NEXT: .LBB2_3: # %right 128; CHECK-NEXT: movq %rdx, (%rsp) 129; CHECK-NEXT: movq %rcx, {{[0-9]+}}(%rsp) 130; CHECK-NEXT: .Ltmp8: 131; CHECK-NEXT: movq %rsi, %rdi 132; CHECK-NEXT: callq some_call@PLT 133; CHECK-NEXT: .Ltmp15: 134; CHECK-NEXT: .Ltmp9: 135; CHECK-NEXT: # %bb.4: # %right.relocs 136; CHECK-NEXT: movq (%rsp), %rcx 137; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax 138; CHECK-NEXT: .LBB2_5: # %normal_return 139; CHECK-NEXT: testb $1, %bl 140; CHECK-NEXT: cmoveq %rcx, %rax 141; CHECK-NEXT: .LBB2_6: # %normal_return 142; CHECK-NEXT: addq $16, %rsp 143; CHECK-NEXT: .cfi_def_cfa_offset 16 144; CHECK-NEXT: popq %rbx 145; CHECK-NEXT: .cfi_def_cfa_offset 8 146; CHECK-NEXT: retq 147; CHECK-NEXT: .LBB2_9: # %exceptional_return.right 148; CHECK-NEXT: .cfi_def_cfa_offset 32 149; CHECK-NEXT: .Ltmp10: 150; CHECK-NEXT: movq (%rsp), %rax 151; CHECK-NEXT: jmp .LBB2_6 152; CHECK-NEXT: .LBB2_7: # %exceptional_return.left 153; CHECK-NEXT: .Ltmp13: 154; CHECK-NEXT: movq (%rsp), %rax 155; CHECK-NEXT: jmp .LBB2_6 156 gc "statepoint-example" personality ptr @"personality_function" { 157entry: 158 br i1 %cond, label %left, label %right 159 160left: 161 %sp1 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %val1, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %val1, ptr addrspace(1) %val2)] 162 to label %left.relocs unwind label %exceptional_return.left 163 164left.relocs: 165 %val1.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp1, i32 0, i32 0) 166 %val2.relocated_left = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp1, i32 1, i32 1) 167 br label %normal_return 168 169right: 170 %sp2 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %val1, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %val2, ptr addrspace(1) %val3)] 171 to label %right.relocs unwind label %exceptional_return.right 172 173right.relocs: 174 %val2.relocated_right = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp2, i32 0, i32 0) 175 %val3.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp2, i32 1, i32 1) 176 br label %normal_return 177 178normal_return: 179 %a1 = phi ptr addrspace(1) [%val1.relocated, %left.relocs], [%val3.relocated, %right.relocs] 180 %a2 = phi ptr addrspace(1) [%val2.relocated_left, %left.relocs], [%val2.relocated_right, %right.relocs] 181 %ret = select i1 %cond, ptr addrspace(1) %a1, ptr addrspace(1) %a2 182 ret ptr addrspace(1) %ret 183 184exceptional_return.left: 185 %landing_pad = landingpad token 186 cleanup 187 %val.relocated2 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 0, i32 0) 188 ret ptr addrspace(1) %val.relocated2 189 190exceptional_return.right: 191 %landing_pad1 = landingpad token 192 cleanup 193 %val.relocated3 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad1, i32 0, i32 0) 194 ret ptr addrspace(1) %val.relocated3 195} 196 197define ptr addrspace(1) @test_null_undef(ptr addrspace(1) %val1) 198; CHECK-LABEL: test_null_undef: 199; CHECK: # %bb.0: # %entry 200; CHECK-NEXT: pushq %rax 201; CHECK-NEXT: .cfi_def_cfa_offset 16 202; CHECK-NEXT: .Ltmp16: 203; CHECK-NEXT: callq some_call@PLT 204; CHECK-NEXT: .Ltmp19: 205; CHECK-NEXT: .Ltmp17: 206; CHECK-NEXT: .LBB3_1: # %normal_return 207; CHECK-NEXT: xorl %eax, %eax 208; CHECK-NEXT: popq %rcx 209; CHECK-NEXT: .cfi_def_cfa_offset 8 210; CHECK-NEXT: retq 211; CHECK-NEXT: .LBB3_2: # %exceptional_return 212; CHECK-NEXT: .cfi_def_cfa_offset 16 213; CHECK-NEXT: .Ltmp18: 214; CHECK-NEXT: jmp .LBB3_1 215 gc "statepoint-example" personality ptr @"personality_function" { 216entry: 217 %sp1 = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %val1, i32 0, i32 0) ["gc-live"(ptr addrspace(1) null, ptr addrspace(1) undef)] 218 to label %normal_return unwind label %exceptional_return 219 220normal_return: 221 %null.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp1, i32 0, i32 0) 222 %undef.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp1, i32 1, i32 1) 223 ret ptr addrspace(1) %null.relocated 224 225exceptional_return: 226 %landing_pad = landingpad token 227 cleanup 228 %null.relocated2 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 0, i32 0) 229 %undef.relocated2 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 1, i32 1) 230 ret ptr addrspace(1) %null.relocated2 231} 232 233define ptr addrspace(1) @test_alloca_and_const(ptr addrspace(1) %val1) 234; CHECK-LABEL: test_alloca_and_const: 235; CHECK: # %bb.0: # %entry 236; CHECK-NEXT: pushq %rax 237; CHECK-NEXT: .cfi_def_cfa_offset 16 238; CHECK-NEXT: .Ltmp20: 239; CHECK-NEXT: callq some_call@PLT 240; CHECK-NEXT: .Ltmp23: 241; CHECK-NEXT: .Ltmp21: 242; CHECK-NEXT: # %bb.1: # %normal_return 243; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rax 244; CHECK-NEXT: popq %rcx 245; CHECK-NEXT: .cfi_def_cfa_offset 8 246; CHECK-NEXT: retq 247; CHECK-NEXT: .LBB4_2: # %exceptional_return 248; CHECK-NEXT: .cfi_def_cfa_offset 16 249; CHECK-NEXT: .Ltmp22: 250; CHECK-NEXT: movl $15, %eax 251; CHECK-NEXT: popq %rcx 252; CHECK-NEXT: .cfi_def_cfa_offset 8 253; CHECK-NEXT: retq 254 gc "statepoint-example" personality ptr @"personality_function" { 255entry: 256 %a = alloca i32 257 %aa = addrspacecast ptr %a to ptr addrspace(1) 258 %c = inttoptr i64 15 to ptr addrspace(1) 259 %sp = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void (ptr addrspace(1))) @some_call, i32 1, i32 0, ptr addrspace(1) %val1, i32 0, i32 0) ["gc-live"(ptr addrspace(1) %aa, ptr addrspace(1) %c)] 260 to label %normal_return unwind label %exceptional_return 261 262normal_return: 263 %aa.rel = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %sp, i32 0, i32 0) 264 ret ptr addrspace(1) %aa.rel 265 266exceptional_return: 267 %landing_pad = landingpad token 268 cleanup 269 %aa.rel2 = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %landing_pad, i32 1, i32 1) 270 ret ptr addrspace(1) %aa.rel2 271} 272 273declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...) 274 275declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32) 276declare ptr addrspace(1) @llvm.experimental.gc.result.p1(token) 277