mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-25 05:10:56 +00:00
RegisterCoalescer: Don't rematerialize subregister definitions.
We cannot simply rematerialize instructions which only defining a subregister, as the final value also depends on the previous instructions. This fixes test/CodeGen/R600/subreg-coalescer-bug.ll with subreg liveness enabled. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229444 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1f67650f77
commit
2a43652f3b
@ -815,6 +815,22 @@ bool RegisterCoalescer::removeCopyByCommutingDef(const CoalescerPair &CP,
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Returns true if @p MI defines the full vreg @p Reg, as opposed to just
|
||||
/// defining a subregister.
|
||||
static bool definesFullReg(const MachineInstr &MI, unsigned Reg) {
|
||||
assert(!TargetRegisterInfo::isPhysicalRegister(Reg) &&
|
||||
"This code cannot handle physreg aliasing");
|
||||
for (const MachineOperand &Op : MI.operands()) {
|
||||
if (!Op.isReg() || !Op.isDef() || Op.getReg() != Reg)
|
||||
continue;
|
||||
// Return true if we define the full register or don't care about the value
|
||||
// inside other subregisters.
|
||||
if (Op.getSubReg() == 0 || Op.isUndef())
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RegisterCoalescer::reMaterializeTrivialDef(CoalescerPair &CP,
|
||||
MachineInstr *CopyMI,
|
||||
bool &IsDefCopy) {
|
||||
@ -843,6 +859,8 @@ bool RegisterCoalescer::reMaterializeTrivialDef(CoalescerPair &CP,
|
||||
return false;
|
||||
if (!TII->isTriviallyReMaterializable(DefMI, AA))
|
||||
return false;
|
||||
if (!definesFullReg(*DefMI, SrcReg))
|
||||
return false;
|
||||
bool SawStore = false;
|
||||
if (!DefMI->isSafeToMove(TII, AA, SawStore))
|
||||
return false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user