xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/pr27681.mir (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker# RUN: llc -mtriple=i386-unknown-linux-gnu -mcpu=slm -run-pass post-RA-sched -o - %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker#
3*9880d681SAndroid Build Coastguard Worker# Verify that the critical antidependence breaker does not consider
4*9880d681SAndroid Build Coastguard Worker# a high byte register as available as a replacement register
5*9880d681SAndroid Build Coastguard Worker# in a certain context.
6*9880d681SAndroid Build Coastguard Worker--- |
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker  define void @main() { ret void }
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker...
11*9880d681SAndroid Build Coastguard Worker---
12*9880d681SAndroid Build Coastguard Worker# CHECK-LABEL: main
13*9880d681SAndroid Build Coastguard Workername:            main
14*9880d681SAndroid Build Coastguard WorkerallVRegsAllocated: true
15*9880d681SAndroid Build Coastguard WorkertracksRegLiveness: true
16*9880d681SAndroid Build Coastguard WorkerframeInfo:
17*9880d681SAndroid Build Coastguard Worker  stackSize:       52
18*9880d681SAndroid Build Coastguard WorkerfixedStack:
19*9880d681SAndroid Build Coastguard Worker  - { id: 0, type: spill-slot, offset: -20, size: 4, alignment: 4, callee-saved-register: '%esi' }
20*9880d681SAndroid Build Coastguard Worker  - { id: 1, type: spill-slot, offset: -16, size: 4, alignment: 4, callee-saved-register: '%edi' }
21*9880d681SAndroid Build Coastguard Worker  - { id: 2, type: spill-slot, offset: -12, size: 4, alignment: 4, callee-saved-register: '%ebx' }
22*9880d681SAndroid Build Coastguard Worker  - { id: 3, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '%ebp' }
23*9880d681SAndroid Build Coastguard Workerstack:
24*9880d681SAndroid Build Coastguard Worker  - { id: 0, type: spill-slot, offset: -53, size: 1, alignment: 1 }
25*9880d681SAndroid Build Coastguard Worker  - { id: 1, type: spill-slot, offset: -48, size: 4, alignment: 4 }
26*9880d681SAndroid Build Coastguard Worker  - { id: 2, type: spill-slot, offset: -32, size: 4, alignment: 4 }
27*9880d681SAndroid Build Coastguard Workerbody:             |
28*9880d681SAndroid Build Coastguard Worker  bb.0:
29*9880d681SAndroid Build Coastguard Worker    successors: %bb.1
30*9880d681SAndroid Build Coastguard Worker    liveins: %ebp, %ebx, %edi, %esi
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker    frame-setup PUSH32r killed %ebp, implicit-def %esp, implicit %esp
33*9880d681SAndroid Build Coastguard Worker    frame-setup PUSH32r killed %ebx, implicit-def %esp, implicit %esp
34*9880d681SAndroid Build Coastguard Worker    frame-setup PUSH32r killed %edi, implicit-def %esp, implicit %esp
35*9880d681SAndroid Build Coastguard Worker    frame-setup PUSH32r killed %esi, implicit-def %esp, implicit %esp
36*9880d681SAndroid Build Coastguard Worker    %esp = frame-setup SUB32ri8 %esp, 36, implicit-def dead %eflags
37*9880d681SAndroid Build Coastguard Worker    %eax = MOV32ri 1
38*9880d681SAndroid Build Coastguard Worker    %ebp = MOV32ri 2
39*9880d681SAndroid Build Coastguard Worker    %ebx = MOV32ri 3
40*9880d681SAndroid Build Coastguard Worker    %ecx = MOV32ri 4
41*9880d681SAndroid Build Coastguard Worker    %edi = MOV32ri 5
42*9880d681SAndroid Build Coastguard Worker    %edx = MOV32ri 6
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  bb.1:
45*9880d681SAndroid Build Coastguard Worker    successors: %bb.3, %bb.2
46*9880d681SAndroid Build Coastguard Worker    liveins: %eax, %ebp, %ebx, %ecx, %edi, %edx
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker    %ebp = SHR32rCL killed %ebp, implicit-def dead %eflags, implicit %cl
49*9880d681SAndroid Build Coastguard Worker    %ebp = XOR32rr killed %ebp, killed %ebx, implicit-def dead %eflags
50*9880d681SAndroid Build Coastguard Worker    TEST32rr %edx, %edx, implicit-def %eflags
51*9880d681SAndroid Build Coastguard Worker    %cl = SETNEr implicit %eflags
52*9880d681SAndroid Build Coastguard Worker    ; This %bl def is antidependent on the above use of %ebx
53*9880d681SAndroid Build Coastguard Worker    %bl = MOV8rm %esp, 1, _, 3, _ ; :: (load 1 from %stack.0)
54*9880d681SAndroid Build Coastguard Worker    %cl = OR8rr killed %cl, %bl, implicit-def dead %eflags
55*9880d681SAndroid Build Coastguard Worker    %esi = MOVZX32rr8 killed %cl
56*9880d681SAndroid Build Coastguard Worker    %esi = ADD32rr killed %esi, killed %edi, implicit-def dead %eflags
57*9880d681SAndroid Build Coastguard Worker    %ecx = MOV32rm %esp, 1, _, 24, _ ; :: (load 4 from %stack.2)
58*9880d681SAndroid Build Coastguard Worker    %edx = SAR32rCL killed %edx, implicit-def dead %eflags, implicit %cl
59*9880d681SAndroid Build Coastguard Worker    TEST32rr killed %edx, %edx, implicit-def %eflags
60*9880d681SAndroid Build Coastguard Worker    %cl = SETNEr implicit %eflags
61*9880d681SAndroid Build Coastguard Worker    ; Verify that removal of the %bl antidependence does not use %ch
62*9880d681SAndroid Build Coastguard Worker    ; as a replacement register.
63*9880d681SAndroid Build Coastguard Worker    ; CHECK: %cl = AND8rr %cl, killed %b
64*9880d681SAndroid Build Coastguard Worker    %cl = AND8rr killed %cl, killed %bl, implicit-def dead %eflags
65*9880d681SAndroid Build Coastguard Worker    CMP32ri8 %ebp, -1, implicit-def %eflags
66*9880d681SAndroid Build Coastguard Worker    %edx = MOV32ri 0
67*9880d681SAndroid Build Coastguard Worker    JE_1 %bb.3, implicit %eflags
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker  bb.2:
70*9880d681SAndroid Build Coastguard Worker    successors: %bb.3
71*9880d681SAndroid Build Coastguard Worker    liveins: %cl, %eax, %ebp, %esi
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Worker    OR32mr %esp, 1, _, 8, _, killed %eax, implicit-def %eflags ; :: (store 4 into %stack.1)
74*9880d681SAndroid Build Coastguard Worker    %dl = SETNEr implicit %eflags, implicit-def %edx
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker  bb.3:
77*9880d681SAndroid Build Coastguard Worker    liveins: %cl, %ebp, %edx, %esi
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker    %eax = XOR32rr undef %eax, undef %eax, implicit-def dead %eflags
80*9880d681SAndroid Build Coastguard Worker    %esp = ADD32ri8 %esp, 36, implicit-def dead %eflags
81*9880d681SAndroid Build Coastguard Worker    %esi = POP32r implicit-def %esp, implicit %esp
82*9880d681SAndroid Build Coastguard Worker    %edi = POP32r implicit-def %esp, implicit %esp
83*9880d681SAndroid Build Coastguard Worker    %ebx = POP32r implicit-def %esp, implicit %esp
84*9880d681SAndroid Build Coastguard Worker    %ebp = POP32r implicit-def %esp, implicit %esp
85*9880d681SAndroid Build Coastguard Worker    RET 0, %eax
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker...
88