If we're about to emit something like:
authorBrian Gaeke <gaeke@uiuc.edu>
Tue, 30 Nov 2004 08:15:15 +0000 (08:15 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Tue, 30 Nov 2004 08:15:15 +0000 (08:15 +0000)
  %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

lib/Target/Sparc/FPMover.cpp
lib/Target/SparcV8/FPMover.cpp

index 32bb2ac88b8161d3142faea56420aa6455ac73b5..6450f47f25725d44f6d45939222b223f27c645ed 100644 (file)
 #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;
index 32bb2ac88b8161d3142faea56420aa6455ac73b5..6450f47f25725d44f6d45939222b223f27c645ed 100644 (file)
 #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;