diff options
Diffstat (limited to 'lib/Target/Hexagon/HexagonCopyToCombine.cpp')
-rw-r--r-- | lib/Target/Hexagon/HexagonCopyToCombine.cpp | 28 |
1 files changed, 17 insertions, 11 deletions
diff --git a/lib/Target/Hexagon/HexagonCopyToCombine.cpp b/lib/Target/Hexagon/HexagonCopyToCombine.cpp index 36080997ec6b..8118c8eb149d 100644 --- a/lib/Target/Hexagon/HexagonCopyToCombine.cpp +++ b/lib/Target/Hexagon/HexagonCopyToCombine.cpp @@ -440,22 +440,28 @@ HexagonCopyToCombine::findPotentialNewifiableTFRs(MachineBasicBlock &BB) { // Put instructions that last defined integer or double registers into the // map. - for (unsigned I = 0, E = MI.getNumOperands(); I != E; ++I) { - MachineOperand &Op = MI.getOperand(I); - if (!Op.isReg() || !Op.isDef() || !Op.getReg()) - continue; - unsigned Reg = Op.getReg(); - if (Hexagon::DoubleRegsRegClass.contains(Reg)) { - for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) { - LastDef[*SubRegs] = &MI; - } - } else if (Hexagon::IntRegsRegClass.contains(Reg)) - LastDef[Reg] = &MI; + for (MachineOperand &Op : MI.operands()) { + if (Op.isReg()) { + if (!Op.isDef() || !Op.getReg()) + continue; + unsigned Reg = Op.getReg(); + if (Hexagon::DoubleRegsRegClass.contains(Reg)) { + for (MCSubRegIterator SubRegs(Reg, TRI); SubRegs.isValid(); ++SubRegs) + LastDef[*SubRegs] = &MI; + } else if (Hexagon::IntRegsRegClass.contains(Reg)) + LastDef[Reg] = &MI; + } else if (Op.isRegMask()) { + for (unsigned Reg : Hexagon::IntRegsRegClass) + if (Op.clobbersPhysReg(Reg)) + LastDef[Reg] = &MI; + } } } } bool HexagonCopyToCombine::runOnMachineFunction(MachineFunction &MF) { + if (skipFunction(*MF.getFunction())) + return false; if (IsCombinesDisabled) return false; |