Skip to content

Commit 3f9d02a

Browse files
authored
[CodeGen][NewPM] Port PeepholeOptimizer to NPM (#116326)
With this, all machine SSA optimization passes are available in the new codegen pipeline.
1 parent 00aa081 commit 3f9d02a

16 files changed

+111
-42
lines changed

llvm/include/llvm/CodeGen/Passes.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ namespace llvm {
363363

364364
/// PeepholeOptimizer - This pass performs peephole optimizations -
365365
/// like extension and comparison eliminations.
366-
extern char &PeepholeOptimizerID;
366+
extern char &PeepholeOptimizerLegacyID;
367367

368368
/// OptimizePHIs - This pass optimizes machine instruction PHIs
369369
/// to take advantage of opportunities created during DAG legalization.
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//===- llvm/CodeGen/PeepholeOptimizer.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_PEEPHOLEOPTIMIZER_H
10+
#define LLVM_CODEGEN_PEEPHOLEOPTIMIZER_H
11+
12+
#include "llvm/CodeGen/MachinePassManager.h"
13+
14+
namespace llvm {
15+
16+
class PeepholeOptimizerPass : public PassInfoMixin<PeepholeOptimizerPass> {
17+
public:
18+
PreservedAnalyses run(MachineFunction &MF,
19+
MachineFunctionAnalysisManager &MFAM);
20+
21+
MachineFunctionProperties getRequiredProperties() const {
22+
return MachineFunctionProperties().set(
23+
MachineFunctionProperties::Property::IsSSA);
24+
}
25+
};
26+
27+
} // namespace llvm
28+
29+
#endif // LLVM_CODEGEN_PEEPHOLEOPTIMIZER_H

llvm/include/llvm/InitializePasses.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ void initializePEIPass(PassRegistry &);
227227
void initializePHIEliminationPass(PassRegistry &);
228228
void initializePartiallyInlineLibCallsLegacyPassPass(PassRegistry &);
229229
void initializePatchableFunctionPass(PassRegistry &);
230-
void initializePeepholeOptimizerPass(PassRegistry &);
230+
void initializePeepholeOptimizerLegacyPass(PassRegistry &);
231231
void initializePhiValuesWrapperPassPass(PassRegistry &);
232232
void initializePhysicalRegisterUsageInfoWrapperLegacyPass(PassRegistry &);
233233
void initializePlaceBackedgeSafepointsLegacyPassPass(PassRegistry &);

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
#include "llvm/CodeGen/MachineVerifier.h"
5353
#include "llvm/CodeGen/OptimizePHIs.h"
5454
#include "llvm/CodeGen/PHIElimination.h"
55+
#include "llvm/CodeGen/PeepholeOptimizer.h"
5556
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
5657
#include "llvm/CodeGen/RegAllocFast.h"
5758
#include "llvm/CodeGen/RegUsageInfoCollector.h"

llvm/include/llvm/Passes/MachinePassRegistry.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass())
142142
MACHINE_FUNCTION_PASS("machinelicm", MachineLICMPass())
143143
MACHINE_FUNCTION_PASS("no-op-machine-function", NoOpMachineFunctionPass())
144144
MACHINE_FUNCTION_PASS("opt-phis", OptimizePHIsPass())
145+
MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass())
145146
MACHINE_FUNCTION_PASS("phi-node-elimination", PHIEliminationPass())
146147
MACHINE_FUNCTION_PASS("print", PrintMIRPass())
147148
MACHINE_FUNCTION_PASS("print<live-intervals>", LiveIntervalsPrinterPass(dbgs()))
@@ -240,7 +241,6 @@ DUMMY_MACHINE_FUNCTION_PASS("machine-uniformity", MachineUniformityInfoWrapperPa
240241
DUMMY_MACHINE_FUNCTION_PASS("machineinstr-printer", MachineFunctionPrinterPass)
241242
DUMMY_MACHINE_FUNCTION_PASS("mirfs-discriminators", MIRAddFSDiscriminatorsPass)
242243
DUMMY_MACHINE_FUNCTION_PASS("patchable-function", PatchableFunctionPass)
243-
DUMMY_MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass)
244244
DUMMY_MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass)
245245
DUMMY_MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass)
246246
DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass)

