brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.2 KiB · da02acd Raw
80 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -max-registers-for-gc-values=256 -use-registers-for-deopt-values=true -code-model=large -fixup-allow-gcptr-in-csr=true < %s | FileCheck %s3 4; The test checks that Greedy register allocator should not split single basic block5; if it has only one non-statepoint use. Otherwise we may a redundant register usage.6 7target datalayout = "e-i64:64-f80:128-n8:16:32:64-S128"8target triple = "x86_64-pc-win64"9 10define ptr addrspace(1) @foo(ptr addrspace(1) %arg) gc "statepoint-example" {11; CHECK-LABEL: foo:12; CHECK:       # %bb.0: # %entry13; CHECK-NEXT:    pushq %rbp14; CHECK-NEXT:    .cfi_def_cfa_offset 1615; CHECK-NEXT:    pushq %r1516; CHECK-NEXT:    .cfi_def_cfa_offset 2417; CHECK-NEXT:    pushq %r1418; CHECK-NEXT:    .cfi_def_cfa_offset 3219; CHECK-NEXT:    pushq %r1320; CHECK-NEXT:    .cfi_def_cfa_offset 4021; CHECK-NEXT:    pushq %r1222; CHECK-NEXT:    .cfi_def_cfa_offset 4823; CHECK-NEXT:    pushq %rbx24; CHECK-NEXT:    .cfi_def_cfa_offset 5625; CHECK-NEXT:    pushq %rax26; CHECK-NEXT:    .cfi_def_cfa_offset 6427; CHECK-NEXT:    .cfi_offset %rbx, -5628; CHECK-NEXT:    .cfi_offset %r12, -4829; CHECK-NEXT:    .cfi_offset %r13, -4030; CHECK-NEXT:    .cfi_offset %r14, -3231; CHECK-NEXT:    .cfi_offset %r15, -2432; CHECK-NEXT:    .cfi_offset %rbp, -1633; CHECK-NEXT:    movq %rdi, (%rsp) # 8-byte Spill34; CHECK-NEXT:    movabsq $nocsr, %rax35; CHECK-NEXT:    callq *%rax36; CHECK-NEXT:    movabsq $bar, %rax37; CHECK-NEXT:    movq (%rsp), %rdi # 8-byte Reload38; CHECK-NEXT:    callq *%rax # 8-byte Folded Reload39; CHECK-NEXT:  .Ltmp0:40; CHECK-NEXT:    movabsq $nocsr, %rax41; CHECK-NEXT:    callq *%rax42; CHECK-NEXT:    movq (%rsp), %rax # 8-byte Reload43; CHECK-NEXT:    addq $8, %rsp44; CHECK-NEXT:    .cfi_def_cfa_offset 5645; CHECK-NEXT:    popq %rbx46; CHECK-NEXT:    .cfi_def_cfa_offset 4847; CHECK-NEXT:    popq %r1248; CHECK-NEXT:    .cfi_def_cfa_offset 4049; CHECK-NEXT:    popq %r1350; CHECK-NEXT:    .cfi_def_cfa_offset 3251; CHECK-NEXT:    popq %r1452; CHECK-NEXT:    .cfi_def_cfa_offset 2453; CHECK-NEXT:    popq %r1554; CHECK-NEXT:    .cfi_def_cfa_offset 1655; CHECK-NEXT:    popq %rbp56; CHECK-NEXT:    .cfi_def_cfa_offset 857; CHECK-NEXT:    retq58entry:59  ; force spill %arg on stack.60  call void @nocsr()61  br label %do_call62 63do_call:64  ; Basic block with two use intructions inside:65  ; copy to rdi as an argument to call and use in statepoint instruction as gc-live and deopt value.66  %statepoint_token = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void (ptr addrspace(1))) @bar, i32 1, i32 0, ptr addrspace(1) %arg, i32 0, i32 0) [ "deopt"(ptr addrspace(1) %arg), "gc-live"(ptr addrspace(1) %arg) ]67  %arg.reloc = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %statepoint_token, i32 0, i32 0)68  br label %next69 70next:71  ; force spill %arg.reloc on stack.72  call void @nocsr()73  ret ptr addrspace(1) %arg.reloc74}75 76declare void @nocsr() "no_callee_saved_registers"77declare void @bar(ptr addrspace(1))78declare token @llvm.experimental.gc.statepoint.p0(i64 immarg, i32 immarg, ptr, i32 immarg, i32 immarg, ...)79declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32 immarg, i32 immarg)80