Skip to content

[CodeGen][NPM] Port MIRFSDiscriminator to NPM #129511

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 31 additions & 8 deletions llvm/include/llvm/CodeGen/MIRFSDiscriminator.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/Support/Discriminator.h"

#include <cassert>
Expand All @@ -29,26 +30,21 @@ namespace llvm {
class MachineFunction;

using namespace sampleprof;
class MIRAddFSDiscriminators : public MachineFunctionPass {
class MIRAddFSDiscriminators {
MachineFunction *MF = nullptr;
FSDiscriminatorPass Pass;
unsigned LowBit;
unsigned HighBit;

public:
static char ID;
/// PassNum is the sequence number this pass is called, start from 1.
MIRAddFSDiscriminators(FSDiscriminatorPass P = FSDiscriminatorPass::Pass1)
: MachineFunctionPass(ID), Pass(P) {
: Pass(P) {
LowBit = getFSPassBitBegin(P);
HighBit = getFSPassBitEnd(P);
assert(LowBit < HighBit && "HighBit needs to be greater than Lowbit");
}

StringRef getPassName() const override {
return "Add FS discriminators in MIR";
}

/// getNumFSBBs() - Return the number of machine BBs that have FS samples.
unsigned getNumFSBBs();

Expand All @@ -59,8 +55,35 @@ class MIRAddFSDiscriminators : public MachineFunctionPass {
/// getMachineFunction - Return the current machine function.
const MachineFunction *getMachineFunction() const { return MF; }

bool runOnMachineFunction(MachineFunction &);
};

class MIRAddFSDiscriminatorsLegacy : public MachineFunctionPass {
FSDiscriminatorPass Pass;

public:
static char ID;

MIRAddFSDiscriminatorsLegacy(
FSDiscriminatorPass P = FSDiscriminatorPass::Pass1)
: MachineFunctionPass(ID), Pass(P) {}

StringRef getPassName() const override {
return "Add FS discriminators in MIR";
}

private:
bool runOnMachineFunction(MachineFunction &) override;
bool runOnMachineFunction(MachineFunction &MF) override;
};

class MIRAddFSDiscriminatorsPass
: public PassInfoMixin<MIRAddFSDiscriminatorsPass> {
FSDiscriminatorPass Pass;

public:
MIRAddFSDiscriminatorsPass(FSDiscriminatorPass P = FSDiscriminatorPass::Pass1)
: Pass(P) {}
PreservedAnalyses run(MachineFunction &F, MachineFunctionAnalysisManager &AM);
};

} // namespace llvm
Expand Down
2 changes: 1 addition & 1 deletion llvm/include/llvm/InitializePasses.h
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ void initializeLowerIntrinsicsPass(PassRegistry &);
void initializeLowerInvokeLegacyPassPass(PassRegistry &);
void initializeLowerSwitchLegacyPassPass(PassRegistry &);
void initializeKCFIPass(PassRegistry &);
void initializeMIRAddFSDiscriminatorsPass(PassRegistry &);
void initializeMIRAddFSDiscriminatorsLegacyPass(PassRegistry &);
void initializeMIRCanonicalizerPass(PassRegistry &);
void initializeMIRNamerPass(PassRegistry &);
void initializeMIRPrintingPassPass(PassRegistry &);
Expand Down
9 changes: 8 additions & 1 deletion llvm/include/llvm/Passes/MachinePassRegistry.def
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,14 @@ MACHINE_FUNCTION_PASS_WITH_PARAMS(
return MachineSinkingPass(EnableSinkAndFold);
},
parseMachineSinkingPassOptions, "enable-sink-fold")

MACHINE_FUNCTION_PASS_WITH_PARAMS(
"mirfs-discriminators", "MIRAddFSDiscriminatorsPass",
[](FSDiscriminatorPass Pass) { return MIRAddFSDiscriminatorsPass(Pass); },
[PB = this](StringRef Params) {
return parseFSDiscriminatorPassOptions(*PB, Params);
},
"fs-discr-pass")

MACHINE_FUNCTION_PASS_WITH_PARAMS(
"regallocfast", "RegAllocFastPass",
Expand Down Expand Up @@ -269,7 +277,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-function-splitter", MachineFunctionSplitter
DUMMY_MACHINE_FUNCTION_PASS("machine-sanmd", MachineSanitizerBinaryMetadata)
DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPass)
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)
DUMMY_MACHINE_FUNCTION_PASS("patchable-function", PatchableFunctionPass)
DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass)
DUMMY_MACHINE_FUNCTION_PASS("print-machine-uniformity", MachineUniformityInfoPrinterPass)
Expand Down
2 changes: 1 addition & 1 deletion llvm/lib/CodeGen/CodeGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
initializeLocalStackSlotPassPass(Registry);
initializeLowerGlobalDtorsLegacyPassPass(Registry);
initializeLowerIntrinsicsPass(Registry);
initializeMIRAddFSDiscriminatorsPass(Registry);
initializeMIRAddFSDiscriminatorsLegacyPass(Registry);
initializeMIRCanonicalizerPass(Registry);
initializeMIRNamerPass(Registry);
initializeMIRProfileLoaderPassPass(Registry);
Expand Down
20 changes: 16 additions & 4 deletions llvm/lib/CodeGen/MIRFSDiscriminator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,16 +42,16 @@ cl::opt<bool> ImprovedFSDiscriminator(
"encoding)"));
}

