-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
AMDGPU/NewPM: Fill out addPreISelPasses #102814
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,9 +9,17 @@ | |
#include "AMDGPUCodeGenPassBuilder.h" | ||
#include "AMDGPU.h" | ||
#include "AMDGPUISelDAGToDAG.h" | ||
#include "AMDGPUPerfHintAnalysis.h" | ||
#include "AMDGPUTargetMachine.h" | ||
#include "AMDGPUUnifyDivergentExitNodes.h" | ||
#include "SIFixSGPRCopies.h" | ||
#include "llvm/Analysis/UniformityAnalysis.h" | ||
#include "llvm/Transforms/Scalar/FlattenCFG.h" | ||
#include "llvm/Transforms/Scalar/Sink.h" | ||
#include "llvm/Transforms/Scalar/StructurizeCFG.h" | ||
#include "llvm/Transforms/Utils/FixIrreducible.h" | ||
#include "llvm/Transforms/Utils/LCSSA.h" | ||
#include "llvm/Transforms/Utils/UnifyLoopExits.h" | ||
|
||
using namespace llvm; | ||
|
||
|
@@ -28,8 +36,51 @@ AMDGPUCodeGenPassBuilder::AMDGPUCodeGenPassBuilder( | |
} | ||
|
||
void AMDGPUCodeGenPassBuilder::addPreISel(AddIRPass &addPass) const { | ||
// TODO: Add passes pre instruction selection. | ||
// Test only, convert to real IR passes in future. | ||
const bool LateCFGStructurize = AMDGPUTargetMachine::EnableLateStructurizeCFG; | ||
const bool DisableStructurizer = AMDGPUTargetMachine::DisableStructurizer; | ||
const bool EnableStructurizerWorkarounds = | ||
AMDGPUTargetMachine::EnableStructurizerWorkarounds; | ||
|
||
if (TM.getOptLevel() > CodeGenOptLevel::None) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. tiny nit: put the opt level in a variable to avoid repeating the call? |
||
addPass(FlattenCFGPass()); | ||
|
||
if (TM.getOptLevel() > CodeGenOptLevel::None) | ||
addPass(SinkingPass()); | ||
|
||
addPass(AMDGPULateCodeGenPreparePass(TM)); | ||
|
||
// Merge divergent exit nodes. StructurizeCFG won't recognize the multi-exit | ||
// regions formed by them. | ||
|
||
addPass(AMDGPUUnifyDivergentExitNodesPass()); | ||
|
||
if (!LateCFGStructurize && !DisableStructurizer) { | ||
if (EnableStructurizerWorkarounds) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Does this option matter anymore? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Which one? The LateCFGStructurize was never enabled (and I'd need to look if the underlying pass is still there anymore) There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sorry about that! I meant the option to disable the workarounds. They have been on by default for a very long time. |
||
addPass(FixIrreduciblePass()); | ||
addPass(UnifyLoopExitsPass()); | ||
} | ||
|
||
addPass(StructurizeCFGPass(/*SkipUniformRegions=*/false)); | ||
} | ||
|
||
addPass(AMDGPUAnnotateUniformValuesPass()); | ||
|
||
if (!LateCFGStructurize && !DisableStructurizer) { | ||
addPass(SIAnnotateControlFlowPass(TM)); | ||
|
||
// TODO: Move this right after structurizeCFG to avoid extra divergence | ||
// analysis. This depends on stopping SIAnnotateControlFlow from making | ||
// control flow modifications. | ||
addPass(AMDGPURewriteUndefForPHIPass()); | ||
} | ||
|
||
addPass(LCSSAPass()); | ||
|
||
if (TM.getOptLevel() > CodeGenOptLevel::Less) | ||
addPass(AMDGPUPerfHintAnalysisPass(TM)); | ||
|
||
// FIXME: Why isn't this queried as required from AMDGPUISelDAGToDAG, and why | ||
// isn't this in addInstSelector? | ||
addPass(RequireAnalysisPass<UniformityInfoAnalysis, Function>()); | ||
} | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Does this function run yet, or is this just preparatory work/NFC?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It does run. We have a handful of tests running new PM already. I'm trying to avoid test failures caused by not running the same set of passes in the future