Skip to content

Commit f94c410

Browse files
authored
[CodeGen] Use MachinePassKey for machine passes (llvm#75567)
Machine passes define `AnalysisKey`, it is counterintuitive. Add `MachinePassKey` and `MachinePassInfoMixin` to avoid this.
1 parent 569ef8d commit f94c410

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

llvm/include/llvm/CodeGen/CodeGenPassBuilder.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ namespace llvm {
8585
} \
8686
};
8787
#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR) \
88-
struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
88+
struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
8989
template <typename... Ts> PASS_NAME(Ts &&...) {} \
9090
Error run(Module &, MachineFunctionAnalysisManager &) { \
9191
return Error::success(); \
@@ -94,16 +94,16 @@ namespace llvm {
9494
MachineFunctionAnalysisManager &) { \
9595
llvm_unreachable("this api is to make new PM api happy"); \
9696
} \
97-
static AnalysisKey Key; \
97+
static MachinePassKey Key; \
9898
};
9999
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \
100-
struct PASS_NAME : public PassInfoMixin<PASS_NAME> { \
100+
struct PASS_NAME : public MachinePassInfoMixin<PASS_NAME> { \
101101
template <typename... Ts> PASS_NAME(Ts &&...) {} \
102102
PreservedAnalyses run(MachineFunction &, \
103103
MachineFunctionAnalysisManager &) { \
104104
return PreservedAnalyses::all(); \
105105
} \
106-
static AnalysisKey Key; \
106+
static MachinePassKey Key; \
107107
};
108108
#define DUMMY_MACHINE_FUNCTION_ANALYSIS(NAME, PASS_NAME, CONSTRUCTOR) \
109109
struct PASS_NAME : public AnalysisInfoMixin<PASS_NAME> { \

llvm/include/llvm/CodeGen/MachinePassManager.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,22 @@ class MachineFunction;
3737

3838
extern template class AnalysisManager<MachineFunction>;
3939

40+
/// Like \c AnalysisKey, but only for machine passes.
41+
struct alignas(8) MachinePassKey {};
42+
43+
/// A CRTP mix-in that provides informational APIs needed for machine passes.
44+
///
45+
/// This provides some boilerplate for types that are machine passes. It
46+
/// automatically mixes in \c PassInfoMixin.
47+
template <typename DerivedT>
48+
struct MachinePassInfoMixin : public PassInfoMixin<DerivedT> {
49+
static MachinePassKey *ID() {
50+
static_assert(std::is_base_of<MachinePassInfoMixin, DerivedT>::value,
51+
"Must pass the derived type as the template argument!");
52+
return &DerivedT::Key;
53+
}
54+
};
55+
4056
/// An AnalysisManager<MachineFunction> that also exposes IR analysis results.
4157
class MachineFunctionAnalysisManager : public AnalysisManager<MachineFunction> {
4258
public:

llvm/lib/CodeGen/CodeGenPassBuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@ using namespace llvm;
1717

1818
namespace llvm {
1919
#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR) \
20-
AnalysisKey PASS_NAME::Key;
20+
MachinePassKey PASS_NAME::Key;
2121
#include "llvm/CodeGen/MachinePassRegistry.def"
2222
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR) \
23-
AnalysisKey PASS_NAME::Key;
23+
MachinePassKey PASS_NAME::Key;
2424
#define DUMMY_MACHINE_FUNCTION_ANALYSIS(NAME, PASS_NAME, CONSTRUCTOR) \
2525
AnalysisKey PASS_NAME::Key;
2626
#include "llvm/CodeGen/MachinePassRegistry.def"

0 commit comments

Comments
 (0)