Allow targets to inject passes before the virtual register rewriter.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 26 Jun 2012 17:09:29 +0000 (17:09 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Tue, 26 Jun 2012 17:09:29 +0000 (17:09 +0000)
Such passes can be used to tweak the register assignments in a
target-dependent way, for example to avoid write-after-write
dependencies.

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

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

index cc3b3d723565e2de5a549df0a4a09254ebcf8d1f..206bc2e12361229b5de3531960c7f857bcf5f0f6 100644 (file)
@@ -175,6 +175,18 @@ protected:
   /// LLVMTargetMachine provides standard regalloc passes for most targets.
   virtual void addOptimizedRegAlloc(FunctionPass *RegAllocPass);
 
+  /// addPreRewrite - Add passes to the optimized register allocation pipeline
+  /// after register allocation is complete, but before virtual registers are
+  /// rewritten to physical registers.
+  ///
+  /// These passes must preserve VirtRegMap and LiveIntervals, and when running
+  /// after RABasic or RAGreedy, they should take advantage of LiveRegMatrix.
+  /// When these passes run, VirtRegMap contains legal physreg assignments for
+  /// all virtual registers.
+  virtual bool addPreRewrite() {
+    return false;
+  }
+
   /// addFinalizeRegAlloc - This method may be implemented by targets that want
   /// to run passes within the regalloc pipeline, immediately after the register
   /// allocation pass itself. These passes run as soon as virtual regisiters
index b166dbe74322fdfd1bfad11808adb3dfc9a71c43..bf244a55456ed4c3c2e1d2a36469e65d042569fa 100644 (file)
@@ -603,7 +603,11 @@ void TargetPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) {
 
   // Add the selected register allocation pass.
   PM->add(RegAllocPass);
-  printAndVerify("After Register Allocation");
+  printAndVerify("After Register Allocation, before rewriter");
+
+  // Allow targets to change the register assignments before rewriting.
+  if (addPreRewrite())
+    printAndVerify("After pre-rewrite passes");
 
   // Finally rewrite virtual registers.
   addPass(VirtRegRewriterID);