diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2004-11-30 08:15:15 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2004-11-30 08:15:15 +0000 |
commit | 9e0b9028c7c7d9a1cac45778107b18162be927fd (patch) | |
tree | 51515f02bda54f4a4a47c3fcc80c18b5e3b89b02 /lib/Target/Sparc/FPMover.cpp | |
parent | 0fcb9410b9c51a179b3c7a80291f00dac344038c (diff) |
If we're about to emit something like:
%f0 = fmovs %f0
%f1 = fmovs %f1
then just delete the FpMOVD pseudo-instruction instead. Also, add
statistics and debug printouts.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18383 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc/FPMover.cpp')
-rw-r--r-- | lib/Target/Sparc/FPMover.cpp | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/lib/Target/Sparc/FPMover.cpp b/lib/Target/Sparc/FPMover.cpp index 32bb2ac88b..6450f47f25 100644 --- a/lib/Target/Sparc/FPMover.cpp +++ b/lib/Target/Sparc/FPMover.cpp @@ -15,11 +15,13 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/ADT/Statistic.h" +#include "llvm/Support/Debug.h" using namespace llvm; namespace { Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated"); + Statistic<> SkippedFpMOVDs ("fpmover", "# FpMOVD instructions skipped"); struct FPMover : public MachineFunctionPass { /// Target machine description which we query for reg. names, data @@ -70,21 +72,31 @@ static void doubleToSingleRegPair(unsigned doubleReg, unsigned &singleReg1, unsi bool FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) { bool Changed = false; for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I) - if (V8::FpMOVD == I->getOpcode()) { - I->setOpcode (V8::FMOVS); - unsigned DestReg = I->getOperand(0).getReg(); - unsigned SrcReg = I->getOperand(1).getReg(); - unsigned NewSrcReg0, NewSrcReg1; - unsigned NewDestReg0, NewDestReg1; - doubleToSingleRegPair (DestReg, NewDestReg0, NewDestReg1); - doubleToSingleRegPair (SrcReg, NewSrcReg0, NewSrcReg1); - I->SetMachineOperandReg (0, NewDestReg0); - I->SetMachineOperandReg (1, NewSrcReg0); - // Insert copy for the other half of the double: + if (V8::FpMOVD == I->getOpcode ()) { + unsigned NewSrcReg0, NewSrcReg1, NewDestReg0, NewDestReg1; + doubleToSingleRegPair (I->getOperand (0).getReg (), NewDestReg0, + NewDestReg1); + doubleToSingleRegPair (I->getOperand (1).getReg (), NewSrcReg0, + NewSrcReg1); MachineBasicBlock::iterator J = I; ++J; - BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg(NewSrcReg1); - ++NumFpMOVDs; + if (!(NewDestReg0 == NewSrcReg0 && NewDestReg1 == NewSrcReg1)) { + I->setOpcode (V8::FMOVS); + I->SetMachineOperandReg (0, NewDestReg0); + I->SetMachineOperandReg (1, NewSrcReg0); + DEBUG (std::cerr << "FPMover: new dest reg. is: " << NewDestReg0 + << "; modified instr is: " << *I); + // Insert copy for the other half of the double: + MachineInstr *MI2 = + BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg (NewSrcReg1); + DEBUG (std::cerr << "FPMover: new dest reg. is " << NewDestReg1 + << "; inserted instr is: " << *MI2); + ++NumFpMOVDs; + } else { + MBB.erase (I); + ++SkippedFpMOVDs; + } + I = J; Changed = true; } return Changed; |