Skip to content

Commit ad99774

Browse files
[llvm][PassSupport] don't require passes to be default constructible
Quite a few passes are not default constructible. In order to properly support -{start|stop}-{before|after}= for these passes, we would like to continue to use INITIALIZE_PASS, but not necessarily provide a default constructor. Delete the default constructors of classes derived from SelectionDAGISel. Link: #59538 Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D140349
1 parent d366304 commit ad99774

File tree

10 files changed

+36
-16
lines changed

10 files changed

+36
-16
lines changed

llvm/include/llvm/PassSupport.h

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "llvm/ADT/StringRef.h"
2828
#include "llvm/PassInfo.h"
2929
#include "llvm/PassRegistry.h"
30+
#include "llvm/Support/Error.h"
3031
#include "llvm/Support/Threading.h"
3132
#include <functional>
3233

@@ -77,7 +78,21 @@ class Pass;
7778
INITIALIZE_PASS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
7879
PassName::registerOptions();
7980

80-
template <typename PassName> Pass *callDefaultCtor() { return new PassName(); }
81+
template <
82+
class PassName,
83+
std::enable_if_t<std::is_default_constructible<PassName>{}, bool> = true>
84+
Pass *callDefaultCtor() {
85+
return new PassName();
86+
}
87+
88+
template <
89+
class PassName,
90+
std::enable_if_t<!std::is_default_constructible<PassName>{}, bool> = true>
91+
Pass *callDefaultCtor() {
92+
// Some codegen passes should only be testable via
93+
// `llc -{start|stop}-{before|after}=<passname>`, not via `opt -<passname>`.
94+
report_fatal_error("target-specific codegen-only pass");
95+
}
8196

8297
//===---------------------------------------------------------------------------
8398
/// RegisterPass<t> template - This template class is used to notify the system

llvm/lib/Target/AArch64/AArch64ISelDAGToDAG.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ class AArch64DAGToDAGISel : public SelectionDAGISel {
4545
public:
4646
static char ID;
4747

48+
AArch64DAGToDAGISel() = delete;
49+
4850
explicit AArch64DAGToDAGISel(AArch64TargetMachine &tm,
4951
CodeGenOpt::Level OptLevel)
5052
: SelectionDAGISel(ID, tm, OptLevel), Subtarget(nullptr) {}

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,8 @@ struct AMDGPUPromoteAllocaToVectorPass
240240
};
241241

242242
Pass *createAMDGPUStructurizeCFGPass();
243-
FunctionPass *createAMDGPUISelDag(
244-
TargetMachine *TM = nullptr,
245-
CodeGenOpt::Level OptLevel = CodeGenOpt::Default);
243+
FunctionPass *createAMDGPUISelDag(TargetMachine &TM,
244+
CodeGenOpt::Level OptLevel);
246245
ModulePass *createAMDGPUAlwaysInlinePass(bool GlobalOpt = true);
247246

