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