xref: /llvm-project/llvm/test/CodeGen/X86/statepoint-spill-lowering.ll (revision 785dc76c6667d0ea81c8b877dbff9c1e843918d6)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -verify-machineinstrs < %s | FileCheck %s
3
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: # %entry
14; CHECK-NEXT:    pushq %rax
15; CHECK-NEXT:    .cfi_def_cfa_offset 16
16; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rdi
17; CHECK-NEXT:    movq %rdi, (%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 (%rsp), %rax
24; CHECK-NEXT:    popq %rcx
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 16
29; CHECK-NEXT:  .Ltmp2:
30; CHECK-NEXT:    xorl %eax, %eax
31; CHECK-NEXT:    popq %rcx
32; CHECK-NEXT:    .cfi_def_cfa_offset 8
33; CHECK-NEXT:    retq
34gc "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_return
38
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.relocated
42
43exceptional_return:
44  %landing_pad = landingpad token
45          cleanup
46  ret ptr addrspace(1) null
47}
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: # %entry
52; CHECK-NEXT:    pushq %rax
53; CHECK-NEXT:    .cfi_def_cfa_offset 16
54; CHECK-NEXT:    movq {{[0-9]+}}(%rsp), %rdi
55; CHECK-NEXT:    movq %rdi, (%rsp)
56; CHECK-NEXT:    callq some_call@PLT
57; CHECK-NEXT:  .Ltmp4:
58; CHECK-NEXT:    movq (%rsp), %rax
59; CHECK-NEXT:    popq %rcx
60; CHECK-NEXT:    .cfi_def_cfa_offset 8
61; CHECK-NEXT:    retq
62gc "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_block
66
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.relocated
70}
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