| # RUN: llc -run-pass postrapseudos -mtriple=i386-apple-macosx -o - %s | FileCheck %s |
| |
| # Verify that we correctly save and restore eax when copying eflags, |
| # even when only a smaller alias of eax is used. We used to check only |
| # eax and not its aliases. |
| # PR27624. |
| |
| --- | |
| target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" |
| |
| define void @foo() { |
| entry: |
| br label %false |
| false: |
| ret void |
| } |
| |
| ... |
| |
| --- |
| name: foo |
| allVRegsAllocated: true |
| isSSA: false |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '%edi' } |
| body: | |
| bb.0.entry: |
| liveins: %edi |
| successors: %bb.1.false |
| NOOP implicit-def %al |
| |
| ; The bug was triggered only when LivePhysReg is used, which |
| ; happens only when the heuristic for the liveness computation |
| ; failed. The liveness computation heuristic looks at 10 instructions |
| ; before and after the copy. Make sure we do not reach the definition of |
| ; AL in 10 instructions, otherwise the heuristic will see that it is live. |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| NOOP |
| ; Save AL. |
| ; CHECK: PUSH32r killed %eax |
| |
| ; Copy EDI into EFLAGS |
| ; CHECK-NEXT: %eax = MOV32rr %edi |
| ; CHECK-NEXT: %al = ADD8ri %al, 127, implicit-def %eflags |
| ; CHECK-NEXT: SAHF implicit-def %eflags, implicit %ah |
| %eflags = COPY %edi |
| |
| ; Restore AL. |
| ; CHECK-NEXT: %eax = POP32r |
| bb.1.false: |
| liveins: %al |
| NOOP implicit %al |
| RETQ |
| |
| ... |