forked from OSchip/llvm-project
65 lines
1.4 KiB
YAML
65 lines
1.4 KiB
YAML
# 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
|
|
tracksRegLiveness: true
|
|
liveins:
|
|
- { reg: '$edi' }
|
|
body: |
|
|
bb.0.entry:
|
|
liveins: $edi
|
|
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
|
|
|
|
...
|