Make load->store deletion a bit smarter. This allows us to compile this:
[oota-llvm.git] / lib / CodeGen / MachineLICM.cpp
index f33acf4a87f0f6e2947e332980a1e4ca19862be1..04211aba97cbbad846190f8cfdb93d5d3706ba74 100644 (file)
 
 using namespace llvm;
 
-namespace {
-  // Hidden options to help debugging
-  cl::opt<bool>
-  PerformLICM("machine-licm",
-              cl::init(false), cl::Hidden,
-              cl::desc("Perform loop-invariant code motion on machine code"));
-}
-
 STATISTIC(NumHoisted, "Number of machine instructions hoisted out of loops");
 
 namespace {
@@ -61,10 +53,12 @@ namespace {
     /// FIXME: Loop preheaders?
     ///
     virtual void getAnalysisUsage(AnalysisUsage &AU) const {
-      MachineFunctionPass::getAnalysisUsage(AU);
       AU.setPreservesCFG();
       AU.addRequired<MachineLoopInfo>();
       AU.addRequired<MachineDominatorTree>();
+      AU.addPreserved<MachineLoopInfo>();
+      AU.addPreserved<MachineDominatorTree>();
+      MachineFunctionPass::getAnalysisUsage(AU);
     }
   private:
     /// VisitAllLoops - Visit all of the loops in depth first order and try to
@@ -167,8 +161,6 @@ FunctionPass *llvm::createMachineLICMPass() { return new MachineLICM(); }
 /// loop.
 ///
 bool MachineLICM::runOnMachineFunction(MachineFunction &MF) {
-  if (!PerformLICM) return false; // For debugging.
-
   DOUT << "******** Machine LICM ********\n";
 
   Changed = false;
@@ -233,23 +225,21 @@ void MachineLICM::HoistRegion(MachineDomTreeNode *N) {
 bool MachineLICM::IsLoopInvariantInst(MachineInstr &I) {
   DEBUG({
       DOUT << "--- Checking if we can hoist " << I;
-      if (I.getInstrDescriptor()->ImplicitUses) {
+      if (I.getDesc().getImplicitUses()) {
         DOUT << "  * Instruction has implicit uses:\n";
 
         const MRegisterInfo *MRI = TM->getRegisterInfo();
-        const unsigned *ImpUses = I.getInstrDescriptor()->ImplicitUses;
-
-        for (; *ImpUses; ++ImpUses)
+        for (const unsigned *ImpUses = I.getDesc().getImplicitUses();
+             *ImpUses; ++ImpUses)
           DOUT << "      -> " << MRI->getName(*ImpUses) << "\n";
       }
 
-      if (I.getInstrDescriptor()->ImplicitDefs) {
+      if (I.getDesc().getImplicitDefs()) {
         DOUT << "  * Instruction has implicit defines:\n";
 
         const MRegisterInfo *MRI = TM->getRegisterInfo();
-        const unsigned *ImpDefs = I.getInstrDescriptor()->ImplicitDefs;
-
-        for (; *ImpDefs; ++ImpDefs)
+        for (const unsigned *ImpDefs = I.getDesc().getImplicitDefs();
+             *ImpDefs; ++ImpDefs)
           DOUT << "      -> " << MRI->getName(*ImpDefs) << "\n";
       }