73 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs < %s | FileCheck %s3 4; Check that we can handle gc.relocate in a separate block in spill mode.5 6target triple = "x86_64-pc-linux-gnu"7 8declare void @"some_call"(ptr addrspace(1))9declare i32 @"personality_function"()10 11define ptr addrspace(1) @test_invoke(ptr addrspace(1) %a, ptr addrspace(1) %b, ptr addrspace(1) %c, ptr addrspace(1) %d, ptr addrspace(1) %e, ptr addrspace(1) %f, ptr addrspace(1) %g, ptr addrspace(1) %h, ptr addrspace(1) %j, ptr addrspace(1) %k, ptr addrspace(1) %l, ptr addrspace(1) %m, ptr addrspace(1) %n, ptr addrspace(1) %o, ptr addrspace(1) %p, ptr addrspace(1) %q, ptr addrspace(1) %r, ptr addrspace(1) %s, ptr addrspace(1) %t)12; CHECK-LABEL: test_invoke:13; CHECK: # %bb.0: # %entry14; CHECK-NEXT: pushq %rax15; CHECK-NEXT: .cfi_def_cfa_offset 1616; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi17; CHECK-NEXT: movq %rdi, (%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 (%rsp), %rax24; CHECK-NEXT: popq %rcx25; CHECK-NEXT: .cfi_def_cfa_offset 826; CHECK-NEXT: retq27; CHECK-NEXT: .LBB0_2: # %exceptional_return28; CHECK-NEXT: .cfi_def_cfa_offset 1629; CHECK-NEXT: .Ltmp2:30; CHECK-NEXT: xorl %eax, %eax31; CHECK-NEXT: popq %rcx32; CHECK-NEXT: .cfi_def_cfa_offset 833; CHECK-NEXT: retq34gc "statepoint-example" personality ptr @"personality_function" {35entry:36 %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) %t, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %t)]37 to label %invoke_safepoint_normal_dest unwind label %exceptional_return38 39invoke_safepoint_normal_dest:40 %t.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %0, i32 0, i32 0)41 ret ptr addrspace(1) %t.relocated42 43exceptional_return:44 %landing_pad = landingpad token45 cleanup46 ret ptr addrspace(1) null47}48 49define ptr addrspace(1) @test_call(ptr addrspace(1) %a, ptr addrspace(1) %b, ptr addrspace(1) %c, ptr addrspace(1) %d, ptr addrspace(1) %e, ptr addrspace(1) %f, ptr addrspace(1) %g, ptr addrspace(1) %h, ptr addrspace(1) %j, ptr addrspace(1) %k, ptr addrspace(1) %l, ptr addrspace(1) %m, ptr addrspace(1) %n, ptr addrspace(1) %o, ptr addrspace(1) %p, ptr addrspace(1) %q, ptr addrspace(1) %r, ptr addrspace(1) %s, ptr addrspace(1) %t)50; CHECK-LABEL: test_call:51; CHECK: # %bb.0: # %entry52; CHECK-NEXT: pushq %rax53; CHECK-NEXT: .cfi_def_cfa_offset 1654; CHECK-NEXT: movq {{[0-9]+}}(%rsp), %rdi55; CHECK-NEXT: movq %rdi, (%rsp)56; CHECK-NEXT: callq some_call@PLT57; CHECK-NEXT: .Ltmp4:58; CHECK-NEXT: movq (%rsp), %rax59; CHECK-NEXT: popq %rcx60; CHECK-NEXT: .cfi_def_cfa_offset 861; CHECK-NEXT: retq62gc "statepoint-example" personality ptr @"personality_function" {63entry:64 %0 = call 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) %t, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %t)]65 br label %other_block66 67other_block:68 %t.relocated = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %0, i32 0, i32 0)69 ret ptr addrspace(1) %t.relocated70}71declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)72declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32)73