xref: /aosp_15_r20/external/llvm/test/CodeGen/MIR/X86/used-physical-register-info.mir (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker# RUN: llc -march=x86-64 -start-after branch-folder -stop-after branch-folder -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker# This test ensures that the MIR parser parses the callee saved register mask
3*9880d681SAndroid Build Coastguard Worker# correctly and that the MIR parser can infer it as well.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker--- |
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker  define i32 @compute(i32 %a) #0 {
8*9880d681SAndroid Build Coastguard Worker  body:
9*9880d681SAndroid Build Coastguard Worker    %c = mul i32 %a, 11
10*9880d681SAndroid Build Coastguard Worker    ret i32 %c
11*9880d681SAndroid Build Coastguard Worker  }
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker  define i32 @foo(i32 %a) #0 {
14*9880d681SAndroid Build Coastguard Worker  entry:
15*9880d681SAndroid Build Coastguard Worker    %b = call i32 @compute(i32 %a)
16*9880d681SAndroid Build Coastguard Worker    ret i32 %b
17*9880d681SAndroid Build Coastguard Worker  }
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker  define i32 @bar(i32 %a) #0 {
20*9880d681SAndroid Build Coastguard Worker  entry:
21*9880d681SAndroid Build Coastguard Worker    %b = call i32 @compute(i32 %a)
22*9880d681SAndroid Build Coastguard Worker    ret i32 %b
23*9880d681SAndroid Build Coastguard Worker  }
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker  define i32 @empty(i32 %a) #0 {
26*9880d681SAndroid Build Coastguard Worker  entry:
27*9880d681SAndroid Build Coastguard Worker    %b = call i32 @compute(i32 %a)
28*9880d681SAndroid Build Coastguard Worker    ret i32 %b
29*9880d681SAndroid Build Coastguard Worker  }
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  attributes #0 = { "no-frame-pointer-elim"="false" }
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker...
34*9880d681SAndroid Build Coastguard Worker---
35*9880d681SAndroid Build Coastguard Worker# CHECK: name: compute
36*9880d681SAndroid Build Coastguard Worker# CHECK: liveins:
37*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: - { reg: '%edi' }
38*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT: frameInfo:
39*9880d681SAndroid Build Coastguard Workername:            compute
40*9880d681SAndroid Build Coastguard Workerliveins:
41*9880d681SAndroid Build Coastguard Worker  - { reg: '%edi' }
42*9880d681SAndroid Build Coastguard WorkerframeInfo:
43*9880d681SAndroid Build Coastguard Worker  stackSize:     8
44*9880d681SAndroid Build Coastguard Workerbody: |
45*9880d681SAndroid Build Coastguard Worker  bb.0.body:
46*9880d681SAndroid Build Coastguard Worker    liveins: %edi
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker    %eax = IMUL32rri8 %edi, 11, implicit-def %eflags
49*9880d681SAndroid Build Coastguard Worker    RETQ %eax
50*9880d681SAndroid Build Coastguard Worker...
51*9880d681SAndroid Build Coastguard Worker---
52*9880d681SAndroid Build Coastguard Workername:            foo
53*9880d681SAndroid Build Coastguard Workerliveins:
54*9880d681SAndroid Build Coastguard Worker  - { reg: '%edi' }
55*9880d681SAndroid Build Coastguard Worker# CHECK: name: foo
56*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
57*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
58*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
59*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
60*9880d681SAndroid Build Coastguard WorkercalleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
61*9880d681SAndroid Build Coastguard Worker                        '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
62*9880d681SAndroid Build Coastguard Worker                        '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
63*9880d681SAndroid Build Coastguard Worker                        '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
64*9880d681SAndroid Build Coastguard Workerbody: |
65*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
66*9880d681SAndroid Build Coastguard Worker    liveins: %edi
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker    PUSH64r %rax, implicit-def %rsp, implicit %rsp
69*9880d681SAndroid Build Coastguard Worker    CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax
70*9880d681SAndroid Build Coastguard Worker    %rdx = POP64r implicit-def %rsp, implicit %rsp
71*9880d681SAndroid Build Coastguard Worker    RETQ %eax
72*9880d681SAndroid Build Coastguard Worker...
73*9880d681SAndroid Build Coastguard Worker---
74*9880d681SAndroid Build Coastguard Workername:            bar
75*9880d681SAndroid Build Coastguard Workerliveins:
76*9880d681SAndroid Build Coastguard Worker  - { reg: '%edi' }
77*9880d681SAndroid Build Coastguard Worker# Verify that the callee saved register can be inferred from register mask
78*9880d681SAndroid Build Coastguard Worker# machine operands:
79*9880d681SAndroid Build Coastguard Worker# CHECK: name: bar
80*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
81*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
82*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
83*9880d681SAndroid Build Coastguard Worker# CHECK-NEXT:                    '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
84*9880d681SAndroid Build Coastguard Workerbody: |
85*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
86*9880d681SAndroid Build Coastguard Worker    liveins: %edi
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker    PUSH64r %rax, implicit-def %rsp, implicit %rsp
89*9880d681SAndroid Build Coastguard Worker    CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax
90*9880d681SAndroid Build Coastguard Worker    %rdx = POP64r implicit-def %rsp, implicit %rsp
91*9880d681SAndroid Build Coastguard Worker    RETQ %eax
92*9880d681SAndroid Build Coastguard Worker...
93*9880d681SAndroid Build Coastguard Worker---
94*9880d681SAndroid Build Coastguard Workername:            empty
95*9880d681SAndroid Build Coastguard Workerliveins:
96*9880d681SAndroid Build Coastguard Worker  - { reg: '%edi' }
97*9880d681SAndroid Build Coastguard Worker# Verify that the callee saved register can be empty.
98*9880d681SAndroid Build Coastguard Worker# CHECK: name: empty
99*9880d681SAndroid Build Coastguard Worker# CHECK: calleeSavedRegisters: [ ]
100*9880d681SAndroid Build Coastguard WorkercalleeSavedRegisters: [ ]
101*9880d681SAndroid Build Coastguard Workerbody: |
102*9880d681SAndroid Build Coastguard Worker  bb.0.entry:
103*9880d681SAndroid Build Coastguard Worker    liveins: %edi
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker    PUSH64r %rax, implicit-def %rsp, implicit %rsp
106*9880d681SAndroid Build Coastguard Worker    CALL64pcrel32 @compute, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, implicit-def %eax
107*9880d681SAndroid Build Coastguard Worker    %rdx = POP64r implicit-def %rsp, implicit %rsp
108*9880d681SAndroid Build Coastguard Worker    RETQ %eax
109*9880d681SAndroid Build Coastguard Worker...
110