84 lines
3.2 KiB
YAML
84 lines
3.2 KiB
YAML
# RUN: llc -mtriple=i386-unknown-linux-gnu -mcpu=slm -run-pass post-RA-sched -o - %s | FileCheck %s
|
|
#
|
|
# Verify that the critical antidependence breaker does not consider
|
|
# a high byte register as available as a replacement register
|
|
# in a certain context.
|
|
--- |
|
|
|
|
define void @main() { ret void }
|
|
|
|
...
|
|
---
|
|
# CHECK-LABEL: main
|
|
name: main
|
|
tracksRegLiveness: true
|
|
frameInfo:
|
|
stackSize: 52
|
|
fixedStack:
|
|
- { id: 0, type: spill-slot, offset: -20, size: 4, alignment: 4, callee-saved-register: '$esi' }
|
|
- { id: 1, type: spill-slot, offset: -16, size: 4, alignment: 4, callee-saved-register: '$edi' }
|
|
- { id: 2, type: spill-slot, offset: -12, size: 4, alignment: 4, callee-saved-register: '$ebx' }
|
|
- { id: 3, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '$ebp' }
|
|
stack:
|
|
- { id: 0, type: spill-slot, offset: -53, size: 1, alignment: 1 }
|
|
- { id: 1, type: spill-slot, offset: -48, size: 4, alignment: 4 }
|
|
- { id: 2, type: spill-slot, offset: -32, size: 4, alignment: 4 }
|
|
body: |
|
|
bb.0:
|
|
liveins: $ebp, $ebx, $edi, $esi
|
|
|
|
frame-setup PUSH32r killed $ebp, implicit-def $esp, implicit $esp
|
|
frame-setup PUSH32r killed $ebx, implicit-def $esp, implicit $esp
|
|
frame-setup PUSH32r killed $edi, implicit-def $esp, implicit $esp
|
|
frame-setup PUSH32r killed $esi, implicit-def $esp, implicit $esp
|
|
$esp = frame-setup SUB32ri8 $esp, 36, implicit-def dead $eflags
|
|
$eax = MOV32ri 1
|
|
$ebp = MOV32ri 2
|
|
$ebx = MOV32ri 3
|
|
$ecx = MOV32ri 4
|
|
$edi = MOV32ri 5
|
|
$edx = MOV32ri 6
|
|
|
|
bb.1:
|
|
liveins: $eax, $ebp, $ebx, $ecx, $edi, $edx
|
|
|
|
$ebp = SHR32rCL killed $ebp, implicit-def dead $eflags, implicit $cl
|
|
$ebp = XOR32rr killed $ebp, killed $ebx, implicit-def dead $eflags
|
|
TEST32rr $edx, $edx, implicit-def $eflags
|
|
$cl = SETCCr 5, implicit $eflags
|
|
; This %bl def is antidependent on the above use of $ebx
|
|
$bl = MOV8rm $esp, 1, $noreg, 3, _ ; :: (load 1 from %stack.0)
|
|
$cl = OR8rr killed $cl, $bl, implicit-def dead $eflags
|
|
$esi = MOVZX32rr8 killed $cl
|
|
$esi = ADD32rr killed $esi, killed $edi, implicit-def dead $eflags
|
|
$ecx = MOV32rm $esp, 1, $noreg, 24, _ ; :: (load 4 from %stack.2)
|
|
$edx = SAR32rCL killed $edx, implicit-def dead $eflags, implicit $cl
|
|
TEST32rr killed $edx, $edx, implicit-def $eflags
|
|
$cl = SETCCr 5, implicit $eflags
|
|
; Verify that removal of the $bl antidependence does not use $ch
|
|
; as a replacement register.
|
|
; CHECK: $cl = AND8rr killed $cl, killed $b
|
|
$cl = AND8rr killed $cl, killed $bl, implicit-def dead $eflags
|
|
CMP32ri8 $ebp, -1, implicit-def $eflags
|
|
$edx = MOV32ri 0
|
|
JCC_1 %bb.3, 4, implicit $eflags
|
|
|
|
bb.2:
|
|
liveins: $cl, $eax, $ebp, $esi
|
|
|
|
OR32mr $esp, 1, $noreg, 8, $noreg, killed $eax, implicit-def $eflags ; :: (store 4 into %stack.1)
|
|
$dl = SETCCr 5, implicit $eflags, implicit-def $edx
|
|
|
|
bb.3:
|
|
liveins: $cl, $ebp, $edx, $esi
|
|
|
|
$eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags
|
|
$esp = ADD32ri8 $esp, 36, implicit-def dead $eflags
|
|
$esi = POP32r implicit-def $esp, implicit $esp
|
|
$edi = POP32r implicit-def $esp, implicit $esp
|
|
$ebx = POP32r implicit-def $esp, implicit $esp
|
|
$ebp = POP32r implicit-def $esp, implicit $esp
|
|
RET 0, $eax
|
|
|
|
...
|