Add a (hidden) option to print instructions that fail to fuse. It's looking

like compares and test's would be the next huge win...

llvm-svn: 11539
This commit is contained in:
Chris Lattner 2004-02-17 08:03:47 +00:00
parent 6974f4758a
commit 7ef6d2fd0e
1 changed files with 17 additions and 9 deletions

View File

@ -34,6 +34,11 @@ namespace {
cl::opt<bool> cl::opt<bool>
NoFusing("disable-spill-fusing", NoFusing("disable-spill-fusing",
cl::desc("Disable fusing of spill code into instructions")); 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() X86RegisterInfo::X86RegisterInfo()
@ -135,7 +140,7 @@ bool X86RegisterInfo::foldMemoryOperand(MachineBasicBlock::iterator &MI,
case X86::ANDri8: NI = MakeMIInst(X86::ANDmi8 , FrameIndex, MI); break; case X86::ANDri8: NI = MakeMIInst(X86::ANDmi8 , FrameIndex, MI); break;
case X86::ANDri16: NI = MakeMIInst(X86::ANDmi16, FrameIndex, MI); break; case X86::ANDri16: NI = MakeMIInst(X86::ANDmi16, FrameIndex, MI); break;
case X86::ANDri32: NI = MakeMIInst(X86::ANDmi32, 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) { } else if (i == 1) {
switch(MI->getOpcode()) { 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::ANDrr32: NI = MakeRMInst(X86::ANDrm32, FrameIndex, MI); break;
case X86::IMULrr16:NI = MakeRMInst(X86::IMULrm16, 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::IMULrr32:NI = MakeRMInst(X86::IMULrm32, FrameIndex, MI); break;
case X86::IMULrri16: NI = MakeRMIInst(X86::IMULrmi16, FrameIndex, MI); break; case X86::IMULrri16: NI = MakeRMIInst(X86::IMULrmi16, FrameIndex, MI);break;
case X86::IMULrri32: NI = MakeRMIInst(X86::IMULrmi32, FrameIndex, MI); break; case X86::IMULrri32: NI = MakeRMIInst(X86::IMULrmi32, FrameIndex, MI);break;
default: return false; // cannot fold. default: break;
} }
} else {
return false; // cannot fold.
} }
if (NI) {
MI = MBB.insert(MBB.erase(MI), NI); MI = MBB.insert(MBB.erase(MI), NI);
return true; return true;
} else {
if (PrintFailedFusing)
std::cerr << "We failed to fuse: " << *MI;
return false;
}
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//