diff options
author | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-19 19:33:12 +0000 |
---|---|---|
committer | Matt Arsenault <Matthew.Arsenault@amd.com> | 2019-03-19 19:33:12 +0000 |
commit | cf55a657f0c585a41d708ca612068c21957aff61 (patch) | |
tree | d0cb9223d7dc2cfaf2dc8ec8b27c9c60469af74e /llvm/lib | |
parent | f7b43230b844373b421571467864a5fbf644e38d (diff) | |
download | bcm5719-llvm-cf55a657f0c585a41d708ca612068c21957aff61.tar.gz bcm5719-llvm-cf55a657f0c585a41d708ca612068c21957aff61.zip |
CodeGen: Refactor regallocator command line and target selection
This will allow targets more flexibility to replace the
register allocator core passes. In a future commit,
AMDGPU will run the core register assignment passes
twice, and will also want to disallow using the
standard -regalloc option.
llvm-svn: 356506
Diffstat (limited to 'llvm/lib')
-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 |
4 files changed, 58 insertions, 40 deletions
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 |