Skip to content

Commit 00a57c1

Browse files
committed
[Instrumentation] Support MachineFunctionProperties
1 parent ca827d5 commit 00a57c1

File tree

6 files changed

+105
-6
lines changed

6 files changed

+105
-6
lines changed

llvm/include/llvm/IR/PassInstrumentation.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@
5858

5959
namespace llvm {
6060

61+
namespace detail {
62+
63+
struct MachinePassConcept;
64+
65+
}
66+
67+
class MachineFunction;
6168
class PreservedAnalyses;
6269
class StringRef;
6370

@@ -78,7 +85,12 @@ class PassInstrumentationCallbacks {
7885
using BeforePassFunc = bool(StringRef, Any);
7986
using BeforeSkippedPassFunc = void(StringRef, Any);
8087
using BeforeNonSkippedPassFunc = void(StringRef, Any);
88+
using BeforeNonSkippedMachineFunctionPassFunc =
89+
void(const detail::MachinePassConcept &, MachineFunction &);
8190
using AfterPassFunc = void(StringRef, Any, const PreservedAnalyses &);
91+
using AfterMachineFunctionPassFunc = void(const detail::MachinePassConcept &,
92+
MachineFunction &,
93+
const PreservedAnalyses &);
8294
using AfterPassInvalidatedFunc = void(StringRef, const PreservedAnalyses &);
8395
using BeforeAnalysisFunc = void(StringRef, Any);
8496
using AfterAnalysisFunc = void(StringRef, Any);
@@ -107,6 +119,11 @@ class PassInstrumentationCallbacks {
107119
BeforeNonSkippedPassCallbacks.emplace_back(std::move(C));
108120
}
109121

122+
template <typename CallableT>
123+
void registerBeforeNonSkippedMachineFunctionPassCallback(CallableT C) {
124+
BeforeNonSkippedMachineFunctionPassCallbacks.emplace_back(std::move(C));
125+
}
126+
110127
template <typename CallableT>
111128
void registerAfterPassCallback(CallableT C, bool ToFront = false) {
112129
if (ToFront)
@@ -115,6 +132,11 @@ class PassInstrumentationCallbacks {
115132
AfterPassCallbacks.emplace_back(std::move(C));
116133
}
117134

135+
template <typename CallableT>
136+
void registerAfterMachineFunctionPassCallback(CallableT C) {
137+
AfterMachineFunctionPassCallbacks.emplace_back(std::move(C));
138+
}
139+
118140
template <typename CallableT>
119141
void registerAfterPassInvalidatedCallback(CallableT C, bool ToFront = false) {
120142
if (ToFront)
@@ -166,8 +188,12 @@ class PassInstrumentationCallbacks {
166188
/// These are run on passes that are about to be run.
167189
SmallVector<llvm::unique_function<BeforeNonSkippedPassFunc>, 4>
168190
BeforeNonSkippedPassCallbacks;
191+
SmallVector<llvm::unique_function<BeforeNonSkippedMachineFunctionPassFunc>, 4>
192+
BeforeNonSkippedMachineFunctionPassCallbacks;
169193
/// These are run on passes that have just run.
170194
SmallVector<llvm::unique_function<AfterPassFunc>, 4> AfterPassCallbacks;
195+
SmallVector<llvm::unique_function<AfterMachineFunctionPassFunc>, 4>
196+
AfterMachineFunctionPassCallbacks;
171197
/// These are run passes that have just run on invalidated IR.
172198
SmallVector<llvm::unique_function<AfterPassInvalidatedFunc>, 4>
173199
AfterPassInvalidatedCallbacks;
@@ -247,6 +273,9 @@ class PassInstrumentation {
247273
return ShouldRun;
248274
}
249275

276+
bool runBeforeMachineFunctionPass(const detail::MachinePassConcept &Pass,
277+
MachineFunction &MF) const;
278+
250279
/// AfterPass instrumentation point - takes \p Pass instance that has
251280
/// just been executed and constant reference to \p IR it operates on.
252281
/// \p IR is guaranteed to be valid at this point.
@@ -258,6 +287,10 @@ class PassInstrumentation {
258287
C(Pass.name(), llvm::Any(&IR), PA);
259288
}
260289

290+
void runAfterMachineFunctionPass(const detail::MachinePassConcept &Pass,
291+
MachineFunction &MF,
292+
const PreservedAnalyses &PA) const;
293+
261294
/// AfterPassInvalidated instrumentation point - takes \p Pass instance
262295
/// that has just been executed. For use when IR has been invalidated
263296
/// by \p Pass execution.

llvm/include/llvm/IR/PassManager.h

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ extern llvm::cl::opt<bool> UseNewDbgInfoFormat;
6464

6565
namespace llvm {
6666

67+
class MachineFunction;
68+
6769
// RemoveDIs: Provide facilities for converting debug-info from one form to
6870
// another, which are no-ops for everything but modules.
6971
template <class IRUnitT> inline bool shouldConvertDbgInfo(IRUnitT &IR) {
@@ -271,8 +273,10 @@ class PassManager : public PassInfoMixin<
271273
LLVM_ATTRIBUTE_MINSIZE
272274
std::enable_if_t<!std::is_same<PassT, PassManager>::value>
273275
addPass(PassT &&Pass) {
274-
using PassModelT =
275-
detail::PassModel<IRUnitT, PassT, AnalysisManagerT, ExtraArgTs...>;
276+
using PassModelT = std::conditional_t<
277+
std::is_same_v<IRUnitT, MachineFunction>,
278+
detail::MachinePassModel<PassT>,
279+
detail::PassModel<IRUnitT, PassT, AnalysisManagerT, ExtraArgTs...>>;
276280
// Do not use make_unique or emplace_back, they cause too many template
277281
// instantiations, causing terrible compile times.
278282
Passes.push_back(std::unique_ptr<PassConceptT>(
@@ -298,8 +302,9 @@ class PassManager : public PassInfoMixin<
298302
static bool isRequired() { return true; }
299303

300304
protected:
301-
using PassConceptT =
302-
detail::PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...>;
305+
using PassConceptT = std::conditional_t<
306+
std::is_same_v<IRUnitT, MachineFunction>, detail::MachinePassConcept,
307+
detail::PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...>>;
303308

304309
std::vector<std::unique_ptr<PassConceptT>> Passes;
305310
};

llvm/include/llvm/IR/PassManagerInternal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,9 @@ struct AnalysisPassModel
328328
PassT Pass;
329329
};
330330

331+
struct MachinePassConcept;
332+
template <typename PassT> struct MachinePassModel;
333+
331334
} // end namespace detail
332335

333336
} // end namespace llvm

llvm/include/llvm/Passes/StandardInstrumentations.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,11 @@ class PrintCrashIRInstrumentation {
563563
static void SignalHandler(void *);
564564
};
565565

566+
class MachineFunctionPropertiesInstrumentation {
567+
public:
568+
void registerCallbacks(PassInstrumentationCallbacks &PIC, bool Verify);
569+
};
570+
566571
/// This class provides an interface to register all the standard pass
567572
/// instrumentations and manages their state (if any).
568573
class StandardInstrumentations {
@@ -580,6 +585,7 @@ class StandardInstrumentations {
580585
PrintCrashIRInstrumentation PrintCrashIR;
581586
IRChangedTester ChangeTester;
582587
VerifyInstrumentation Verify;
588+
MachineFunctionPropertiesInstrumentation MFProp;
583589

584590
bool VerifyEach;
585591

llvm/lib/CodeGen/MachinePassManager.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,13 @@ PassManager<MachineFunction>::run(MachineFunction &MF,
119119
->getMMI();
120120
PreservedAnalyses PA = PreservedAnalyses::all();
121121
for (auto &Pass : Passes) {
122-
if (!PI.runBeforePass<MachineFunction>(*Pass, MF))
122+
if (!PI.runBeforeMachineFunctionPass(*Pass, MF))
123123
continue;
124124

125125
PreservedAnalyses PassPA = Pass->run(MF, MFAM);
126126
if (MMI.getMachineFunction(F)) {
127127
MFAM.invalidate(MF, PassPA);
128-
PI.runAfterPass(*Pass, MF, PassPA);
128+
PI.runAfterMachineFunctionPass(*Pass, MF, PassPA);
129129
} else {
130130
MFAM.clear(MF, F.getName());
131131
PI.runAfterPassInvalidated<MachineFunction>(*Pass, PassPA);
@@ -135,4 +135,25 @@ PassManager<MachineFunction>::run(MachineFunction &MF,
135135
return PA;
136136
}
137137

138+
bool PassInstrumentation::runBeforeMachineFunctionPass(
139+
const detail::MachinePassConcept &Pass, MachineFunction &MF) const {
140+
bool ShouldRun = runBeforePass(Pass, MF);
141+
if (!ShouldRun)
142+
return false;
143+
144+
if (Callbacks)
145+
for (auto &C : Callbacks->BeforeNonSkippedMachineFunctionPassCallbacks)
146+
C(Pass, MF);
147+
return true;
148+
}
149+
150+
void PassInstrumentation::runAfterMachineFunctionPass(
151+
const detail::MachinePassConcept &Pass, MachineFunction &MF,
152+
const PreservedAnalyses &PA) const {
153+
runAfterPass(Pass, MF, PA);
154+
if (Callbacks)
155+
for (auto &C : Callbacks->AfterMachineFunctionPassCallbacks)
156+
C(Pass, MF, PA);
157+
}
158+
138159
} // namespace llvm

llvm/lib/Passes/StandardInstrumentations.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "llvm/Analysis/LazyCallGraph.h"
2121
#include "llvm/Analysis/LoopInfo.h"
2222
#include "llvm/CodeGen/MachineFunction.h"
23+
#include "llvm/CodeGen/MachinePassManager.h"
2324
#include "llvm/IR/Constants.h"
2425
#include "llvm/IR/Function.h"
2526
#include "llvm/IR/Module.h"
@@ -2415,6 +2416,35 @@ void PrintCrashIRInstrumentation::registerCallbacks(
24152416
});
24162417
}
24172418

2419+
void MachineFunctionPropertiesInstrumentation::registerCallbacks(
2420+
PassInstrumentationCallbacks &PIC, bool Verify) {
2421+
if (Verify) {
2422+
PIC.registerBeforeNonSkippedMachineFunctionPassCallback(
2423+
[](const detail::MachinePassConcept &Pass, MachineFunction &MF) {
2424+
auto &MFProps = MF.getProperties();
2425+
auto RequiredProperties = Pass.getRequiredProperties();
2426+
if (!MFProps.verifyRequiredProperties(RequiredProperties)) {
2427+
errs() << "MachineFunctionProperties required by " << Pass.name()
2428+
<< " pass are not met by function " << MF.getName() << ".\n"
2429+
<< "Required properties: ";
2430+
RequiredProperties.print(errs());
2431+
errs() << "\nCurrent properties: ";
2432+
MFProps.print(errs());
2433+
errs() << "\n";
2434+
report_fatal_error("MachineFunctionProperties check failed");
2435+
}
2436+
});
2437+
}
2438+
2439+
PIC.registerAfterMachineFunctionPassCallback(
2440+
[](const detail::MachinePassConcept &Pass, MachineFunction &MF,
2441+
const PreservedAnalyses &) {
2442+
auto &MFProp = MF.getProperties();
2443+
MFProp.reset(Pass.getClearedProperties());
2444+
MFProp.set(Pass.getSetProperties());
2445+
});
2446+
}
2447+
24182448
void StandardInstrumentations::registerCallbacks(
24192449
PassInstrumentationCallbacks &PIC, ModuleAnalysisManager *MAM) {
24202450
PrintIR.registerCallbacks(PIC);
@@ -2440,6 +2470,7 @@ void StandardInstrumentations::registerCallbacks(
24402470
// AfterCallbacks by its `registerCallbacks`. This is necessary
24412471
// to ensure that other callbacks are not included in the timings.
24422472
TimeProfilingPasses.registerCallbacks(PIC);
2473+
MFProp.registerCallbacks(PIC, VerifyEach);
24432474
}
24442475

24452476
template class ChangeReporter<std::string>;

0 commit comments

Comments
 (0)