Skip to content

Commit 9c29d8f

Browse files
committed
[CodeGen][NPM] Port MachineBlockPlacement to NPM
1 parent 4147316 commit 9c29d8f

File tree

11 files changed

+155
-37
lines changed

11 files changed

+155
-37
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
//===- llvm/CodeGen/MachineBlockPlacement.h --------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_CODEGEN_MACHINEBLOCKPLACEMENT_H
10+
#define LLVM_CODEGEN_MACHINEBLOCKPLACEMENT_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
16+
class MachineBlockPlacementPass
17+
: public PassInfoMixin<MachineBlockPlacementPass> {
18+
19+
bool AllowTailMerge = true;
20+
21+
public:
22+
MachineBlockPlacementPass(bool AllowTailMerge)
23+
: AllowTailMerge(AllowTailMerge) {}
24+
PreservedAnalyses run(MachineFunction &MF,
25+
MachineFunctionAnalysisManager &MFAM);
26+
};
27+
28+
} // namespace llvm
29+
30+
#endif // LLVM_CODEGEN_MACHINEBLOCKPLACEMENT_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ void initializeMIRCanonicalizerPass(PassRegistry &);
184184
void initializeMIRNamerPass(PassRegistry &);
185185
void initializeMIRPrintingPassPass(PassRegistry &);
186186
void initializeMachineBlockFrequencyInfoWrapperPassPass(PassRegistry &);
187-
void initializeMachineBlockPlacementPass(PassRegistry &);
187+
void initializeMachineBlockPlacementLegacyPass(PassRegistry &);
188188
void initializeMachineBlockPlacementStatsPass(PassRegistry &);
189189
void initializeMachineBranchProbabilityInfoWrapperPassPass(PassRegistry &);
190190
void initializeMachineCFGPrinterPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
#include "llvm/CodeGen/LocalStackSlotAllocation.h"
4646
#include "llvm/CodeGen/LowerEmuTLS.h"
4747
#include "llvm/CodeGen/MIRPrinter.h"
48+
#include "llvm/CodeGen/MachineBlockPlacement.h"
4849
#include "llvm/CodeGen/MachineCSE.h"
4950
#include "llvm/CodeGen/MachineCopyPropagation.h"
5051
#include "llvm/CodeGen/MachineFunctionAnalysis.h"

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,20 @@ MACHINE_FUNCTION_PASS("verify<machine-trace-metrics>", MachineTraceMetricsVerifi
192192
#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
193193
PARAMS)
194194
#endif
195+
196+
MACHINE_FUNCTION_PASS_WITH_PARAMS(
197+
"block-placement", "MachineBlockPlacementPass",
198+
[](bool NoTailMerge) {
199+
// Tail merging is enabled by default, so this option
200+
// is to disable it.
201+
return MachineBlockPlacementPass(!NoTailMerge);
202+
},
203+
[](StringRef Params) {
204+
return parseSinglePassOption(Params, "no-tail-merge",
205+
"MachineBlockPlacementPass");
206+
},
207+
"no-tail-merge")
208+
195209
MACHINE_FUNCTION_PASS_WITH_PARAMS(
196210
"machine-sink", "MachineSinkingPass",
197211
[](bool EnableSinkAndFold) {
@@ -241,7 +255,6 @@ DUMMY_MACHINE_MODULE_PASS("mir-strip-debug", StripDebugMachineModulePass)
241255
#endif
242256
DUMMY_MACHINE_FUNCTION_PASS("bbsections-prepare", BasicBlockSectionsPass)
243257
DUMMY_MACHINE_FUNCTION_PASS("bbsections-profile-reader", BasicBlockSectionsProfileReaderPass)
244-
DUMMY_MACHINE_FUNCTION_PASS("block-placement", MachineBlockPlacementPass)
245258
DUMMY_MACHINE_FUNCTION_PASS("block-placement-stats", MachineBlockPlacementStatsPass)
246259
DUMMY_MACHINE_FUNCTION_PASS("branch-folder", BranchFolderPass)
247260
DUMMY_MACHINE_FUNCTION_PASS("break-false-deps", BreakFalseDepsPass)

llvm/lib/CodeGen/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
set_source_files_properties(
2+
MachineBlockPlacement.cpp
3+
PROPERTIES COMPILE_FLAGS -g
4+
)
5+
16
if (DEFINED LLVM_HAVE_TF_AOT OR LLVM_HAVE_TFLITE)
27
include(TensorFlowCompile)
38
set(LLVM_RAEVICT_MODEL_PATH_DEFAULT "models/regalloc-eviction")

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
7272
initializeMIRNamerPass(Registry);
7373
initializeMIRProfileLoaderPassPass(Registry);
7474
initializeMachineBlockFrequencyInfoWrapperPassPass(Registry);
75-
initializeMachineBlockPlacementPass(Registry);
75+
initializeMachineBlockPlacementLegacyPass(Registry);
7676
initializeMachineBlockPlacementStatsPass(Registry);
7777
initializeMachineCFGPrinterPass(Registry);
7878
initializeMachineCSELegacyPass(Registry);

llvm/lib/CodeGen/MachineBlockPlacement.cpp

Lines changed: 98 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
//
2525
//===----------------------------------------------------------------------===//
2626

27+
#include "llvm/CodeGen/MachineBlockPlacement.h"
2728
#include "BranchFolding.h"
2829
#include "llvm/ADT/ArrayRef.h"
2930
#include "llvm/ADT/DenseMap.h"
@@ -50,6 +51,7 @@
5051
#include "llvm/CodeGen/TargetSubtargetInfo.h"
5152
#include "llvm/IR/DebugLoc.h"
5253
#include "llvm/IR/Function.h"
54+
#include "llvm/IR/PassManager.h"
5355
#include "llvm/IR/PrintPasses.h"
5456
#include "llvm/InitializePasses.h"
5557
#include "llvm/Pass.h"
@@ -357,7 +359,7 @@ class BlockChain {
357359
unsigned UnscheduledPredecessors = 0;
358360
};
359361

360-
class MachineBlockPlacement : public MachineFunctionPass {
362+
class MachineBlockPlacement {
361363
/// A type for a block filter set.
362364
using BlockFilterSet = SmallSetVector<const MachineBasicBlock *, 16>;
363365

@@ -409,7 +411,11 @@ class MachineBlockPlacement : public MachineFunctionPass {
409411

410412
ProfileSummaryInfo *PSI = nullptr;
411413

412-
TargetPassConfig *PassConfig = nullptr;
414+
// TargetPassConfig *PassConfig = nullptr;
415+
// Whether to EnableTailMerge.
416+
bool AllowTailMerge;
417+
418+
CodeGenOptLevel OptLevel;
413419

414420
/// Duplicator used to duplicate tails during placement.
415421
///
@@ -609,17 +615,46 @@ class MachineBlockPlacement : public MachineFunctionPass {
609615
void createCFGChainExtTsp();
610616

611617
public:
612-
static char ID; // Pass identification, replacement for typeid
618+
MachineBlockPlacement(const MachineBranchProbabilityInfo *MBPI,
619+
MachineLoopInfo *MLI, ProfileSummaryInfo *PSI,
620+
std::unique_ptr<MBFIWrapper> MBFI,
621+
MachinePostDominatorTree *MPDT, bool AllowTailMerge)
622+
: MBPI(MBPI), MBFI(std::move(MBFI)), MLI(MLI), MPDT(MPDT), PSI(PSI),
623+
AllowTailMerge(AllowTailMerge) {};
624+
625+
bool run(MachineFunction &F);
613626

614-
MachineBlockPlacement() : MachineFunctionPass(ID) {
615-
initializeMachineBlockPlacementPass(*PassRegistry::getPassRegistry());
627+
static bool allowTailDupPlacement(MachineFunction &MF) {
628+
return TailDupPlacement && !MF.getTarget().requiresStructuredCFG();
616629
}
630+
};
617631

618-
bool runOnMachineFunction(MachineFunction &F) override;
632+
class MachineBlockPlacementLegacy : public MachineFunctionPass {
633+
public:
634+
static char ID; // Pass identification, replacement for typeid
619635

620-
bool allowTailDupPlacement() const {
621-
assert(F);
622-
return TailDupPlacement && !F->getTarget().requiresStructuredCFG();
636+
MachineBlockPlacementLegacy() : MachineFunctionPass(ID) {
637+
initializeMachineBlockPlacementLegacyPass(*PassRegistry::getPassRegistry());
638+
}
639+
640+
bool runOnMachineFunction(MachineFunction &MF) override {
641+
if (skipFunction(MF.getFunction()))
642+
return false;
643+
auto *MBPI =
644+
&getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
645+
auto MBFI = std::make_unique<MBFIWrapper>(
646+
getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
647+
auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
648+
auto *MPDT = MachineBlockPlacement::allowTailDupPlacement(MF)
649+
? &getAnalysis<MachinePostDominatorTreeWrapperPass>()
650+
.getPostDomTree()
651+
: nullptr;
652+
auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
653+
auto *PassConfig = &getAnalysis<TargetPassConfig>();
654+
bool AllowTailMerge = PassConfig->getEnableTailMerge();
655+
return MachineBlockPlacement(MBPI, MLI, PSI, std::move(MBFI), MPDT,
656+
AllowTailMerge)
657+
.run(MF);
623658
}
624659

625660
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -636,18 +671,18 @@ class MachineBlockPlacement : public MachineFunctionPass {
636671

637672
} // end anonymous namespace
638673

639-
char MachineBlockPlacement::ID = 0;
674+
char MachineBlockPlacementLegacy::ID = 0;
640675

641-
char &llvm::MachineBlockPlacementID = MachineBlockPlacement::ID;
676+
char &llvm::MachineBlockPlacementID = MachineBlockPlacementLegacy::ID;
642677

643-
INITIALIZE_PASS_BEGIN(MachineBlockPlacement, DEBUG_TYPE,
678+
INITIALIZE_PASS_BEGIN(MachineBlockPlacementLegacy, DEBUG_TYPE,
644679
"Branch Probability Basic Block Placement", false, false)
645680
INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
646681
INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfoWrapperPass)
647682
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
648683
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
649684
INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
650-
INITIALIZE_PASS_END(MachineBlockPlacement, DEBUG_TYPE,
685+
INITIALIZE_PASS_END(MachineBlockPlacementLegacy, DEBUG_TYPE,
651686
"Branch Probability Basic Block Placement", false, false)
652687

653688
#ifndef NDEBUG
@@ -1130,7 +1165,7 @@ MachineBlockPlacement::getBestTrellisSuccessor(
11301165
MachineBasicBlock *Succ1 = BestA.Dest;
11311166
MachineBasicBlock *Succ2 = BestB.Dest;
11321167
// Check to see if tail-duplication would be profitable.
1133-
if (allowTailDupPlacement() && shouldTailDuplicate(Succ2) &&
1168+
if (allowTailDupPlacement(*F) && shouldTailDuplicate(Succ2) &&
11341169
canTailDuplicateUnplacedPreds(BB, Succ2, Chain, BlockFilter) &&
11351170
isProfitableToTailDup(BB, Succ2, MBPI->getEdgeProbability(BB, Succ1),
11361171
Chain, BlockFilter)) {
@@ -1655,7 +1690,7 @@ MachineBlockPlacement::selectBestSuccessor(const MachineBasicBlock *BB,
16551690
if (hasBetterLayoutPredecessor(BB, Succ, SuccChain, SuccProb, RealSuccProb,
16561691
Chain, BlockFilter)) {
16571692
// If tail duplication would make Succ profitable, place it.
1658-
if (allowTailDupPlacement() && shouldTailDuplicate(Succ))
1693+
if (allowTailDupPlacement(*F) && shouldTailDuplicate(Succ))
16591694
DupCandidates.emplace_back(SuccProb, Succ);
16601695
continue;
16611696
}
@@ -1883,7 +1918,7 @@ void MachineBlockPlacement::buildChain(const MachineBasicBlock *HeadBB,
18831918
auto Result = selectBestSuccessor(BB, Chain, BlockFilter);
18841919
MachineBasicBlock *BestSucc = Result.BB;
18851920
bool ShouldTailDup = Result.ShouldTailDup;
1886-
if (allowTailDupPlacement())
1921+
if (allowTailDupPlacement(*F))
18871922
ShouldTailDup |= (BestSucc && canTailDuplicateUnplacedPreds(
18881923
BB, BestSucc, Chain, BlockFilter));
18891924

@@ -1910,7 +1945,7 @@ void MachineBlockPlacement::buildChain(const MachineBasicBlock *HeadBB,
19101945

19111946
// Placement may have changed tail duplication opportunities.
19121947
// Check for that now.
1913-
if (allowTailDupPlacement() && BestSucc && ShouldTailDup) {
1948+
if (allowTailDupPlacement(*F) && BestSucc && ShouldTailDup) {
19141949
repeatedlyTailDuplicateBlock(BestSucc, BB, LoopHeaderBB, Chain,
19151950
BlockFilter, PrevUnplacedBlockIt,
19161951
PrevUnplacedBlockInFilterIt);
@@ -3466,7 +3501,7 @@ void MachineBlockPlacement::initTailDupThreshold() {
34663501

34673502
// For aggressive optimization, we can adjust some thresholds to be less
34683503
// conservative.
3469-
if (PassConfig->getOptLevel() >= CodeGenOptLevel::Aggressive) {
3504+
if (OptLevel >= CodeGenOptLevel::Aggressive) {
34703505
// At O3 we should be more willing to copy blocks for tail duplication. This
34713506
// increases size pressure, so we only do it at O3
34723507
// Do this unless only the regular threshold is explicitly set.
@@ -3478,29 +3513,56 @@ void MachineBlockPlacement::initTailDupThreshold() {
34783513
// If there's no threshold provided through options, query the target
34793514
// information for a threshold instead.
34803515
if (TailDupPlacementThreshold.getNumOccurrences() == 0 &&
3481-
(PassConfig->getOptLevel() < CodeGenOptLevel::Aggressive ||
3516+
(OptLevel < CodeGenOptLevel::Aggressive ||
34823517
TailDupPlacementAggressiveThreshold.getNumOccurrences() == 0))
3483-
TailDupSize = TII->getTailDuplicateSize(PassConfig->getOptLevel());
3518+
TailDupSize = TII->getTailDuplicateSize(OptLevel);
34843519
}
34853520

3486-
bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
3487-
if (skipFunction(MF.getFunction()))
3488-
return false;
3521+
PreservedAnalyses
3522+
MachineBlockPlacementPass::run(MachineFunction &MF,
3523+
MachineFunctionAnalysisManager &MFAM) {
3524+
auto *MBPI = &MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);
3525+
auto MBFI = std::make_unique<MBFIWrapper>(
3526+
MFAM.getResult<MachineBlockFrequencyAnalysis>(MF));
3527+
auto *MLI = &MFAM.getResult<MachineLoopAnalysis>(MF);
3528+
auto *MPDT = MachineBlockPlacement::allowTailDupPlacement(MF)
3529+
? &MFAM.getResult<MachinePostDominatorTreeAnalysis>(MF)
3530+
: nullptr;
3531+
auto *PSI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
3532+
.getCachedResult<ProfileSummaryAnalysis>(
3533+
*MF.getFunction().getParent());
3534+
if (!PSI)
3535+
report_fatal_error("MachineBlockPlacement requires ProfileSummaryAnalysis");
3536+
//
3537+
MachineBlockPlacement MBP(MBPI, MLI, PSI, std::move(MBFI), MPDT,
3538+
AllowTailMerge);
3539+
3540+
if (!MBP.run(MF))
3541+
return PreservedAnalyses::all();
3542+
3543+
return getMachineFunctionPassPreservedAnalyses();
3544+
}
3545+
3546+
bool MachineBlockPlacement::run(MachineFunction &MF) {
34893547

34903548
// Check for single-block functions and skip them.
34913549
if (std::next(MF.begin()) == MF.end())
34923550
return false;
34933551

34943552
F = &MF;
3495-
MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
3496-
MBFI = std::make_unique<MBFIWrapper>(
3497-
getAnalysis<MachineBlockFrequencyInfoWrapperPass>().getMBFI());
3498-
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
3553+
OptLevel = F->getTarget().getOptLevel();
3554+
// MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
3555+
// // MBFI = std::make_unique<MBFIWrapper>(MBFI);
3556+
// MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
3557+
34993558
TII = MF.getSubtarget().getInstrInfo();
35003559
TLI = MF.getSubtarget().getTargetLowering();
3501-
MPDT = nullptr;
3502-
PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
3503-
PassConfig = &getAnalysis<TargetPassConfig>();
3560+
// MPDT = nullptr;
3561+
// PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
3562+
// PassConfig = &getAnalysis<TargetPassConfig>();
3563+
llvm::dbgs() << "=== The values are "
3564+
<< (OptLevel == CodeGenOptLevel::Aggressive) << " and "
3565+
<< AllowTailMerge;
35043566

35053567
// Initialize PreferredLoopExit to nullptr here since it may never be set if
35063568
// there are no MachineLoops.
@@ -3529,8 +3591,10 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
35293591
}
35303592

35313593
// Apply tail duplication.
3532-
if (allowTailDupPlacement()) {
3533-
MPDT = &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
3594+
if (allowTailDupPlacement(*F)) {
3595+
llvm::dbgs() << "here\n";
3596+
// MPDT =
3597+
// &getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
35343598
if (OptForSize)
35353599
TailDupSize = 1;
35363600
const bool PreRegAlloc = false;
@@ -3548,8 +3612,8 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
35483612
// TailMerge can create jump into if branches that make CFG irreducible for
35493613
// HW that requires structured CFG.
35503614
const bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() &&
3551-
PassConfig->getEnableTailMerge() &&
3552-
BranchFoldPlacement && MF.size() > 3;
3615+
AllowTailMerge && BranchFoldPlacement &&
3616+
MF.size() > 3;
35533617
// No tail merging opportunities if the block number is less than four.
35543618
if (EnableTailMerge) {
35553619
const unsigned TailMergeSize = TailDupSize + 1;

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@
109109
#include "llvm/CodeGen/LowerEmuTLS.h"
110110
#include "llvm/CodeGen/MIRPrinter.h"
111111
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
112+
#include "llvm/CodeGen/MachineBlockPlacement.h"
112113
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
113114
#include "llvm/CodeGen/MachineCSE.h"
114115
#include "llvm/CodeGen/MachineCopyPropagation.h"

llvm/test/CodeGen/AArch64/pauthlr-prologue-duplication.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
22
# RUN: llc -mtriple aarch64-none-elf -run-pass=block-placement -O3 -o - %s | FileCheck %s
3+
# RUN: llc -mtriple aarch64-none-elf -passes='require<profile-summary>,function(machine-function(block-placement))' -O3 -o - %s | FileCheck %s
34

45
## Check that block-placement does not perform tail duplication on the
56
## PAUTH_EPILOGUE instruction. If that happened, the two prologues would use

llvm/test/CodeGen/AMDGPU/loop_header_nopred.mir

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
# RUN: llc -mtriple=amdgcn -o - -run-pass=block-placement -mcpu=gfx1010 -mattr=-inst-fwd-prefetch-bug -verify-machineinstrs %s | FileCheck -check-prefixes=GFX10 %s
33
# RUN: llc -mtriple=amdgcn -o - -run-pass=block-placement -mcpu=gfx1100 -mattr=-inst-fwd-prefetch-bug -verify-machineinstrs %s | FileCheck -check-prefixes=GFX11 %s
44

5+
# RUN: llc -mtriple=amdgcn -o - -passes='require<profile-summary>,function(machine-function(block-placement))' -mcpu=gfx1100 -mattr=-inst-fwd-prefetch-bug -verify-machineinstrs %s | FileCheck -check-prefixes=GFX11 %s
6+
57
# Used to fail with
68
# Assertion `Out && "Header of loop has no predecessors from outside loop?"
79

0 commit comments

Comments
 (0)