https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/102884
>From 284f29cba21e1e2770f479c90793efd071159d8b Mon Sep 17 00:00:00 2001 From: Matt Arsenault <matthew.arsena...@amd.com> Date: Mon, 12 Aug 2024 15:26:25 +0400 Subject: [PATCH] AMDGPU/NewPM: Start filling out addIRPasses This is not complete, but gets AtomicExpand running. I was able to get further than I expected; we're quite close to having all the IR codegen passes ported. --- .../lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 70 +++++++++++++++++++ llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h | 4 ++ 2 files changed, 74 insertions(+) diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index 15f1a6320d89d..f18a5e4318c2f 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -65,10 +65,16 @@ #include "llvm/Transforms/IPO/GlobalDCE.h" #include "llvm/Transforms/IPO/Internalize.h" #include "llvm/Transforms/Scalar.h" +#include "llvm/Transforms/Scalar/EarlyCSE.h" #include "llvm/Transforms/Scalar/FlattenCFG.h" #include "llvm/Transforms/Scalar/GVN.h" #include "llvm/Transforms/Scalar/InferAddressSpaces.h" +#include "llvm/Transforms/Scalar/LICM.h" +#include "llvm/Transforms/Scalar/LoopDataPrefetch.h" +#include "llvm/Transforms/Scalar/NaryReassociate.h" +#include "llvm/Transforms/Scalar/SeparateConstOffsetFromGEP.h" #include "llvm/Transforms/Scalar/Sink.h" +#include "llvm/Transforms/Scalar/StraightLineStrengthReduce.h" #include "llvm/Transforms/Scalar/StructurizeCFG.h" #include "llvm/Transforms/Utils.h" #include "llvm/Transforms/Utils/FixIrreducible.h" @@ -1769,6 +1775,70 @@ AMDGPUCodeGenPassBuilder::AMDGPUCodeGenPassBuilder( ShadowStackGCLoweringPass>(); } +void AMDGPUCodeGenPassBuilder::addIRPasses(AddIRPass &addPass) const { + // TODO: Missing AMDGPURemoveIncompatibleFunctions + + addPass(AMDGPUPrintfRuntimeBindingPass()); + if (LowerCtorDtor) + addPass(AMDGPUCtorDtorLoweringPass()); + + if (isPassEnabled(EnableImageIntrinsicOptimizer)) + addPass(AMDGPUImageIntrinsicOptimizerPass(TM)); + + // This can be disabled by passing ::Disable here or on the command line + // with --expand-variadics-override=disable. + addPass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering)); + + addPass(AMDGPUAlwaysInlinePass()); + addPass(AlwaysInlinerPass()); + + // TODO: Missing OpenCLEnqueuedBlockLowering + + // Runs before PromoteAlloca so the latter can account for function uses + if (EnableLowerModuleLDS) + addPass(AMDGPULowerModuleLDSPass(TM)); + + if (TM.getOptLevel() > CodeGenOptLevel::None) + addPass(InferAddressSpacesPass()); + + // Run atomic optimizer before Atomic Expand + if (TM.getOptLevel() >= CodeGenOptLevel::Less && + (AMDGPUAtomicOptimizerStrategy != ScanOptions::None)) + addPass(AMDGPUAtomicOptimizerPass(TM, AMDGPUAtomicOptimizerStrategy)); + + addPass(AtomicExpandPass()); + + if (TM.getOptLevel() > CodeGenOptLevel::None) { + addPass(AMDGPUPromoteAllocaPass(TM)); + if (isPassEnabled(EnableScalarIRPasses)) + addStraightLineScalarOptimizationPasses(addPass); + + // TODO: Handle EnableAMDGPUAliasAnalysis + + // TODO: May want to move later or split into an early and late one. + addPass(AMDGPUCodeGenPreparePass(TM)); + + // TODO: LICM + } + + Base::addIRPasses(addPass); + + // EarlyCSE is not always strong enough to clean up what LSR produces. For + // example, GVN can combine + // + // %0 = add %a, %b + // %1 = add %b, %a + // + // and + // + // %0 = shl nsw %a, 2 + // %1 = shl %a, 2 + // + // but EarlyCSE can do neither of them. + if (isPassEnabled(EnableScalarIRPasses)) + addEarlyCSEOrGVNPass(addPass); +} + void AMDGPUCodeGenPassBuilder::addCodeGenPrepare(AddIRPass &addPass) const { // AMDGPUAnnotateKernelFeaturesPass is missing here, but it will hopefully be // deleted soon. diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h index 576bf40e3328d..ad43d52ab987a 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h @@ -172,10 +172,14 @@ class AMDGPUCodeGenPassBuilder const CGPassBuilderOption &Opts, PassInstrumentationCallbacks *PIC); + void addIRPasses(AddIRPass &) const; void addCodeGenPrepare(AddIRPass &) const; void addPreISel(AddIRPass &addPass) const; void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const; Error addInstSelector(AddMachinePass &) const; + + void addEarlyCSEOrGVNPass(AddIRPass &) const; + void addStraightLineScalarOptimizationPasses(AddIRPass &) const; }; } // end namespace llvm _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits