diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-08-27 20:33:50 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-08-27 20:33:50 +0000 |
commit | df3b99381f1c211071cc1daf0cc297666877bbcb (patch) | |
tree | df0e7bf0eaeb013305db97d31b7967733baff9e9 /lib/CodeGen/TwoAddressInstructionPass.cpp | |
parent | 9d2968c824c2753dd7d70b8cd40362716738a50a (diff) |
Refactor isSafeToReMat out of 2addr pass.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55430 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/TwoAddressInstructionPass.cpp')
-rw-r--r-- | lib/CodeGen/TwoAddressInstructionPass.cpp | 30 |
1 files changed, 1 insertions, 29 deletions
diff --git a/lib/CodeGen/TwoAddressInstructionPass.cpp b/lib/CodeGen/TwoAddressInstructionPass.cpp index 08f576c956..5093321c6a 100644 --- a/lib/CodeGen/TwoAddressInstructionPass.cpp +++ b/lib/CodeGen/TwoAddressInstructionPass.cpp @@ -64,7 +64,6 @@ namespace { unsigned Reg, MachineBasicBlock::iterator OldPos); - bool isSafeToReMat(unsigned DstReg, MachineInstr *MI); bool isProfitableToReMat(unsigned Reg, const TargetRegisterClass *RC, MachineInstr *MI, MachineInstr *DefMI, MachineBasicBlock *MBB, unsigned Loc, @@ -195,33 +194,6 @@ bool TwoAddressInstructionPass::Sink3AddrInstruction(MachineBasicBlock *MBB, return true; } -/// isSafeToReMat - Return true if it's safe to rematerialize the specified -/// instruction which defined the specified register instead of copying it. -bool -TwoAddressInstructionPass::isSafeToReMat(unsigned DstReg, MachineInstr *MI) { - const TargetInstrDesc &TID = MI->getDesc(); - if (!TID.isAsCheapAsAMove()) - return false; - bool SawStore = false; - if (!MI->isSafeToMove(TII, SawStore)) - return false; - for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { - MachineOperand &MO = MI->getOperand(i); - if (!MO.isRegister()) - continue; - // FIXME: For now, do not remat any instruction with register operands. - // Later on, we can loosen the restriction is the register operands have - // not been modified between the def and use. Note, this is different from - // MachineSink because the code in no longer in two-address form (at least - // partially). - if (MO.isUse()) - return false; - else if (!MO.isDead() && MO.getReg() != DstReg) - return false; - } - return true; -} - /// isTwoAddrUse - Return true if the specified MI is using the specified /// register as a two-address operand. static bool isTwoAddrUse(MachineInstr *UseMI, unsigned Reg) { @@ -431,7 +403,7 @@ bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) { // If it's safe and profitable, remat the definition instead of // copying it. if (DefMI && - isSafeToReMat(regB, DefMI) && + DefMI->isSafeToReMat(TII, regB) && isProfitableToReMat(regB, rc, mi, DefMI, mbbi, Dist,DistanceMap)){ DEBUG(cerr << "2addr: REMATTING : " << *DefMI << "\n"); TII->reMaterialize(*mbbi, mi, regA, DefMI); |