Skip to content

Commit 44d0e95

Browse files
authored
[CodeGen][NewPM] Port TailDuplicate pass to NPM (#113293)
1 parent b47e231 commit 44d0e95

14 files changed

+120
-30
lines changed

llvm/include/llvm/CodeGen/Passes.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -261,11 +261,11 @@ namespace llvm {
261261

262262
/// TailDuplicate - Duplicate blocks with unconditional branches
263263
/// into tails of their predecessors.
264-
extern char &TailDuplicateID;
264+
extern char &TailDuplicateLegacyID;
265265

266266
/// Duplicate blocks with unconditional branches into tails of their
267267
/// predecessors. Variant that works before register allocation.
268-
extern char &EarlyTailDuplicateID;
268+
extern char &EarlyTailDuplicateLegacyID;
269269

270270
/// MachineTraceMetrics - This pass computes critical path and CPU resource
271271
/// usage in an ensemble of traces.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
//===- llvm/CodeGen/TailDuplication.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_TAILDUPLICATIONPASS_H
10+
#define LLVM_CODEGEN_TAILDUPLICATIONPASS_H
11+
12+
#include "llvm/CodeGen/MBFIWrapper.h"
13+
#include "llvm/CodeGen/MachineFunction.h"
14+
#include "llvm/CodeGen/MachinePassManager.h"
15+
16+
namespace llvm {
17+
18+
template <typename DerivedT, bool PreRegAlloc>
19+
class TailDuplicatePassBase : public PassInfoMixin<DerivedT> {
20+
private:
21+
std::unique_ptr<MBFIWrapper> MBFIW;
22+
23+
public:
24+
PreservedAnalyses run(MachineFunction &MF,
25+
MachineFunctionAnalysisManager &MFAM);
26+
};
27+
28+
class EarlyTailDuplicatePass
29+
: public TailDuplicatePassBase<EarlyTailDuplicatePass, true> {
30+
public:
31+
MachineFunctionProperties getClearedProperties() const {
32+
return MachineFunctionProperties().set(
33+
MachineFunctionProperties::Property::NoPHIs);
34+
}
35+
};
36+
37+
class TailDuplicatePass
38+
: public TailDuplicatePassBase<TailDuplicatePass, false> {};
39+
40+
} // namespace llvm
41+
42+
extern template class llvm::TailDuplicatePassBase<llvm::EarlyTailDuplicatePass,
43+
true>;
44+
extern template class llvm::TailDuplicatePassBase<llvm::TailDuplicatePass,
45+
false>;
46+
47+
#endif // LLVM_CODEGEN_TAILDUPLICATIONPASS_H

llvm/include/llvm/InitializePasses.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ void initializeEarlyCSEMemSSALegacyPassPass(PassRegistry &);
101101
void initializeEarlyIfConverterLegacyPass(PassRegistry &);
102102
void initializeEarlyIfPredicatorPass(PassRegistry &);
103103
void initializeEarlyMachineLICMPass(PassRegistry &);
104-
void initializeEarlyTailDuplicatePass(PassRegistry &);
104+
void initializeEarlyTailDuplicateLegacyPass(PassRegistry &);
105105
void initializeEdgeBundlesPass(PassRegistry &);
106106
void initializeEHContGuardCatchretPass(PassRegistry &);
107107
void initializeExpandLargeFpConvertLegacyPassPass(PassRegistry &);
@@ -300,7 +300,7 @@ void initializeStraightLineStrengthReduceLegacyPassPass(PassRegistry &);
300300
void initializeStripDebugMachineModulePass(PassRegistry &);
301301
void initializeStructurizeCFGLegacyPassPass(PassRegistry &);
302302
void initializeTailCallElimPass(PassRegistry &);
303-
void initializeTailDuplicatePass(PassRegistry &);
303+
void initializeTailDuplicateLegacyPass(PassRegistry &);
304304
void initializeTargetLibraryInfoWrapperPassPass(PassRegistry &);
305305
void initializeTargetPassConfigPass(PassRegistry &);
306306
void initializeTargetTransformInfoWrapperPassPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
#include "llvm/CodeGen/SjLjEHPrepare.h"
6161
#include "llvm/CodeGen/StackColoring.h"
6262
#include "llvm/CodeGen/StackProtector.h"
63+
#include "llvm/CodeGen/TailDuplication.h"
6364
#include "llvm/CodeGen/TargetPassConfig.h"
6465
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
6566
#include "llvm/CodeGen/UnreachableBlockElim.h"

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ MACHINE_FUNCTION_ANALYSIS("virtregmap", VirtRegMapAnalysis())
133133
MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass())
134134
MACHINE_FUNCTION_PASS("early-ifcvt", EarlyIfConverterPass())
135135
MACHINE_FUNCTION_PASS("early-machinelicm", EarlyMachineLICMPass())
136+
MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass())
136137
MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass())
137138
MACHINE_FUNCTION_PASS("localstackalloc", LocalStackSlotAllocationPass())
138139
MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass())
@@ -157,6 +158,7 @@ MACHINE_FUNCTION_PASS("print<virtregmap>", VirtRegMapPrinterPass(dbgs()))
157158
MACHINE_FUNCTION_PASS("require-all-machine-function-properties",
158159
RequireAllMachineFunctionPropertiesPass())
159160
MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass())
161+
MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass())
160162
MACHINE_FUNCTION_PASS("trigger-verifier-error", TriggerVerifierErrorPass())
161163
MACHINE_FUNCTION_PASS("two-address-instruction", TwoAddressInstructionPass())
162164
MACHINE_FUNCTION_PASS("verify", MachineVerifierPass())
@@ -210,7 +212,6 @@ DUMMY_MACHINE_FUNCTION_PASS("cfi-fixup", CFIFixupPass)
210212
DUMMY_MACHINE_FUNCTION_PASS("cfi-instr-inserter", CFIInstrInserterPass)
211213
DUMMY_MACHINE_FUNCTION_PASS("detect-dead-lanes", DetectDeadLanesPass)
212214
DUMMY_MACHINE_FUNCTION_PASS("dot-machine-cfg", MachineCFGPrinter)
213-
DUMMY_MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass)
214215
DUMMY_MACHINE_FUNCTION_PASS("fentry-insert", FEntryInserterPass)
215216
DUMMY_MACHINE_FUNCTION_PASS("fixup-statepoint-caller-saved", FixupStatepointCallerSavedPass)
216217
DUMMY_MACHINE_FUNCTION_PASS("fs-profile-loader", MIRProfileLoaderNewPass)
@@ -262,7 +263,6 @@ DUMMY_MACHINE_FUNCTION_PASS("simple-register-coalescing", RegisterCoalescerPass)
262263
DUMMY_MACHINE_FUNCTION_PASS("stack-frame-layout", StackFrameLayoutAnalysisPass)
263264
DUMMY_MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass)
264265
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass)
265-
DUMMY_MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass)
266266
DUMMY_MACHINE_FUNCTION_PASS("unpack-mi-bundles", UnpackMachineBundlesPass)
267267
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass)
268268
DUMMY_MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass)

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
3838
initializeEarlyIfConverterLegacyPass(Registry);
3939
initializeEarlyIfPredicatorPass(Registry);
4040
initializeEarlyMachineLICMPass(Registry);
41-
initializeEarlyTailDuplicatePass(Registry);
41+
initializeEarlyTailDuplicateLegacyPass(Registry);
4242
initializeExpandLargeDivRemLegacyPassPass(Registry);
4343
initializeExpandLargeFpConvertLegacyPassPass(Registry);
4444
initializeExpandMemCmpLegacyPassPass(Registry);
@@ -131,7 +131,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
131131
initializeStackProtectorPass(Registry);
132132
initializeStackSlotColoringPass(Registry);
133133
initializeStripDebugMachineModulePass(Registry);
134-
initializeTailDuplicatePass(Registry);
134+
initializeTailDuplicateLegacyPass(Registry);
135135
initializeTargetPassConfigPass(Registry);
136136
initializeTwoAddressInstructionLegacyPassPass(Registry);
137137
initializeTypePromotionLegacyPass(Registry);

