[GlobalISel] Add RegBankSelect hooks into the pass pipeline.
authorQuentin Colombet <qcolombet@apple.com>
Thu, 7 Apr 2016 20:27:33 +0000 (20:27 +0000)
committerQuentin Colombet <qcolombet@apple.com>
Thu, 7 Apr 2016 20:27:33 +0000 (20:27 +0000)
Now, RegBankSelect will happen after the IRTranslation and the target
may optionally add additional passes in between.

llvm-svn: 265716

llvm/include/llvm/CodeGen/Passes.h
llvm/lib/CodeGen/LLVMTargetMachine.cpp
llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

index 61b3ea8..8275b0f 100644 (file)
@@ -220,6 +220,15 @@ public:
   /// LLVM code to machine instructions with possibly generic opcodes.
   virtual bool addIRTranslator() { return true; }
 
+  /// This method may be implemented by targets that want to run passes
+  /// immediately before the register bank selection.
+  virtual void addPreRegBankSelect() {}
+
+  /// This method should install a register bank selector pass, which
+  /// assigns register banks to virtual registers without a register
+  /// class or register banks.
+  virtual bool addRegBankSelect() { return true; }
+
   /// Add the complete, standard set of LLVM CodeGen passes.
   /// Fully developed targets will not generally override this.
   virtual void addMachinePasses();
index 9c6236e..a190493 100644 (file)
@@ -143,6 +143,14 @@ addPassesToGenerateCode(LLVMTargetMachine *TM, PassManagerBase &PM,
   if (LLVM_UNLIKELY(EnableGlobalISel)) {
     if (PassConfig->addIRTranslator())
       return nullptr;
+
+    // Before running the register bank selector, ask the target if it
+    // wants to run some passes.
+    PassConfig->addPreRegBankSelect();
+
+    if (PassConfig->addRegBankSelect())
+      return nullptr;
+
   } else if (PassConfig->addInstSelector())
     return nullptr;
 
index 9712d0e..d4de69f 100644 (file)
@@ -19,6 +19,7 @@
 #ifdef LLVM_BUILD_GLOBAL_ISEL
 #  include "llvm/CodeGen/GlobalISel/IRTranslator.h"
 #endif
+#include "llvm/CodeGen/GlobalISel/RegBankSelect.h"
 #include "llvm/CodeGen/Passes.h"
 #include "llvm/CodeGen/RegAllocRegistry.h"
 #include "llvm/IR/Function.h"
@@ -241,6 +242,7 @@ public:
   bool addInstSelector() override;
 #ifdef LLVM_BUILD_GLOBAL_ISEL
   bool addIRTranslator() override;
+  bool addRegBankSelect() override;
 #endif
   bool addILPOpts() override;
   void addPreRegAlloc() override;
@@ -339,6 +341,10 @@ bool AArch64PassConfig::addIRTranslator() {
   addPass(new IRTranslator());
   return false;
 }
+bool AArch64PassConfig::addRegBankSelect() {
+  addPass(new RegBankSelect());
+  return false;
+}
 #endif
 
 bool AArch64PassConfig::addILPOpts() {