llvm.org GIT mirror llvm / release_60 test / CodeGen / X86 / pr27681.mir
release_60

Tree @release_60 (Download .tar.gz)

pr27681.mir @release_60raw · history · blame

# 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, %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 = 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, %noreg, 8, %noreg, 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

...