llvm/lib/CodeGen/TailDuplication.cpp

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15+
#include "llvm/CodeGen/TailDuplication.h"
1516
#include "llvm/Analysis/ProfileSummaryInfo.h"
1617
#include "llvm/CodeGen/LazyMachineBlockFrequencyInfo.h"
1718
#include "llvm/CodeGen/MBFIWrapper.h"
1819
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
1920
#include "llvm/CodeGen/MachineFunction.h"
2021
#include "llvm/CodeGen/MachineFunctionPass.h"
22+
#include "llvm/CodeGen/MachinePassManager.h"
2123
#include "llvm/CodeGen/TailDuplicator.h"
24+
#include "llvm/IR/Analysis.h"
2225
#include "llvm/InitializePasses.h"
2326
#include "llvm/Pass.h"
2427
#include "llvm/PassRegistry.h"
@@ -29,13 +32,13 @@ using namespace llvm;
2932

3033
namespace {
3134

32-
class TailDuplicateBase : public MachineFunctionPass {
35+
class TailDuplicateBaseLegacy : public MachineFunctionPass {
3336
TailDuplicator Duplicator;
3437
std::unique_ptr<MBFIWrapper> MBFIW;
3538
bool PreRegAlloc;
3639
public:
37-
TailDuplicateBase(char &PassID, bool PreRegAlloc)
38-
: MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
40+
TailDuplicateBaseLegacy(char &PassID, bool PreRegAlloc)
41+
: MachineFunctionPass(PassID), PreRegAlloc(PreRegAlloc) {}
3942

4043
bool runOnMachineFunction(MachineFunction &MF) override;
4144

@@ -47,19 +50,19 @@ class TailDuplicateBase : public MachineFunctionPass {
4750
}
4851
};
4952

50-
class TailDuplicate : public TailDuplicateBase {
53+
class TailDuplicateLegacy : public TailDuplicateBaseLegacy {
5154
public:
5255
static char ID;
53-
TailDuplicate() : TailDuplicateBase(ID, false) {
54-
initializeTailDuplicatePass(*PassRegistry::getPassRegistry());
56+
TailDuplicateLegacy() : TailDuplicateBaseLegacy(ID, false) {
57+
initializeTailDuplicateLegacyPass(*PassRegistry::getPassRegistry());
5558
}
5659
};
5760

58-
class EarlyTailDuplicate : public TailDuplicateBase {
61+
class EarlyTailDuplicateLegacy : public TailDuplicateBaseLegacy {
5962
public:
6063
static char ID;
61-
EarlyTailDuplicate() : TailDuplicateBase(ID, true) {
62-
initializeEarlyTailDuplicatePass(*PassRegistry::getPassRegistry());
64+
EarlyTailDuplicateLegacy() : TailDuplicateBaseLegacy(ID, true) {
65+
initializeEarlyTailDuplicateLegacyPass(*PassRegistry::getPassRegistry());
6366
}
6467

6568
MachineFunctionProperties getClearedProperties() const override {
@@ -70,17 +73,18 @@ class EarlyTailDuplicate : public TailDuplicateBase {
7073

7174
} // end anonymous namespace
7275

73-
char TailDuplicate::ID;
74-
char EarlyTailDuplicate::ID;
76+
char TailDuplicateLegacy::ID;
77+
char EarlyTailDuplicateLegacy::ID;
7578

76-
char &llvm::TailDuplicateID = TailDuplicate::ID;
77-
char &llvm::EarlyTailDuplicateID = EarlyTailDuplicate::ID;
79+
char &llvm::TailDuplicateLegacyID = TailDuplicateLegacy::ID;
80+
char &llvm::EarlyTailDuplicateLegacyID = EarlyTailDuplicateLegacy::ID;
7881

79-
INITIALIZE_PASS(TailDuplicate, DEBUG_TYPE, "Tail Duplication", false, false)
80-
INITIALIZE_PASS(EarlyTailDuplicate, "early-tailduplication",
82+
INITIALIZE_PASS(TailDuplicateLegacy, DEBUG_TYPE, "Tail Duplication", false,
83+
false)
84+
INITIALIZE_PASS(EarlyTailDuplicateLegacy, "early-tailduplication",
8185
"Early Tail Duplication", false, false)
8286

83-
bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
87+
bool TailDuplicateBaseLegacy::runOnMachineFunction(MachineFunction &MF) {
8488
if (skipFunction(MF.getFunction()))
8589
return false;
8690

@@ -100,3 +104,36 @@ bool TailDuplicateBase::runOnMachineFunction(MachineFunction &MF) {
100104

101105
return MadeChange;
102106
}
107+
108+
template <typename DerivedT, bool PreRegAlloc>
109+
PreservedAnalyses TailDuplicatePassBase<DerivedT, PreRegAlloc>::run(
110+
MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
111+
MFPropsModifier _(static_cast<DerivedT &>(*this), MF);
112+
113+
if (MF.getFunction().hasOptNone())
114+
return PreservedAnalyses::all();
115+
116+
auto *MBPI = &MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);
117+
auto *PSI = MFAM.getResult<ModuleAnalysisManagerMachineFunctionProxy>(MF)
118+
.getCachedResult<ProfileSummaryAnalysis>(
119+
*MF.getFunction().getParent());
120+
auto *MBFI = (PSI && PSI->hasProfileSummary()
121+
? &MFAM.getResult<MachineBlockFrequencyAnalysis>(MF)
122+
: nullptr);
123+
if (MBFI)
124+
MBFIW = std::make_unique<MBFIWrapper>(*MBFI);
125+
126+
TailDuplicator Duplicator;
127+
Duplicator.initMF(MF, PreRegAlloc, MBPI, MBFI ? MBFIW.get() : nullptr, PSI,
128+
/*LayoutMode=*/false);
129+
bool MadeChange = false;
130+
while (Duplicator.tailDuplicateBlocks())
131+
MadeChange = true;
132+
133+
if (!MadeChange)
134+
return PreservedAnalyses::all();
135+
return getMachineFunctionPassPreservedAnalyses();
136+
}
137+
138+
template class llvm::TailDuplicatePassBase<TailDuplicatePass, false>;
139+
template class llvm::TailDuplicatePassBase<EarlyTailDuplicatePass, true>;

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -290,10 +290,10 @@ static IdentifyingPassPtr overridePass(AnalysisID StandardID,
290290
if (StandardID == &BranchFolderPassID)
291291
return applyDisable(TargetID, DisableBranchFold);
292292

293-
if (StandardID == &TailDuplicateID)
293+
if (StandardID == &TailDuplicateLegacyID)
294294
return applyDisable(TargetID, DisableTailDuplicate);
295295

296-
if (StandardID == &EarlyTailDuplicateID)
296+
if (StandardID == &EarlyTailDuplicateLegacyID)
297297
return applyDisable(TargetID, DisableEarlyTailDup);
298298

299299
if (StandardID == &MachineBlockPlacementID)
@@ -1279,7 +1279,7 @@ void TargetPassConfig::addMachinePasses() {
12791279
/// Add passes that optimize machine instructions in SSA form.
12801280
void TargetPassConfig::addMachineSSAOptimization() {
12811281
// Pre-ra tail duplication.
1282-
addPass(&EarlyTailDuplicateID);
1282+
addPass(&EarlyTailDuplicateLegacyID);
12831283

12841284
// Optimize PHIs before DCE: removing dead PHI cycles may make more
12851285
// instructions dead.
@@ -1507,7 +1507,7 @@ void TargetPassConfig::addMachineLateOptimization() {
15071507
// performance for targets that require Structured Control Flow.
15081508
// In addition it can also make CFG irreducible. Thus we disable it.
15091509
if (!TM->requiresStructuredCFG())
1510-
addPass(&TailDuplicateID);
1510+
addPass(&TailDuplicateLegacyID);
15111511

15121512
// Copy propagation.
15131513
addPass(&MachineCopyPropagationID);

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@
125125
#include "llvm/CodeGen/SlotIndexes.h"
126126
#include "llvm/CodeGen/StackColoring.h"
127127
#include "llvm/CodeGen/StackProtector.h"
128+
#include "llvm/CodeGen/TailDuplication.h"
128129
#include "llvm/CodeGen/TargetPassConfig.h"
129130
#include "llvm/CodeGen/TwoAddressInstructionPass.h"
130131
#include "llvm/CodeGen/TypePromotion.h"

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ void NVPTXPassConfig::addIRPasses() {
332332
disablePass(&PrologEpilogCodeInserterID);
333333
disablePass(&MachineLateInstrsCleanupID);
334334
disablePass(&MachineCopyPropagationID);
335-
disablePass(&TailDuplicateID);
335+
disablePass(&TailDuplicateLegacyID);
336336
disablePass(&StackMapLivenessID);
337337
disablePass(&PostRAMachineSinkingID);
338338
disablePass(&PostRASchedulerID);
@@ -461,7 +461,7 @@ void NVPTXPassConfig::addOptimizedRegAlloc() {
461461

462462
void NVPTXPassConfig::addMachineSSAOptimization() {
463463
// Pre-ra tail duplication.
464-
if (addPass(&EarlyTailDuplicateID))
464+
if (addPass(&EarlyTailDuplicateLegacyID))
465465
printAndVerify("After Pre-RegAlloc TailDuplicate");
466466

467467
// Optimize PHIs before DCE: removing dead PHI cycles may make more

llvm/test/CodeGen/AArch64/jump-table-duplicate.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -run-pass=tailduplication -tail-dup-size=4 %s -o - | FileCheck %s
2+
# RUN: llc -passes=tailduplication -tail-dup-size=4 %s -o - | FileCheck %s
23

34
# JumpTableDest32 uses an `adr` to a temporary label (itself). If duplicated we
45
# cannot guarantee reachability for any uses after the first.

llvm/test/CodeGen/AMDGPU/early-tailduplicator-nophis.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
22
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=early-tailduplication -verify-machineinstrs -o - %s | FileCheck %s
3+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=early-tailduplication -o - %s | FileCheck %s
34

45
# There are no phis in this testcase. Early tail duplication introduces them,
56
# so the NoPHIs property needs to be cleared to avoid verifier errors

llvm/test/CodeGen/AMDGPU/early-tailduplicator-terminator.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
22
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=early-tailduplication -verify-machineinstrs -o - %s | FileCheck %s
3+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -passes=early-tailduplication -o - %s | FileCheck %s
34

45
# Early tail duplication should not merge bb.6 into bb.5, adding a
56
# non-terminator (S_SLEEP) after the terminator S_MOV_B32_term.

llvm/test/CodeGen/AMDGPU/stop-tail-duplicate-cfg-intrinsic.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
22
# RUN: llc -mtriple=amdgcn-amd-amdhsa -run-pass=early-tailduplication -verify-machineinstrs -o - %s | FileCheck %s
3+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -passes=early-tailduplication -o - %s | FileCheck %s
34

45
---
56
name: stop_duplicate_cfg_intrinsic

0 commit comments

Comments
 (0)