diff options
| -rw-r--r-- | llvm/include/llvm/CodeGen/TargetPassConfig.h | 15 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/TargetPassConfig.cpp | 61 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp | 19 | ||||
| -rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp | 6 | 
5 files changed, 70 insertions, 43 deletions
diff --git a/llvm/include/llvm/CodeGen/TargetPassConfig.h b/llvm/include/llvm/CodeGen/TargetPassConfig.h index 1def50dbb9d..80a26845eeb 100644 --- a/llvm/include/llvm/CodeGen/TargetPassConfig.h +++ b/llvm/include/llvm/CodeGen/TargetPassConfig.h @@ -360,11 +360,11 @@ protected:    /// addFastRegAlloc - Add the minimum set of target-independent passes that    /// are required for fast register allocation. -  virtual void addFastRegAlloc(FunctionPass *RegAllocPass); +  virtual void addFastRegAlloc();    /// addOptimizedRegAlloc - Add passes related to register allocation.    /// LLVMTargetMachine provides standard regalloc passes for most targets. -  virtual void addOptimizedRegAlloc(FunctionPass *RegAllocPass); +  virtual void addOptimizedRegAlloc();    /// addPreRewrite - Add passes to the optimized register allocation pipeline    /// after register allocation is complete, but before virtual registers are @@ -374,6 +374,10 @@ protected:    /// after RABasic or RAGreedy, they should take advantage of LiveRegMatrix.    /// When these passes run, VirtRegMap contains legal physreg assignments for    /// all virtual registers. +  /// +  /// Note if the target overloads addRegAssignAndRewriteOptimized, this may not +  /// be honored. This is also not generally used for the the fast variant, +  /// where the allocation and rewriting are done in one pass.    virtual bool addPreRewrite() {      return false;    } @@ -431,7 +435,12 @@ protected:    /// addMachinePasses helper to create the target-selected or overriden    /// regalloc pass. -  FunctionPass *createRegAllocPass(bool Optimized); +  virtual FunctionPass *createRegAllocPass(bool Optimized); + +  /// Add core register alloator passes which do the actual register assignment +  /// and rewriting. \returns true if any passes were added. +  virtual bool addRegAssignmentFast(); +  virtual bool addRegAssignmentOptimized();  };  } // end namespace llvm diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp index 76275da38fe..8ddde4b8f99 100644 --- a/llvm/lib/CodeGen/TargetPassConfig.cpp +++ b/llvm/lib/CodeGen/TargetPassConfig.cpp @@ -897,13 +897,9 @@ void TargetPassConfig::addMachinePasses() {    // Run register allocation and passes that are tightly coupled with it,    // including phi elimination and scheduling.    if (getOptimizeRegAlloc()) -    addOptimizedRegAlloc(createRegAllocPass(true)); -  else { -    if (RegAlloc != &useDefaultRegisterAllocator && -        RegAlloc != &createFastRegisterAllocator) -      report_fatal_error("Must use fast (default) register allocator for unoptimized regalloc."); -    addFastRegAlloc(createRegAllocPass(false)); -  } +    addOptimizedRegAlloc(); +  else +    addFastRegAlloc();    // Run post-ra passes.    addPostRegAlloc(); @@ -1093,6 +1089,33 @@ FunctionPass *TargetPassConfig::createRegAllocPass(bool Optimized) {    return createTargetRegisterAllocator(Optimized);  } +bool TargetPassConfig::addRegAssignmentFast() { +  if (RegAlloc != &useDefaultRegisterAllocator && +      RegAlloc != &createFastRegisterAllocator) +    report_fatal_error("Must use fast (default) register allocator for unoptimized regalloc."); + +  addPass(createRegAllocPass(false)); +  return true; +} + +bool TargetPassConfig::addRegAssignmentOptimized() { +  // Add the selected register allocation pass. +  addPass(createRegAllocPass(true)); + +  // Allow targets to change the register assignments before rewriting. +  addPreRewrite(); + +  // Finally rewrite virtual registers. +  addPass(&VirtRegRewriterID); +  // Perform stack slot coloring and post-ra machine LICM. +  // +  // FIXME: Re-enable coloring with register when it's capable of adding +  // kill markers. +  addPass(&StackSlotColoringID); + +  return true; +} +  /// Return true if the default global register allocator is in use and  /// has not be overriden on the command line with '-regalloc=...'  bool TargetPassConfig::usingDefaultRegAlloc() const { @@ -1101,18 +1124,17 @@ bool TargetPassConfig::usingDefaultRegAlloc() const {  /// Add the minimum set of target-independent passes that are required for  /// register allocation. No coalescing or scheduling. -void TargetPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { +void TargetPassConfig::addFastRegAlloc() {    addPass(&PHIEliminationID, false);    addPass(&TwoAddressInstructionPassID, false); -  if (RegAllocPass) -    addPass(RegAllocPass); +  addRegAssignmentFast();  }  /// Add standard target-independent passes that are tightly coupled with  /// optimized register allocation, including coalescing, machine instruction  /// scheduling, and register allocation itself. -void TargetPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { +void TargetPassConfig::addOptimizedRegAlloc() {    addPass(&DetectDeadLanesID, false);    addPass(&ProcessImplicitDefsID, false); @@ -1144,22 +1166,7 @@ void TargetPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) {    // PreRA instruction scheduling.    addPass(&MachineSchedulerID); -  if (RegAllocPass) { -    // Add the selected register allocation pass. -    addPass(RegAllocPass); - -    // Allow targets to change the register assignments before rewriting. -    addPreRewrite(); - -    // Finally rewrite virtual registers. -    addPass(&VirtRegRewriterID); - -    // Perform stack slot coloring and post-ra machine LICM. -    // -    // FIXME: Re-enable coloring with register when it's capable of adding -    // kill markers. -    addPass(&StackSlotColoringID); - +  if (addRegAssignmentOptimized()) {      // Copy propagate to forward register uses and try to eliminate COPYs that      // were not coalesced.      addPass(&MachineCopyPropagationID); diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index 4d57193bc29..e59281488c9 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -579,8 +579,8 @@ public:    bool addLegalizeMachineIR() override;    bool addRegBankSelect() override;    bool addGlobalInstructionSelect() override; -  void addFastRegAlloc(FunctionPass *RegAllocPass) override; -  void addOptimizedRegAlloc(FunctionPass *RegAllocPass) override; +  void addFastRegAlloc() override; +  void addOptimizedRegAlloc() override;    void addPreRegAlloc() override;    void addPostRegAlloc() override;    void addPreSched2() override; @@ -865,7 +865,7 @@ void GCNPassConfig::addPreRegAlloc() {    addPass(createSIWholeQuadModePass());  } -void GCNPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { +void GCNPassConfig::addFastRegAlloc() {    // FIXME: We have to disable the verifier here because of PHIElimination +    // TwoAddressInstructions disabling it. @@ -878,10 +878,10 @@ void GCNPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) {    // machine-level CFG, but before register allocation.    insertPass(&SILowerControlFlowID, &SIFixWWMLivenessID, false); -  TargetPassConfig::addFastRegAlloc(RegAllocPass); +  TargetPassConfig::addFastRegAlloc();  } -void GCNPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { +void GCNPassConfig::addOptimizedRegAlloc() {    insertPass(&MachineSchedulerID, &SIOptimizeExecMaskingPreRAID);    insertPass(&SIOptimizeExecMaskingPreRAID, &SIFormMemoryClausesID); @@ -895,7 +895,7 @@ void GCNPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) {    // machine-level CFG, but before register allocation.    insertPass(&SILowerControlFlowID, &SIFixWWMLivenessID, false); -  TargetPassConfig::addOptimizedRegAlloc(RegAllocPass); +  TargetPassConfig::addOptimizedRegAlloc();  }  void GCNPassConfig::addPostRegAlloc() { diff --git a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp index eb8e40a083b..a5c6f34044f 100644 --- a/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp +++ b/llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp @@ -166,8 +166,16 @@ public:    void addMachineSSAOptimization() override;    FunctionPass *createTargetRegisterAllocator(bool) override; -  void addFastRegAlloc(FunctionPass *RegAllocPass) override; -  void addOptimizedRegAlloc(FunctionPass *RegAllocPass) override; +  void addFastRegAlloc() override; +  void addOptimizedRegAlloc() override; + +  bool addRegAssignmentFast() override { +    llvm_unreachable("should not be used"); +  } + +  bool addRegAssignmentOptimized() override { +    llvm_unreachable("should not be used"); +  }  private:    // If the opt level is aggressive, add GVN; otherwise, add EarlyCSE. This @@ -322,15 +330,12 @@ FunctionPass *NVPTXPassConfig::createTargetRegisterAllocator(bool) {    return nullptr; // No reg alloc  } -void NVPTXPassConfig::addFastRegAlloc(FunctionPass *RegAllocPass) { -  assert(!RegAllocPass && "NVPTX uses no regalloc!"); +void NVPTXPassConfig::addFastRegAlloc() {    addPass(&PHIEliminationID);    addPass(&TwoAddressInstructionPassID);  } -void NVPTXPassConfig::addOptimizedRegAlloc(FunctionPass *RegAllocPass) { -  assert(!RegAllocPass && "NVPTX uses no regalloc!"); - +void NVPTXPassConfig::addOptimizedRegAlloc() {    addPass(&ProcessImplicitDefsID);    addPass(&LiveVariablesID);    addPass(&MachineLoopInfoID); diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp index 9b10c8d905d..414f055932b 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp @@ -191,6 +191,12 @@ public:    void addPostRegAlloc() override;    bool addGCPasses() override { return false; }    void addPreEmitPass() override; + +  // No reg alloc +  bool addRegAssignmentFast() override { return false; } + +  // No reg alloc +  bool addRegAssignmentOptimized() override { return false; }  };  } // end anonymous namespace  | 

