forked from OSchip/llvm-project
MachineInstrBundle: Fix reversed isSuperRegisterEq() call
Unfortunately this fix had the effect of exposing the -verify-machineinstrs FIXME of X86InstrInfo.cpp in two testcases for which I disabled it for now. Two testcases also have additional pushq/popq where the corrected code cannot prove that %rax is dead any longer. Looking at the examples, this could potentially be fixed by improving computeRegisterLiveness() to check the live-in lists of the successors blocks when reaching the end of a block. This fixes http://llvm.org/PR25951. llvm-svn: 256799
This commit is contained in:
parent
d84af9ba8b
commit
7e762e4f9c
|
@ -315,7 +315,7 @@ MachineOperandIteratorBase::analyzePhysReg(unsigned Reg,
|
||||||
if (!TRI->regsOverlap(MOReg, Reg))
|
if (!TRI->regsOverlap(MOReg, Reg))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
bool Covered = TRI->isSuperRegisterEq(MOReg, Reg);
|
bool Covered = TRI->isSuperRegisterEq(Reg, MOReg);
|
||||||
if (MO.readsReg()) {
|
if (MO.readsReg()) {
|
||||||
PRI.Read = true;
|
PRI.Read = true;
|
||||||
if (Covered) {
|
if (Covered) {
|
||||||
|
|
|
@ -4466,6 +4466,10 @@ void X86InstrInfo::copyPhysReg(MachineBasicBlock &MBB,
|
||||||
// (unnecessarily) saving+restoring a dead register. However the
|
// (unnecessarily) saving+restoring a dead register. However the
|
||||||
// MachineVerifier expects operands that read from dead registers
|
// MachineVerifier expects operands that read from dead registers
|
||||||
// to be marked with the "undef" flag.
|
// to be marked with the "undef" flag.
|
||||||
|
// An example of this can be found in
|
||||||
|
// test/CodeGen/X86/peephole-na-phys-copy-folding.ll and
|
||||||
|
// test/CodeGen/X86/cmpxchg-clobber-flags.ll when using
|
||||||
|
// -verify-machineinstrs.
|
||||||
BuildMI(MBB, MI, DL, get(Push)).addReg(AX, getKillRegState(true));
|
BuildMI(MBB, MI, DL, get(Push)).addReg(AX, getKillRegState(true));
|
||||||
}
|
}
|
||||||
if (FromEFLAGS) {
|
if (FromEFLAGS) {
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=i386-linux-gnu %s -o - | FileCheck %s -check-prefix=i386
|
; RUN: llc -mtriple=i386-linux-gnu %s -o - | FileCheck %s -check-prefix=i386
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=i386-linux-gnu -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=i386f
|
; RUN: llc -mtriple=i386-linux-gnu -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=i386f
|
||||||
|
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu %s -o - | FileCheck %s -check-prefix=x8664
|
; RUN: llc -mtriple=x86_64-linux-gnu %s -o - | FileCheck %s -check-prefix=x8664
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=x8664
|
; RUN: llc -mtriple=x86_64-linux-gnu -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=x8664
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu -mattr=+sahf %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sahf %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu -mattr=+sahf -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sahf -pre-RA-sched=fast %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu -mcpu=corei7 %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
; RUN: llc -mtriple=x86_64-linux-gnu -mcpu=corei7 %s -o - | FileCheck %s -check-prefix=x8664-sahf
|
||||||
|
|
||||||
|
; TODO: Reenable verify-machineinstr once the if (!AXDead) // FIXME
|
||||||
|
; in X86InstrInfo::copyPhysReg() is resolved.
|
||||||
|
|
||||||
declare i32 @foo()
|
declare i32 @foo()
|
||||||
declare i32 @bar(i64)
|
declare i32 @bar(i64)
|
||||||
|
@ -58,9 +61,11 @@ define i64 @test_intervening_call(i64* %foo, i64 %bar, i64 %baz) {
|
||||||
; x8664-sahf-NEXT: popq %rax
|
; x8664-sahf-NEXT: popq %rax
|
||||||
; x8664-sahf-NEXT: movq %rax, %rdi
|
; x8664-sahf-NEXT: movq %rax, %rdi
|
||||||
; x8664-sahf-NEXT: callq bar
|
; x8664-sahf-NEXT: callq bar
|
||||||
|
; x8664-sahf-NEXT: pushq %rax
|
||||||
; x8664-sahf-NEXT: movq [[FLAGS]], %rax
|
; x8664-sahf-NEXT: movq [[FLAGS]], %rax
|
||||||
; x8664-sahf-NEXT: addb $127, %al
|
; x8664-sahf-NEXT: addb $127, %al
|
||||||
; x8664-sahf-NEXT: sahf
|
; x8664-sahf-NEXT: sahf
|
||||||
|
; x8664-sahf-NEXT: popq %rax
|
||||||
; x8664-sahf-NEXT: jne
|
; x8664-sahf-NEXT: jne
|
||||||
|
|
||||||
%cx = cmpxchg i64* %foo, i64 %bar, i64 %baz seq_cst seq_cst
|
%cx = cmpxchg i64* %foo, i64 %bar, i64 %baz seq_cst seq_cst
|
||||||
|
@ -161,9 +166,11 @@ define i32 @test_feed_cmov(i32* %addr, i32 %desired, i32 %new) {
|
||||||
|
|
||||||
; x8664-sahf-LABEL: test_feed_cmov:
|
; x8664-sahf-LABEL: test_feed_cmov:
|
||||||
; x8664-sahf: cmpxchgl
|
; x8664-sahf: cmpxchgl
|
||||||
; x8664-sahf: seto %al
|
; x8664-sahf: pushq %rax
|
||||||
|
; x8664-sahf-NEXT: seto %al
|
||||||
; x8664-sahf-NEXT: lahf
|
; x8664-sahf-NEXT: lahf
|
||||||
; x8664-sahf-NEXT: movq %rax, [[FLAGS:%.*]]
|
; x8664-sahf-NEXT: movq %rax, [[FLAGS:%.*]]
|
||||||
|
; x8664-sahf-NEXT: popq %rax
|
||||||
; x8664-sahf-NEXT: callq foo
|
; x8664-sahf-NEXT: callq foo
|
||||||
; x8664-sahf-NEXT: pushq %rax
|
; x8664-sahf-NEXT: pushq %rax
|
||||||
; x8664-sahf-NEXT: movq [[FLAGS]], %rax
|
; x8664-sahf-NEXT: movq [[FLAGS]], %rax
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=i386-linux-gnu %s -o - | FileCheck %s
|
; RUN: llc -mtriple=i386-linux-gnu %s -o - | FileCheck %s
|
||||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-linux-gnu -mattr=+sahf %s -o - | FileCheck %s
|
; RUN: llc -mtriple=x86_64-linux-gnu -mattr=+sahf %s -o - | FileCheck %s
|
||||||
|
|
||||||
|
; TODO: Reenable verify-machineinstrs once the if (!AXDead) // FIXME in
|
||||||
|
; X86InstrInfo::copyPhysReg() is resolved.
|
||||||
|
|
||||||
; The peephole optimizer can elide some physical register copies such as
|
; The peephole optimizer can elide some physical register copies such as
|
||||||
; EFLAGS. Make sure the flags are used directly, instead of needlessly using
|
; EFLAGS. Make sure the flags are used directly, instead of needlessly using
|
||||||
|
|
Loading…
Reference in New Issue