llvm/lib/CodeGen/CodeGen.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ void llvm::initializeCodeGen(PassRegistry &Registry) {
103103
initializePEIPass(Registry);
104104
initializePHIEliminationPass(Registry);
105105
initializePatchableFunctionPass(Registry);
106-
initializePeepholeOptimizerPass(Registry);
106+
initializePeepholeOptimizerLegacyPass(Registry);
107107
initializePostMachineSchedulerPass(Registry);
108108
initializePostRAHazardRecognizerPass(Registry);
109109
initializePostRAMachineSinkingPass(Registry);

llvm/lib/CodeGen/PeepholeOptimizer.cpp

Lines changed: 68 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
// C = copy A <-- same-bank copy
6666
//===----------------------------------------------------------------------===//
6767

68+
#include "llvm/CodeGen/PeepholeOptimizer.h"
6869
#include "llvm/ADT/DenseMap.h"
6970
#include "llvm/ADT/SmallPtrSet.h"
7071
#include "llvm/ADT/SmallSet.h"
@@ -78,6 +79,7 @@
7879
#include "llvm/CodeGen/MachineInstrBuilder.h"
7980
#include "llvm/CodeGen/MachineLoopInfo.h"
8081
#include "llvm/CodeGen/MachineOperand.h"
82+
#include "llvm/CodeGen/MachinePassManager.h"
8183
#include "llvm/CodeGen/MachineRegisterInfo.h"
8284
#include "llvm/CodeGen/TargetInstrInfo.h"
8385
#include "llvm/CodeGen/TargetOpcodes.h"
@@ -147,39 +149,18 @@ namespace {
147149
class ValueTrackerResult;
148150
class RecurrenceInstr;
149151

150-
class PeepholeOptimizer : public MachineFunctionPass,
151-
private MachineFunction::Delegate {
152+
class PeepholeOptimizer : private MachineFunction::Delegate {
152153
const TargetInstrInfo *TII = nullptr;
153154
const TargetRegisterInfo *TRI = nullptr;
154155
MachineRegisterInfo *MRI = nullptr;
155156
MachineDominatorTree *DT = nullptr; // Machine dominator tree
156157
MachineLoopInfo *MLI = nullptr;
157158

158159
public:
159-
static char ID; // Pass identification
160-
161-
PeepholeOptimizer() : MachineFunctionPass(ID) {
162-
initializePeepholeOptimizerPass(*PassRegistry::getPassRegistry());
163-
}
164-
165-
bool runOnMachineFunction(MachineFunction &MF) override;
166-
167-
void getAnalysisUsage(AnalysisUsage &AU) const override {
168-
AU.setPreservesCFG();
169-
MachineFunctionPass::getAnalysisUsage(AU);
170-
AU.addRequired<MachineLoopInfoWrapperPass>();
171-
AU.addPreserved<MachineLoopInfoWrapperPass>();
172-
if (Aggressive) {
173-
AU.addRequired<MachineDominatorTreeWrapperPass>();
174-
AU.addPreserved<MachineDominatorTreeWrapperPass>();
175-
}
176-
}
177-
178-
MachineFunctionProperties getRequiredProperties() const override {
179-
return MachineFunctionProperties().set(
180-
MachineFunctionProperties::Property::IsSSA);
181-
}
160+
PeepholeOptimizer(MachineDominatorTree *DT, MachineLoopInfo *MLI)
161+
: DT(DT), MLI(MLI) {}
182162

163+
bool run(MachineFunction &MF);
183164
/// Track Def -> Use info used for rewriting copies.
184165
using RewriteMapTy = SmallDenseMap<RegSubRegPair, ValueTrackerResult>;
185166

@@ -294,6 +275,33 @@ class PeepholeOptimizer : public MachineFunctionPass,
294275
}
295276
};
296277

278+
class PeepholeOptimizerLegacy : public MachineFunctionPass {
279+
public:
280+
static char ID; // Pass identification
281+
282+
PeepholeOptimizerLegacy() : MachineFunctionPass(ID) {
283+
initializePeepholeOptimizerLegacyPass(*PassRegistry::getPassRegistry());
284+
}
285+
286+
bool runOnMachineFunction(MachineFunction &MF) override;
287+
288+
void getAnalysisUsage(AnalysisUsage &AU) const override {
289+
AU.setPreservesCFG();
290+
MachineFunctionPass::getAnalysisUsage(AU);
291+
AU.addRequired<MachineLoopInfoWrapperPass>();
292+
AU.addPreserved<MachineLoopInfoWrapperPass>();
293+
if (Aggressive) {
294+
AU.addRequired<MachineDominatorTreeWrapperPass>();
295+
AU.addPreserved<MachineDominatorTreeWrapperPass>();
296+
}
297+
}
298+
299+
MachineFunctionProperties getRequiredProperties() const override {
300+
return MachineFunctionProperties().set(
301+
MachineFunctionProperties::Property::IsSSA);
302+
}
303+
};
304+
297305
/// Helper class to hold instructions that are inside recurrence cycles.
298306
/// The recurrence cycle is formulated around 1) a def operand and its
299307
/// tied use operand, or 2) a def operand and a use operand that is commutable
@@ -469,16 +477,16 @@ class ValueTracker {
469477

470478
} // end anonymous namespace
471479

472-
char PeepholeOptimizer::ID = 0;
480+
char PeepholeOptimizerLegacy::ID = 0;
473481

474-
char &llvm::PeepholeOptimizerID = PeepholeOptimizer::ID;
482+
char &llvm::PeepholeOptimizerLegacyID = PeepholeOptimizerLegacy::ID;
475483

476-
INITIALIZE_PASS_BEGIN(PeepholeOptimizer, DEBUG_TYPE, "Peephole Optimizations",
477-
false, false)
484+
INITIALIZE_PASS_BEGIN(PeepholeOptimizerLegacy, DEBUG_TYPE,
485+
"Peephole Optimizations", false, false)
478486
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
479487
INITIALIZE_PASS_DEPENDENCY(MachineLoopInfoWrapperPass)
480-
INITIALIZE_PASS_END(PeepholeOptimizer, DEBUG_TYPE, "Peephole Optimizations",
481-
false, false)
488+
INITIALIZE_PASS_END(PeepholeOptimizerLegacy, DEBUG_TYPE,
489+
"Peephole Optimizations", false, false)
482490

483491
/// If instruction is a copy-like instruction, i.e. it reads a single register
484492
/// and writes a single register and it does not modify the source, and if the
@@ -1644,9 +1652,37 @@ bool PeepholeOptimizer::optimizeRecurrence(MachineInstr &PHI) {
16441652
return Changed;
16451653
}
16461654

1647-
bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
1655+
PreservedAnalyses
1656+
PeepholeOptimizerPass::run(MachineFunction &MF,
1657+
MachineFunctionAnalysisManager &MFAM) {
1658+
MFPropsModifier _(*this, MF);
1659+
auto *DT =
1660+
Aggressive ? &MFAM.getResult<MachineDominatorTreeAnalysis>(MF) : nullptr;
1661+
auto *MLI = &MFAM.getResult<MachineLoopAnalysis>(MF);
1662+
PeepholeOptimizer Impl(DT, MLI);
1663+
bool Changed = Impl.run(MF);
1664+
if (!Changed)
1665+
return PreservedAnalyses::all();
1666+
1667+
auto PA = getMachineFunctionPassPreservedAnalyses();
1668+
PA.preserve<MachineDominatorTreeAnalysis>();
1669+
PA.preserve<MachineLoopAnalysis>();
1670+
PA.preserveSet<CFGAnalyses>();
1671+
return PA;
1672+
}
1673+
1674+
bool PeepholeOptimizerLegacy::runOnMachineFunction(MachineFunction &MF) {
16481675
if (skipFunction(MF.getFunction()))
16491676
return false;
1677+
auto *DT = Aggressive
1678+
? &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree()
1679+
: nullptr;
1680+
auto *MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1681+
PeepholeOptimizer Impl(DT, MLI);
1682+
return Impl.run(MF);
1683+
}
1684+
1685+
bool PeepholeOptimizer::run(MachineFunction &MF) {
16501686

16511687
LLVM_DEBUG(dbgs() << "********** PEEPHOLE OPTIMIZER **********\n");
16521688
LLVM_DEBUG(dbgs() << "********** Function: " << MF.getName() << '\n');
@@ -1657,9 +1693,6 @@ bool PeepholeOptimizer::runOnMachineFunction(MachineFunction &MF) {
16571693
TII = MF.getSubtarget().getInstrInfo();
16581694
TRI = MF.getSubtarget().getRegisterInfo();
16591695
MRI = &MF.getRegInfo();
1660-
DT = Aggressive ? &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree()
1661-
: nullptr;
1662-
MLI = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
16631696
MF.setDelegate(this);
16641697

16651698
bool Changed = false;

llvm/lib/CodeGen/TargetPassConfig.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1315,7 +1315,7 @@ void TargetPassConfig::addMachineSSAOptimization() {
13151315

13161316
addPass(&MachineSinkingID);
13171317

1318-
addPass(&PeepholeOptimizerID);
1318+
addPass(&PeepholeOptimizerLegacyID);
13191319
// Clean-up the dead code that may have been generated by peephole
13201320
// rewriting.
13211321
addPass(&DeadMachineInstructionElimID);

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@
118118
#include "llvm/CodeGen/MachineVerifier.h"
119119
#include "llvm/CodeGen/OptimizePHIs.h"
120120
#include "llvm/CodeGen/PHIElimination.h"
121+
#include "llvm/CodeGen/PeepholeOptimizer.h"
121122
#include "llvm/CodeGen/PreISelIntrinsicLowering.h"
122123
#include "llvm/CodeGen/RegAllocFast.h"
123124
#include "llvm/CodeGen/RegUsageInfoCollector.h"

llvm/lib/Target/AArch64/AArch64TargetMachine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ void AArch64PassConfig::addPreRegAlloc() {
810810
addPass(createAArch64AdvSIMDScalar());
811811
// The AdvSIMD pass may produce copies that can be rewritten to
812812
// be register coalescer friendly.
813-
addPass(&PeepholeOptimizerID);
813+
addPass(&PeepholeOptimizerLegacyID);
814814
}
815815
if (TM->getOptLevel() != CodeGenOptLevel::None && EnableMachinePipeliner)
816816
addPass(&MachinePipelinerID);

llvm/lib/Target/NVPTX/NVPTXTargetMachine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,6 @@ void NVPTXPassConfig::addMachineSSAOptimization() {
498498
addPass(&MachineSinkingID);
499499
printAndVerify("After Machine LICM, CSE and Sinking passes");
500500

501-
addPass(&PeepholeOptimizerID);
501+
addPass(&PeepholeOptimizerLegacyID);
502502
printAndVerify("After codegen peephole optimization pass");
503503
}

llvm/test/CodeGen/AArch64/csinc-cmp-removal.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=aarch64 -run-pass=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s
3+
# RUN: llc -mtriple=aarch64 -passes=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s
34
---
45
name: remove_subswr_after_csincwr
56
tracksRegLiveness: true

llvm/test/CodeGen/AMDGPU/fold-immediate-output-mods.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn -run-pass peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
2+
# RUN: llc -mtriple=amdgcn -passes peephole-opt -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
23
...
34
# GCN-LABEL: name: no_fold_imm_madak_mac_clamp_f32
45
# GCN: %23:vgpr_32 = V_MOV_B32_e32 1090519040, implicit $exec

llvm/test/CodeGen/ARM/cmp1-peephole-thumb.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 -run-pass=peephole-opt %s -o - | FileCheck %s
3+
# RUN: llc -passes=peephole-opt %s -o - | FileCheck %s
34

45
--- |
56
; ModuleID = '<stdin>'

llvm/test/CodeGen/Lanai/peephole-compare.mir

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

34
# Test the compare fold peephole.
45

llvm/test/CodeGen/PowerPC/bitcast-peephole.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=powerpc64le-linux-gnu -run-pass=peephole-opt -verify-machineinstrs -o - %s | FileCheck %s
3+
# RUN: llc -mtriple=powerpc64le-linux-gnu -passes=peephole-opt -verify-machineinstrs -o - %s | FileCheck %s
34

45
---
56
name: bitCast

0 commit comments

Comments
 (0)