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
This commit is contained in:
Brian Gaeke
2004-11-30 08:15:15 +00:00
parent 0fcb9410b9
commit 9e0b9028c7
2 changed files with 50 additions and 26 deletions

View File

@@ -15,11 +15,13 @@
#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include "llvm/Support/Debug.h"
using namespace llvm; using namespace llvm;
namespace { namespace {
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated"); Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
Statistic<> SkippedFpMOVDs ("fpmover", "# FpMOVD instructions skipped");
struct FPMover : public MachineFunctionPass { struct FPMover : public MachineFunctionPass {
/// Target machine description which we query for reg. names, data /// 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 FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
bool Changed = false; bool Changed = false;
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I) for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
if (V8::FpMOVD == I->getOpcode()) { if (V8::FpMOVD == I->getOpcode ()) {
I->setOpcode (V8::FMOVS); unsigned NewSrcReg0, NewSrcReg1, NewDestReg0, NewDestReg1;
unsigned DestReg = I->getOperand(0).getReg(); doubleToSingleRegPair (I->getOperand (0).getReg (), NewDestReg0,
unsigned SrcReg = I->getOperand(1).getReg(); NewDestReg1);
unsigned NewSrcReg0, NewSrcReg1; doubleToSingleRegPair (I->getOperand (1).getReg (), NewSrcReg0,
unsigned NewDestReg0, NewDestReg1; NewSrcReg1);
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:
MachineBasicBlock::iterator J = I; MachineBasicBlock::iterator J = I;
++J; ++J;
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg(NewSrcReg1); if (!(NewDestReg0 == NewSrcReg0 && NewDestReg1 == NewSrcReg1)) {
++NumFpMOVDs; 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; Changed = true;
} }
return Changed; return Changed;

View File

@@ -15,11 +15,13 @@
#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include "llvm/Support/Debug.h"
using namespace llvm; using namespace llvm;
namespace { namespace {
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated"); Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
Statistic<> SkippedFpMOVDs ("fpmover", "# FpMOVD instructions skipped");
struct FPMover : public MachineFunctionPass { struct FPMover : public MachineFunctionPass {
/// Target machine description which we query for reg. names, data /// 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 FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
bool Changed = false; bool Changed = false;
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I) for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
if (V8::FpMOVD == I->getOpcode()) { if (V8::FpMOVD == I->getOpcode ()) {
I->setOpcode (V8::FMOVS); unsigned NewSrcReg0, NewSrcReg1, NewDestReg0, NewDestReg1;
unsigned DestReg = I->getOperand(0).getReg(); doubleToSingleRegPair (I->getOperand (0).getReg (), NewDestReg0,
unsigned SrcReg = I->getOperand(1).getReg(); NewDestReg1);
unsigned NewSrcReg0, NewSrcReg1; doubleToSingleRegPair (I->getOperand (1).getReg (), NewSrcReg0,
unsigned NewDestReg0, NewDestReg1; NewSrcReg1);
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:
MachineBasicBlock::iterator J = I; MachineBasicBlock::iterator J = I;
++J; ++J;
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg(NewSrcReg1); if (!(NewDestReg0 == NewSrcReg0 && NewDestReg1 == NewSrcReg1)) {
++NumFpMOVDs; 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; Changed = true;
} }
return Changed; return Changed;