1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 20:43:44 +02:00
llvm-mirror/test/CodeGen/X86/pr27681.mir
Matthias Braun 8bd22a21c9 ScheduleDAGInstrs: Fix fixupKills()
Rewrite fixupKills() to use the LivePhysRegs class. Simplifies the code
and fixes a bug where the CSR registers in return blocks where missed
leading to invalid kill flags. Also remove the unnecessary rule that we
wouldn't set kill flags on tied operands.

No tests as I have an upcoming commit improving MachineVerifier checks
to catch these cases in multiple existing lit tests.

llvm-svn: 304055
2017-05-27 02:50:50 +00:00

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 = SETNEr implicit %eflags
; This %bl def is antidependent on the above use of %ebx
%bl = MOV8rm %esp, 1, _, 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, _, 24, _ ; :: (load 4 from %stack.2)
%edx = SAR32rCL killed %edx, implicit-def dead %eflags, implicit %cl
TEST32rr killed %edx, %edx, implicit-def %eflags
%cl = SETNEr 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
JE_1 %bb.3, implicit %eflags
bb.2:
liveins: %cl, %eax, %ebp, %esi
OR32mr %esp, 1, _, 8, _, killed %eax, implicit-def %eflags ; :: (store 4 into %stack.1)
%dl = SETNEr 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
...