Skip to content

Commit cb9f602

Browse files
committed
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.
1 parent 12b9f7a commit cb9f602

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

+70
Original file line numberDiff line numberDiff line change
@@ -65,10 +65,16 @@
6565
#include "llvm/Transforms/IPO/GlobalDCE.h"
6666
#include "llvm/Transforms/IPO/Internalize.h"
6767
#include "llvm/Transforms/Scalar.h"
68+
#include "llvm/Transforms/Scalar/EarlyCSE.h"
6869
#include "llvm/Transforms/Scalar/FlattenCFG.h"
6970
#include "llvm/Transforms/Scalar/GVN.h"
7071
#include "llvm/Transforms/Scalar/InferAddressSpaces.h"
72+
#include "llvm/Transforms/Scalar/LICM.h"
73+
#include "llvm/Transforms/Scalar/LoopDataPrefetch.h"
74+
#include "llvm/Transforms/Scalar/NaryReassociate.h"
75+
#include "llvm/Transforms/Scalar/SeparateConstOffsetFromGEP.h"
7176
#include "llvm/Transforms/Scalar/Sink.h"
77+
#include "llvm/Transforms/Scalar/StraightLineStrengthReduce.h"
7278
#include "llvm/Transforms/Scalar/StructurizeCFG.h"
7379
#include "llvm/Transforms/Utils.h"
7480

@@ -1772,6 +1778,70 @@ AMDGPUCodeGenPassBuilder::AMDGPUCodeGenPassBuilder(
17721778
ShadowStackGCLoweringPass>();
17731779
}
17741780

1781+
void AMDGPUCodeGenPassBuilder::addIRPasses(AddIRPass &addPass) const {
1782+
// TODO: Missing AMDGPURemoveIncompatibleFunctions
1783+
1784+
addPass(AMDGPUPrintfRuntimeBindingPass());
1785+
if (LowerCtorDtor)
1786+
addPass(AMDGPUCtorDtorLoweringPass());
1787+
1788+
if (isPassEnabled(EnableImageIntrinsicOptimizer))
1789+
addPass(AMDGPUImageIntrinsicOptimizerPass(TM));
1790+
1791+
// This can be disabled by passing ::Disable here or on the command line
1792+
// with --expand-variadics-override=disable.
1793+
addPass(ExpandVariadicsPass(ExpandVariadicsMode::Lowering));
1794+
1795+
addPass(AMDGPUAlwaysInlinePass());
1796+
addPass(AlwaysInlinerPass());
1797+
1798+
// TODO: Missing OpenCLEnqueuedBlockLowering
1799+
1800+
// Runs before PromoteAlloca so the latter can account for function uses
1801+
if (EnableLowerModuleLDS)
1802+
addPass(AMDGPULowerModuleLDSPass(TM));
1803+
1804+
if (TM.getOptLevel() > CodeGenOptLevel::None)
1805+
addPass(InferAddressSpacesPass());
1806+
1807+
// Run atomic optimizer before Atomic Expand
1808+
if (TM.getOptLevel() >= CodeGenOptLevel::Less &&
1809+
(AMDGPUAtomicOptimizerStrategy != ScanOptions::None))
1810+
addPass(AMDGPUAtomicOptimizerPass(TM, AMDGPUAtomicOptimizerStrategy));
1811+
1812+
addPass(AtomicExpandPass());
1813+
1814+
if (TM.getOptLevel() > CodeGenOptLevel::None) {
1815+
addPass(AMDGPUPromoteAllocaPass(TM));
1816+
if (isPassEnabled(EnableScalarIRPasses))
1817+
addStraightLineScalarOptimizationPasses(addPass);
1818+
1819+
// TODO: Handle EnableAMDGPUAliasAnalysis
1820+
1821+
// TODO: May want to move later or split into an early and late one.
1822+
addPass(AMDGPUCodeGenPreparePass(TM));
1823+
1824+
// TODO: LICM
1825+
}
1826+
1827+
Base::addIRPasses(addPass);
1828+
1829+
// EarlyCSE is not always strong enough to clean up what LSR produces. For
1830+
// example, GVN can combine
1831+
//
1832+
// %0 = add %a, %b
1833+
// %1 = add %b, %a
1834+
//
1835+
// and
1836+
//
1837+
// %0 = shl nsw %a, 2
1838+
// %1 = shl %a, 2
1839+
//
1840+
// but EarlyCSE can do neither of them.
1841+
if (isPassEnabled(EnableScalarIRPasses))
1842+
addEarlyCSEOrGVNPass(addPass);
1843+
}
1844+
17751845
void AMDGPUCodeGenPassBuilder::addCodeGenPrepare(AddIRPass &addPass) const {
17761846
// AMDGPUAnnotateKernelFeaturesPass is missing here, but it will hopefully be
17771847
// deleted soon.

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.h

+4
Original file line numberDiff line numberDiff line change
@@ -171,10 +171,14 @@ class AMDGPUCodeGenPassBuilder
171171
AMDGPUCodeGenPassBuilder(GCNTargetMachine &TM,
172172
const CGPassBuilderOption &Opts,
173173
PassInstrumentationCallbacks *PIC);
174+
void addIRPasses(AddIRPass &) const;
174175
void addCodeGenPrepare(AddIRPass &) const;
175176
void addPreISel(AddIRPass &addPass) const;
176177
void addAsmPrinter(AddMachinePass &, CreateMCStreamer) const;
177178
Error addInstSelector(AddMachinePass &) const;
179+
180+
void addEarlyCSEOrGVNPass(AddIRPass &) const;
181+
void addStraightLineScalarOptimizationPasses(AddIRPass &) const;
178182
};
179183

180184
} // end namespace llvm

0 commit comments

Comments
 (0)