From: Quentin Colombet Date: Tue, 26 Apr 2016 23:14:32 +0000 (+0000) Subject: [X86] Teach the expansion of copy instructions how to do proper liveness. X-Git-Tag: llvmorg-3.9.0-rc1~7860 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2b3a4e787e034d201da145642fd00dbcfbfa032d;p=platform%2Fupstream%2Fllvm.git [X86] Teach the expansion of copy instructions how to do proper liveness. When the simple analysis provided by MachineBasicBlock::computeRegisterLiveness fails, fall back on the LivePhysReg utility. llvm-svn: 267623 --- diff --git a/llvm/lib/Target/X86/X86InstrInfo.cpp b/llvm/lib/Target/X86/X86InstrInfo.cpp index 08818856..cbd515a 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.cpp +++ b/llvm/lib/Target/X86/X86InstrInfo.cpp @@ -18,6 +18,7 @@ #include "X86Subtarget.h" #include "X86TargetMachine.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/CodeGen/LivePhysRegs.h" #include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineDominators.h" @@ -4516,22 +4517,28 @@ void X86InstrInfo::copyPhysReg(MachineBasicBlock &MBB, // first frame index. // See X86ISelLowering.cpp - X86::hasCopyImplyingStackAdjustment. - - bool AXDead = (Reg == AX) || - (MachineBasicBlock::LQR_Dead == - MBB.computeRegisterLiveness(&getRegisterInfo(), AX, MI)); - if (!AXDead) { - // FIXME: If computeRegisterLiveness() reported LQR_Unknown then AX may - // actually be dead. This is not a problem for correctness as we are just - // (unnecessarily) saving+restoring a dead register. However the - // MachineVerifier expects operands that read from dead registers - // 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)); + MachineBasicBlock::LivenessQueryResult LQR = + MBB.computeRegisterLiveness(&getRegisterInfo(), AX, MI); + // We do not want to save and restore AX if we do not have to. + // Moreover, if we do so whereas AX is dead, we would need to set + // an undef flag on the use of AX, otherwise the verifier will + // complain that we read an undef value. + // We do not want to change the behavior of the machine verifier + // as this is usually wrong to read an undef value. + if (MachineBasicBlock::LQR_Unknown == LQR) { + LivePhysRegs LPR(&getRegisterInfo()); + LPR.addLiveOuts(&MBB, /*AddPristinesAndCSRs*/ true); + MachineBasicBlock::iterator I = MBB.end(); + while (I != MI) { + --I; + LPR.stepBackward(*I); + } + LQR = LPR.contains(AX) ? MachineBasicBlock::LQR_Live + : MachineBasicBlock::LQR_Dead; } + bool AXDead = (Reg == AX) || (MachineBasicBlock::LQR_Dead == LQR); + if (!AXDead) + BuildMI(MBB, MI, DL, get(Push)).addReg(AX, getKillRegState(true)); if (FromEFLAGS) { BuildMI(MBB, MI, DL, get(X86::SETOr), X86::AL); BuildMI(MBB, MI, DL, get(X86::LAHF));