More bundle related API additions.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jan 2012 07:47:03 +0000 (07:47 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 19 Jan 2012 07:47:03 +0000 (07:47 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148465 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/MachineInstrBundle.h
include/llvm/CodeGen/Passes.h
include/llvm/InitializePasses.h
lib/CodeGen/MachineInstrBundle.cpp

index 2beddc1b3e44154777eb3a6c9c8912a8e11acd4a..e6fcdad507273fb16e74a135a220685aafb15cb0 100644 (file)
@@ -37,6 +37,10 @@ void finalizeBundle(MachineBasicBlock &MBB,
 MachineBasicBlock::instr_iterator finalizeBundle(MachineBasicBlock &MBB,
                     MachineBasicBlock::instr_iterator FirstMI);
 
+/// finalizeBundles - Finalize instruction bundles in the specified
+/// MachineFunction. Return true if any bundles are finalized.
+bool finalizeBundles(MachineFunction &MF);
+
 } // End llvm namespace
 
 #endif
index e7bbf850d92ca4ada9ec0ea9526601f880b00ca6..2259ebffc2704a63303bcf610f06b8030f092a9b 100644 (file)
@@ -249,6 +249,11 @@ namespace llvm {
   ///
   FunctionPass *createUnpackMachineBundlesPass();
 
+  /// createFinalizeMachineBundles - This pass finalize machine instruction
+  /// bundles (created earlier, e.g. during pre-RA scheduling).
+  ///
+  FunctionPass *createFinalizeMachineBundlesPass();
+
 } // End llvm namespace
 
 #endif
index d70e9ebd57015429ad407235e4f0ebd484ab9e4c..6cc3f195c7a222b2f355140b5cb9d91c95107078 100644 (file)
@@ -235,6 +235,7 @@ void initializeVerifierPass(PassRegistry&);
 void initializeVirtRegMapPass(PassRegistry&);
 void initializeInstSimplifierPass(PassRegistry&);
 void initializeUnpackMachineBundlesPass(PassRegistry&);
+void initializeFinalizeMachineBundlesPass(PassRegistry&);
 
 }
 
index 23dc796b338eb7c00bec106d1dad33b688c82eda..b96bb1d9c91b7dd26adbeb3d161f29618d56ae50 100644 (file)
@@ -31,7 +31,7 @@ namespace {
 } // end anonymous namespace
 
 char UnpackMachineBundles::ID = 0;
-INITIALIZE_PASS(UnpackMachineBundles, "unpack-mi-bundle",
+INITIALIZE_PASS(UnpackMachineBundles, "unpack-mi-bundles",
                 "Unpack machine instruction bundles", false, false)
 
 FunctionPass *llvm::createUnpackMachineBundlesPass() {
@@ -71,6 +71,32 @@ bool UnpackMachineBundles::runOnMachineFunction(MachineFunction &MF) {
   return Changed;
 }
 
+
+namespace {
+  class FinalizeMachineBundles : public MachineFunctionPass {
+  public:
+    static char ID; // Pass identification
+    FinalizeMachineBundles() : MachineFunctionPass(ID) {
+      initializeFinalizeMachineBundlesPass(*PassRegistry::getPassRegistry());
+    }
+
+    virtual bool runOnMachineFunction(MachineFunction &MF);
+  };
+} // end anonymous namespace
+
+char FinalizeMachineBundles::ID = 0;
+INITIALIZE_PASS(FinalizeMachineBundles, "finalize-mi-bundles",
+                "Finalize machine instruction bundles", false, false)
+
+FunctionPass *llvm::createFinalizeMachineBundlesPass() {
+  return new FinalizeMachineBundles();
+}
+
+bool FinalizeMachineBundles::runOnMachineFunction(MachineFunction &MF) {
+  return llvm::finalizeBundles(MF);
+}
+
+
 /// finalizeBundle - Finalize a machine instruction bundle which includes
 /// a sequence of instructions starting from FirstMI to LastMI (exclusive).
 /// This routine adds a BUNDLE instruction to represent the bundle, it adds
@@ -196,3 +222,28 @@ llvm::finalizeBundle(MachineBasicBlock &MBB,
   finalizeBundle(MBB, FirstMI, LastMI);
   return LastMI;
 }
+
+/// finalizeBundles - Finalize instruction bundles in the specified
+/// MachineFunction. Return true if any bundles are finalized.
+bool llvm::finalizeBundles(MachineFunction &MF) {
+  bool Changed = false;
+  for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
+    MachineBasicBlock &MBB = *I;
+
+    MachineBasicBlock::instr_iterator MII = MBB.instr_begin();
+    assert(!MII->isInsideBundle() &&
+           "First instr cannot be inside bundle before finalization!");
+
+    MachineBasicBlock::instr_iterator MIE = MBB.instr_end();
+    for (++MII; MII != MIE; ) {
+      if (!MII->isInsideBundle())
+        ++MII;
+      else {
+        MII = finalizeBundle(MBB, llvm::prior(MII));
+        Changed = true;
+      }
+    }
+  }
+
+  return Changed;
+}