char MIRAddFSDiscriminators::ID = 0;
char MIRAddFSDiscriminatorsLegacy::ID = 0;

INITIALIZE_PASS(MIRAddFSDiscriminators, DEBUG_TYPE,
INITIALIZE_PASS(MIRAddFSDiscriminatorsLegacy, DEBUG_TYPE,
"Add MIR Flow Sensitive Discriminators",
/* cfg = */ false, /* is_analysis = */ false)

char &llvm::MIRAddFSDiscriminatorsID = MIRAddFSDiscriminators::ID;
char &llvm::MIRAddFSDiscriminatorsID = MIRAddFSDiscriminatorsLegacy::ID;

FunctionPass *llvm::createMIRAddFSDiscriminatorsPass(FSDiscriminatorPass P) {
return new MIRAddFSDiscriminators(P);
return new MIRAddFSDiscriminatorsLegacy(P);
}

// TODO(xur): Remove this once we switch to ImprovedFSDiscriminator.
Expand Down Expand Up @@ -88,6 +88,18 @@ static uint64_t getCallStackHash(const DILocation *DIL) {
return Ret;
}

PreservedAnalyses
MIRAddFSDiscriminatorsPass::run(MachineFunction &MF,
MachineFunctionAnalysisManager &) {
if (MIRAddFSDiscriminators(Pass).runOnMachineFunction(MF))
return PreservedAnalyses::none();
return getMachineFunctionPassPreservedAnalyses();
}

bool MIRAddFSDiscriminatorsLegacy::runOnMachineFunction(MachineFunction &MF) {
return MIRAddFSDiscriminators(Pass).runOnMachineFunction(MF);
}

// Traverse the CFG and assign FD discriminators. If two instructions
// have the same lineno and discriminator, but residing in different BBs,
// the latter instruction will get a new discriminator value. The new
Expand Down
27 changes: 27 additions & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@
#include "llvm/CodeGen/LiveVariables.h"
#include "llvm/CodeGen/LocalStackSlotAllocation.h"
#include "llvm/CodeGen/LowerEmuTLS.h"
#include "llvm/CodeGen/MIRFSDiscriminator.h"
#include "llvm/CodeGen/MIRPrinter.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
Expand Down Expand Up @@ -1438,6 +1439,32 @@ Expected<bool> parseMachineSinkingPassOptions(StringRef Params) {
"MachineSinkingPass");
}

Expected<FSDiscriminatorPass>
parseFSDiscriminatorPassOptions(PassBuilder &PB, StringRef Params) {
if (Params == "Base")
return FSDiscriminatorPass::Base;
if (Params.consume_front("Pass")) {
switch (Params.front()) {
case '0':
return FSDiscriminatorPass::Pass0;
case '1':
return FSDiscriminatorPass::Pass1;
case '2':
return FSDiscriminatorPass::Pass2;
case '3':
return FSDiscriminatorPass::Pass3;
case '4':
return FSDiscriminatorPass::Pass4;
default:
if (Params == "Last")
return FSDiscriminatorPass::PassLast;
}
}
return make_error<StringError>(
formatv("invalid FSDiscriminator pass parameter '{0}' ", Params).str(),
inconvertibleErrorCode());
}

} // namespace

/// Tests whether a pass name starts with a valid prefix for a default pipeline
Expand Down