248247
struct AMDGPUAlwaysInlinePass : PassInfoMixin<AMDGPUAlwaysInlinePass> {

llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,14 @@ INITIALIZE_PASS_END(AMDGPUDAGToDAGISel, "amdgpu-isel",
111111

112112
/// This pass converts a legalized DAG into a AMDGPU-specific
113113
// DAG, ready for instruction scheduling.
114-
FunctionPass *llvm::createAMDGPUISelDag(TargetMachine *TM,
114+
FunctionPass *llvm::createAMDGPUISelDag(TargetMachine &TM,
115115
CodeGenOpt::Level OptLevel) {
116116
return new AMDGPUDAGToDAGISel(TM, OptLevel);
117117
}
118118

119-
AMDGPUDAGToDAGISel::AMDGPUDAGToDAGISel(
120-
TargetMachine *TM /*= nullptr*/,
121-
CodeGenOpt::Level OptLevel /*= CodeGenOpt::Default*/)
122-
: SelectionDAGISel(ID, *TM, OptLevel) {
119+
AMDGPUDAGToDAGISel::AMDGPUDAGToDAGISel(TargetMachine &TM,
120+
CodeGenOpt::Level OptLevel)
121+
: SelectionDAGISel(ID, TM, OptLevel) {
123122
EnableLateStructurizeCFG = AMDGPUTargetMachine::EnableLateStructurizeCFG;
124123
}
125124

llvm/lib/Target/AMDGPU/AMDGPUISelDAGToDAG.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@ class AMDGPUDAGToDAGISel : public SelectionDAGISel {
9393
public:
9494
static char ID;
9595

96-
explicit AMDGPUDAGToDAGISel(TargetMachine *TM = nullptr,
97-
CodeGenOpt::Level OptLevel = CodeGenOpt::Default);
96+
AMDGPUDAGToDAGISel() = delete;
97+
98+
explicit AMDGPUDAGToDAGISel(TargetMachine &TM, CodeGenOpt::Level OptLevel);
9899
~AMDGPUDAGToDAGISel() override = default;
99100

100101
void getAnalysisUsage(AnalysisUsage &AU) const override;

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,7 @@ bool AMDGPUPassConfig::addPreISel() {
10681068
}
10691069

10701070
bool AMDGPUPassConfig::addInstSelector() {
1071-
addPass(createAMDGPUISelDag(&getAMDGPUTargetMachine(), getOptLevel()));
1071+
addPass(createAMDGPUISelDag(getAMDGPUTargetMachine(), getOptLevel()));
10721072
return false;
10731073
}
10741074

llvm/lib/Target/AMDGPU/R600.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ FunctionPass *createR600ClauseMergePass();
2727
FunctionPass *createR600Packetizer();
2828
FunctionPass *createR600ControlFlowFinalizer();
2929
FunctionPass *createR600MachineCFGStructurizerPass();
30-
FunctionPass *createR600ISelDag(TargetMachine *TM, CodeGenOpt::Level OptLevel);
30+
FunctionPass *createR600ISelDag(TargetMachine &TM, CodeGenOpt::Level OptLevel);
3131
ModulePass *createR600OpenCLImageTypeLoweringPass();
3232

3333
void initializeR600ClauseMergePassPass(PassRegistry &);

llvm/lib/Target/AMDGPU/R600ISelDAGToDAG.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ class R600DAGToDAGISel : public AMDGPUDAGToDAGISel {
2727
SDValue &Offset);
2828

2929
public:
30-
explicit R600DAGToDAGISel(TargetMachine *TM, CodeGenOpt::Level OptLevel)
30+
R600DAGToDAGISel() = delete;
31+
32+
explicit R600DAGToDAGISel(TargetMachine &TM, CodeGenOpt::Level OptLevel)
3133
: AMDGPUDAGToDAGISel(TM, OptLevel) {}
3234

3335
void Select(SDNode *N) override;
@@ -178,7 +180,7 @@ bool R600DAGToDAGISel::SelectADDRVTX_READ(SDValue Addr, SDValue &Base,
178180

179181
/// This pass converts a legalized DAG into a R600-specific
180182
// DAG, ready for instruction scheduling.
181-
FunctionPass *llvm::createR600ISelDag(TargetMachine *TM,
183+
FunctionPass *llvm::createR600ISelDag(TargetMachine &TM,
182184
CodeGenOpt::Level OptLevel) {
183185
return new R600DAGToDAGISel(TM, OptLevel);
184186
}

llvm/lib/Target/AMDGPU/R600TargetMachine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ bool R600PassConfig::addPreISel() {
118118
}
119119

120120
bool R600PassConfig::addInstSelector() {
121-
addPass(createR600ISelDag(&getAMDGPUTargetMachine(), getOptLevel()));
121+
addPass(createR600ISelDag(getAMDGPUTargetMachine(), getOptLevel()));
122122
return false;
123123
}
124124

llvm/lib/Target/X86/X86ISelDAGToDAG.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ namespace {
170170
public:
171171
static char ID;
172172

173+
X86DAGToDAGISel() = delete;
174+
173175
explicit X86DAGToDAGISel(X86TargetMachine &tm, CodeGenOpt::Level OptLevel)
174176
: SelectionDAGISel(ID, tm, OptLevel), Subtarget(nullptr),
175177
OptForMinSize(false), IndirectTlsSegRefs(false) {}

0 commit comments

Comments
 (0)