Add a (hidden) option to print instructions that fail to fuse. It's looking
authorChris Lattner <sabre@nondot.org>
Tue, 17 Feb 2004 08:03:47 +0000 (08:03 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 17 Feb 2004 08:03:47 +0000 (08:03 +0000)
like compares and test's would be the next huge win...

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11539 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86RegisterInfo.cpp

index c5ed4d05b6e4d969eaf50c353b475384c5c41196..5d132dec206cbacf760e2217c01787ca1523a417 100644 (file)
@@ -34,6 +34,11 @@ namespace {
   cl::opt<bool>
   NoFusing("disable-spill-fusing",
            cl::desc("Disable fusing of spill code into instructions"));
+  cl::opt<bool>
+  PrintFailedFusing("print-failed-fuse-candidates",
+                    cl::desc("Print instructions that the allocator wants to"
+                             " fuse, but the X86 backend currently can't"),
+                    cl::Hidden);
 }
 
 X86RegisterInfo::X86RegisterInfo()
@@ -135,7 +140,7 @@ bool X86RegisterInfo::foldMemoryOperand(MachineBasicBlock::iterator &MI,
     case X86::ANDri8:  NI = MakeMIInst(X86::ANDmi8 , FrameIndex, MI); break;
     case X86::ANDri16: NI = MakeMIInst(X86::ANDmi16, FrameIndex, MI); break;
     case X86::ANDri32: NI = MakeMIInst(X86::ANDmi32, FrameIndex, MI); break;
-    default: return false; // Cannot fold
+    default: break; // Cannot fold
     }
   } else if (i == 1) {
     switch(MI->getOpcode()) {
@@ -150,16 +155,19 @@ bool X86RegisterInfo::foldMemoryOperand(MachineBasicBlock::iterator &MI,
     case X86::ANDrr32: NI = MakeRMInst(X86::ANDrm32, FrameIndex, MI); break;
     case X86::IMULrr16:NI = MakeRMInst(X86::IMULrm16, FrameIndex, MI); break;
     case X86::IMULrr32:NI = MakeRMInst(X86::IMULrm32, FrameIndex, MI); break;
-    case X86::IMULrri16: NI = MakeRMIInst(X86::IMULrmi16, FrameIndex, MI); break;
-    case X86::IMULrri32: NI = MakeRMIInst(X86::IMULrmi32, FrameIndex, MI); break;
-    default: return false;  // cannot fold.
+    case X86::IMULrri16: NI = MakeRMIInst(X86::IMULrmi16, FrameIndex, MI);break;
+    case X86::IMULrri32: NI = MakeRMIInst(X86::IMULrmi32, FrameIndex, MI);break;
+    default: break;
     }
+  }
+  if (NI) {
+    MI = MBB.insert(MBB.erase(MI), NI);
+    return true;
   } else {
-    return false; // cannot fold.
+    if (PrintFailedFusing)
+      std::cerr << "We failed to fuse: " << *MI;
+    return false;
   }
-  
-  MI = MBB.insert(MBB.erase(MI), NI);
-  return true;
 }
 
 //===----------------------------------------------------------------------===//