[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
[llvm-project.git] / llvm / test / CodeGen / X86 / regalloc-tight-invoke.ll
blob6ced8c79aa98b95937f3f6dc944afb8ed4d62b5e
1 ; RUN: llc -O0 -mtriple=x86_64-apple-darwin %s -o - | FileCheck %s
2 declare void @foo(i32, ...)
4 declare i32 @__gxx_personality_v0(...)
6 ; We were running out of registers for this invoke, because:
8 ;     1. The lshr/and pattern gets matched to a no-REX MOV so that ah/bh/... can
9 ;        be used instead, cutting available registers for %b.arg down to eax, ebx,
10 ;        ecx, edx, esi, edi.
11 ;     2. We have a base pointer taking ebx out of contention.
12 ;     3. The landingpad block convinced us we should be defining rax here.
13 ;     3. The al fiddling for the varargs call only noted down that al was spillable,
14 ;        not ah or hax.
16 ; So by the time we need to allocate a register for the call all registers are
17 ; tied up and unspillable.
19 ; CHECK-LABEL: bar:
20 ; CHECK: xorl %edi, %edi
21 ; CHECK: movb %dil, {{[0-9]+}}(%rbx)
22 ; CHECK: movb {{[0-9]+}}(%rbx), %al
24 define i32 @bar(i32 %a, i32 %b, i32 %c, i32 %d, ...) personality ptr @__gxx_personality_v0 {
25   %mem = alloca i32, i32 %a, align 32   ; Force rbx to be used as a base pointer
26   %b.tmp = lshr i32 %b, 8
27   %b.arg = and i32 %b.tmp, 255
28   invoke void(i32, ...) @foo(i32 42, ptr %mem, i32 %c, i32 %d, i32 %b.arg) to label %success unwind label %fail
30 success:
31   ret i32 0
32 fail:
33   %exc = landingpad { ptr, i32 } cleanup
34   %res = extractvalue { ptr, i32 } %exc, 1
35   ret i32 %res
38 ; CHECK-LABEL: live:
39 ; CHECK: movl {{%.*}}, %eax
41 define i32 @live(i32 %a, i32 %b, i32 %c, i32 %d, ...) personality ptr @__gxx_personality_v0 {
42   %mem = alloca i32, i32 %a, align 32   ; Force rbx to be used as a base pointer
43   %b.tmp = lshr i32 %b, 8
44   %b.arg = and i32 %b.tmp, 255
45   invoke void(i32, ...) @foo(i32 42) to label %success unwind label %fail
47 success:
48   ret i32 0
49 fail:
50   %exc = landingpad { ptr, i32 } cleanup
51   %res = extractvalue { ptr, i32 } %exc, 1
52   ret i32 %b.arg