277 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs < %s 2>&1 | FileCheck %s3 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: # %entry14; CHECK-NEXT: subq $24, %rsp15; CHECK-NEXT: .cfi_def_cfa_offset 3216; 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@PLT20; CHECK-NEXT: .Ltmp3:21; CHECK-NEXT: .Ltmp1:22; CHECK-NEXT: # %bb.1: # %invoke_safepoint_normal_dest23; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax24; CHECK-NEXT: addq $24, %rsp25; CHECK-NEXT: .cfi_def_cfa_offset 826; CHECK-NEXT: retq27; CHECK-NEXT: .LBB0_2: # %exceptional_return28; CHECK-NEXT: .cfi_def_cfa_offset 3229; CHECK-NEXT: .Ltmp2:30; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax31; CHECK-NEXT: addq $24, %rsp32; CHECK-NEXT: .cfi_def_cfa_offset 833; CHECK-NEXT: retq34 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_return39 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_return44 45normal_return:46 ret ptr addrspace(1) %obj.relocated47 48exceptional_return:49 %landing_pad = landingpad token50 cleanup51 %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.relocated154}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 059; CHECK: .p2align 460 61define ptr addrspace(1) @test_result(ptr addrspace(1) %obj,62; CHECK-LABEL: test_result:63; CHECK: # %bb.0: # %entry64; CHECK-NEXT: pushq %rax65; CHECK-NEXT: .cfi_def_cfa_offset 1666; CHECK-NEXT: movq %rdi, (%rsp)67; CHECK-NEXT: .Ltmp4:68; CHECK-NEXT: callq some_other_call@PLT69; CHECK-NEXT: .Ltmp7:70; CHECK-NEXT: .Ltmp5:71; CHECK-NEXT: # %bb.1: # %normal_return72; CHECK-NEXT: popq %rcx73; CHECK-NEXT: .cfi_def_cfa_offset 874; CHECK-NEXT: retq75; CHECK-NEXT: .LBB1_2: # %exceptional_return76; CHECK-NEXT: .cfi_def_cfa_offset 1677; CHECK-NEXT: .Ltmp6:78; CHECK-NEXT: movq (%rsp), %rax79; CHECK-NEXT: popq %rcx80; CHECK-NEXT: .cfi_def_cfa_offset 881; CHECK-NEXT: retq82 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_return87 88normal_return:89 %ret_val = call ptr addrspace(1) @llvm.experimental.gc.result.p1(token %0)90 ret ptr addrspace(1) %ret_val91 92exceptional_return:93 %landing_pad = landingpad token94 cleanup95 %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.relocated97}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 0102; CHECK: .p2align 4103 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: # %entry107; CHECK-NEXT: pushq %rbx108; CHECK-NEXT: .cfi_def_cfa_offset 16109; CHECK-NEXT: subq $16, %rsp110; CHECK-NEXT: .cfi_def_cfa_offset 32111; CHECK-NEXT: .cfi_offset %rbx, -16112; CHECK-NEXT: movl %edi, %ebx113; CHECK-NEXT: testb $1, %bl114; CHECK-NEXT: je .LBB2_3115; CHECK-NEXT: # %bb.1: # %left116; CHECK-NEXT: movq %rsi, (%rsp)117; CHECK-NEXT: movq %rdx, {{[0-9]+}}(%rsp)118; CHECK-NEXT: .Ltmp11:119; CHECK-NEXT: movq %rsi, %rdi120; CHECK-NEXT: callq some_call@PLT121; CHECK-NEXT: .Ltmp14:122; CHECK-NEXT: .Ltmp12:123; CHECK-NEXT: # %bb.2: # %left.relocs124; CHECK-NEXT: movq (%rsp), %rax125; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rcx126; CHECK-NEXT: jmp .LBB2_5127; CHECK-NEXT: .LBB2_3: # %right128; CHECK-NEXT: movq %rdx, (%rsp)129; CHECK-NEXT: movq %rcx, {{[0-9]+}}(%rsp)130; CHECK-NEXT: .Ltmp8:131; CHECK-NEXT: movq %rsi, %rdi132; CHECK-NEXT: callq some_call@PLT133; CHECK-NEXT: .Ltmp15:134; CHECK-NEXT: .Ltmp9:135; CHECK-NEXT: # %bb.4: # %right.relocs136; CHECK-NEXT: movq (%rsp), %rcx137; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rax138; CHECK-NEXT: .LBB2_5: # %normal_return139; CHECK-NEXT: testb $1, %bl140; CHECK-NEXT: cmoveq %rcx, %rax141; CHECK-NEXT: .LBB2_6: # %normal_return142; CHECK-NEXT: addq $16, %rsp143; CHECK-NEXT: .cfi_def_cfa_offset 16144; CHECK-NEXT: popq %rbx145; CHECK-NEXT: .cfi_def_cfa_offset 8146; CHECK-NEXT: retq147; CHECK-NEXT: .LBB2_9: # %exceptional_return.right148; CHECK-NEXT: .cfi_def_cfa_offset 32149; CHECK-NEXT: .Ltmp10:150; CHECK-NEXT: movq (%rsp), %rax151; CHECK-NEXT: jmp .LBB2_6152; CHECK-NEXT: .LBB2_7: # %exceptional_return.left153; CHECK-NEXT: .Ltmp13:154; CHECK-NEXT: movq (%rsp), %rax155; CHECK-NEXT: jmp .LBB2_6156 gc "statepoint-example" personality ptr @"personality_function" {157entry:158 br i1 %cond, label %left, label %right159 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.left163 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_return168 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.right172 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_return177 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) %a2182 ret ptr addrspace(1) %ret183 184exceptional_return.left:185 %landing_pad = landingpad token186 cleanup187 %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.relocated2189 190exceptional_return.right:191 %landing_pad1 = landingpad token192 cleanup193 %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.relocated3195}196 197define ptr addrspace(1) @test_null_undef(ptr addrspace(1) %val1)198; CHECK-LABEL: test_null_undef:199; CHECK: # %bb.0: # %entry200; CHECK-NEXT: pushq %rax201; CHECK-NEXT: .cfi_def_cfa_offset 16202; CHECK-NEXT: .Ltmp16:203; CHECK-NEXT: callq some_call@PLT204; CHECK-NEXT: .Ltmp19:205; CHECK-NEXT: .Ltmp17:206; CHECK-NEXT: .LBB3_1: # %normal_return207; CHECK-NEXT: xorl %eax, %eax208; CHECK-NEXT: popq %rcx209; CHECK-NEXT: .cfi_def_cfa_offset 8210; CHECK-NEXT: retq211; CHECK-NEXT: .LBB3_2: # %exceptional_return212; CHECK-NEXT: .cfi_def_cfa_offset 16213; CHECK-NEXT: .Ltmp18:214; CHECK-NEXT: jmp .LBB3_1215 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_return219 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.relocated224 225exceptional_return:226 %landing_pad = landingpad token227 cleanup228 %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.relocated2231}232 233define ptr addrspace(1) @test_alloca_and_const(ptr addrspace(1) %val1)234; CHECK-LABEL: test_alloca_and_const:235; CHECK: # %bb.0: # %entry236; CHECK-NEXT: pushq %rax237; CHECK-NEXT: .cfi_def_cfa_offset 16238; CHECK-NEXT: .Ltmp20:239; CHECK-NEXT: callq some_call@PLT240; CHECK-NEXT: .Ltmp23:241; CHECK-NEXT: .Ltmp21:242; CHECK-NEXT: # %bb.1: # %normal_return243; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rax244; CHECK-NEXT: popq %rcx245; CHECK-NEXT: .cfi_def_cfa_offset 8246; CHECK-NEXT: retq247; CHECK-NEXT: .LBB4_2: # %exceptional_return248; CHECK-NEXT: .cfi_def_cfa_offset 16249; CHECK-NEXT: .Ltmp22:250; CHECK-NEXT: movl $15, %eax251; CHECK-NEXT: popq %rcx252; CHECK-NEXT: .cfi_def_cfa_offset 8253; CHECK-NEXT: retq254 gc "statepoint-example" personality ptr @"personality_function" {255entry:256 %a = alloca i32257 %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_return261 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.rel265 266exceptional_return:267 %landing_pad = landingpad token268 cleanup269 %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.rel2271}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