Skip to content

Commit 3696a34

Browse files
authored
AMDGPU/NewPM: Port SILowerI1Copies to new pass manager (#102663)
1 parent 77e68fb commit 3696a34

File tree

6 files changed

+100
-66
lines changed

6 files changed

+100
-66
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef LLVM_LIB_TARGET_AMDGPU_AMDGPU_H
1111
#define LLVM_LIB_TARGET_AMDGPU_AMDGPU_H
1212

13+
#include "llvm/CodeGen/MachinePassManager.h"
1314
#include "llvm/IR/PassManager.h"
1415
#include "llvm/Pass.h"
1516
#include "llvm/Support/AMDGPUAddrSpace.h"
@@ -36,7 +37,7 @@ FunctionPass *createGCNDPPCombinePass();
3637
FunctionPass *createSIAnnotateControlFlowLegacyPass();
3738
FunctionPass *createSIFoldOperandsPass();
3839
FunctionPass *createSIPeepholeSDWAPass();
39-
FunctionPass *createSILowerI1CopiesPass();
40+
FunctionPass *createSILowerI1CopiesLegacyPass();
4041
FunctionPass *createAMDGPUGlobalISelDivergenceLoweringPass();
4142
FunctionPass *createSIShrinkInstructionsPass();
4243
FunctionPass *createSILoadStoreOptimizerPass();
@@ -82,6 +83,13 @@ struct AMDGPUUseNativeCallsPass : PassInfoMixin<AMDGPUUseNativeCallsPass> {
8283
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
8384
};
8485

86+
class SILowerI1CopiesPass : public PassInfoMixin<SILowerI1CopiesPass> {
87+
public:
88+
SILowerI1CopiesPass() = default;
89+
PreservedAnalyses run(MachineFunction &MF,
90+
MachineFunctionAnalysisManager &MFAM);
91+
};
92+
8593
void initializeAMDGPUDAGToDAGISelLegacyPass(PassRegistry &);
8694

8795
void initializeAMDGPUMachineCFGStructurizerPass(PassRegistry&);
@@ -174,8 +182,8 @@ extern char &SIFixVGPRCopiesID;
174182
void initializeSILowerWWMCopiesPass(PassRegistry &);
175183
extern char &SILowerWWMCopiesID;
176184

177-
void initializeSILowerI1CopiesPass(PassRegistry &);
178-
extern char &SILowerI1CopiesID;
185+
void initializeSILowerI1CopiesLegacyPass(PassRegistry &);
186+
extern char &SILowerI1CopiesLegacyID;
179187

180188
void initializeAMDGPUGlobalISelDivergenceLoweringPass(PassRegistry &);
181189
extern char &AMDGPUGlobalISelDivergenceLoweringID;

llvm/lib/Target/AMDGPU/AMDGPUCodeGenPassBuilder.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
//===----------------------------------------------------------------------===//
88

99
#include "AMDGPUCodeGenPassBuilder.h"
10+
#include "AMDGPU.h"
1011
#include "AMDGPUISelDAGToDAG.h"
1112
#include "AMDGPUTargetMachine.h"
1213
#include "SIFixSGPRCopies.h"
@@ -40,5 +41,6 @@ void AMDGPUCodeGenPassBuilder::addAsmPrinter(AddMachinePass &addPass,
4041
Error AMDGPUCodeGenPassBuilder::addInstSelector(AddMachinePass &addPass) const {
4142
addPass(AMDGPUISelDAGToDAGPass(TM));
4243
addPass(SIFixSGPRCopiesPass());
44+
addPass(SILowerI1CopiesPass());
4345
return Error::success();
4446
}

llvm/lib/Target/AMDGPU/AMDGPUPassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,5 @@ FUNCTION_PASS_WITH_PARAMS(
8989
#endif
9090
MACHINE_FUNCTION_PASS("amdgpu-isel", AMDGPUISelDAGToDAGPass(*this))
9191
MACHINE_FUNCTION_PASS("si-fix-sgpr-copies", SIFixSGPRCopiesPass())
92+
MACHINE_FUNCTION_PASS("si-i1-copies", SILowerI1CopiesPass())
9293
#undef MACHINE_FUNCTION_PASS

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
396396
initializeGlobalISel(*PR);
397397
initializeAMDGPUDAGToDAGISelLegacyPass(*PR);
398398
initializeGCNDPPCombinePass(*PR);
399-
initializeSILowerI1CopiesPass(*PR);
399+
initializeSILowerI1CopiesLegacyPass(*PR);
400400
initializeAMDGPUGlobalISelDivergenceLoweringPass(*PR);
401401
initializeSILowerWWMCopiesPass(*PR);
402402
initializeAMDGPUMarkLastScratchLoadPass(*PR);
@@ -1289,7 +1289,7 @@ bool GCNPassConfig::addILPOpts() {
12891289
bool GCNPassConfig::addInstSelector() {
12901290
AMDGPUPassConfig::addInstSelector();
12911291
addPass(&SIFixSGPRCopiesLegacyID);
1292-
addPass(createSILowerI1CopiesPass());
1292+
addPass(createSILowerI1CopiesLegacyPass());
12931293
return false;
12941294
}
12951295

llvm/lib/Target/AMDGPU/SILowerI1Copies.cpp

Lines changed: 83 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -37,26 +37,6 @@ insertUndefLaneMask(MachineBasicBlock *MBB, MachineRegisterInfo *MRI,
3737

3838
namespace {
3939

40-
class SILowerI1Copies : public MachineFunctionPass {
41-
public:
42-
static char ID;
43-
44-
SILowerI1Copies() : MachineFunctionPass(ID) {
45-
initializeSILowerI1CopiesPass(*PassRegistry::getPassRegistry());
46-
}
47-
48-
bool runOnMachineFunction(MachineFunction &MF) override;
49-
50-
StringRef getPassName() const override { return "SI Lower i1 Copies"; }
51-
52-
void getAnalysisUsage(AnalysisUsage &AU) const override {
53-
AU.setPreservesCFG();
54-
AU.addRequired<MachineDominatorTreeWrapperPass>();
55-
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
56-
MachineFunctionPass::getAnalysisUsage(AU);
57-
}
58-
};
59-
6040
class Vreg1LoweringHelper : public PhiLoweringHelper {
6141
public:
6242
Vreg1LoweringHelper(MachineFunction *MF, MachineDominatorTree *DT,
@@ -397,21 +377,6 @@ class LoopFinder {
397377

398378
} // End anonymous namespace.
399379

400-
INITIALIZE_PASS_BEGIN(SILowerI1Copies, DEBUG_TYPE, "SI Lower i1 Copies", false,
401-
false)
402-
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
403-
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
404-
INITIALIZE_PASS_END(SILowerI1Copies, DEBUG_TYPE, "SI Lower i1 Copies", false,
405-
false)
406-
407-
char SILowerI1Copies::ID = 0;
408-
409-
char &llvm::SILowerI1CopiesID = SILowerI1Copies::ID;
410-
411-
FunctionPass *llvm::createSILowerI1CopiesPass() {
412-
return new SILowerI1Copies();
413-
}
414-
415380
Register
416381
llvm::createLaneMaskReg(MachineRegisterInfo *MRI,
417382
MachineRegisterInfo::VRegAttrs LaneMaskRegAttrs) {
@@ -430,32 +395,6 @@ insertUndefLaneMask(MachineBasicBlock *MBB, MachineRegisterInfo *MRI,
430395
return UndefReg;
431396
}
432397

433-
/// Lower all instructions that def or use vreg_1 registers.
434-
///
435-
/// In a first pass, we lower COPYs from vreg_1 to vector registers, as can
436-
/// occur around inline assembly. We do this first, before vreg_1 registers
437-
/// are changed to scalar mask registers.
438-
///
439-
/// Then we lower all defs of vreg_1 registers. Phi nodes are lowered before
440-
/// all others, because phi lowering looks through copies and can therefore
441-
/// often make copy lowering unnecessary.
442-
bool SILowerI1Copies::runOnMachineFunction(MachineFunction &TheMF) {
443-
// Only need to run this in SelectionDAG path.
444-
if (TheMF.getProperties().hasProperty(
445-
MachineFunctionProperties::Property::Selected))
446-
return false;
447-
448-
Vreg1LoweringHelper Helper(
449-
&TheMF, &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree(),
450-
&getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree());
451-
452-
bool Changed = false;
453-
Changed |= Helper.lowerCopiesFromI1();
454-
Changed |= Helper.lowerPhis();
455-
Changed |= Helper.lowerCopiesToI1();
456-
return Helper.cleanConstrainRegs(Changed);
457-
}
458-
459398
#ifndef NDEBUG
460399
static bool isVRegCompatibleReg(const SIRegisterInfo &TRI,
461400
const MachineRegisterInfo &MRI,
@@ -915,3 +854,86 @@ void Vreg1LoweringHelper::buildMergeLaneMasks(MachineBasicBlock &MBB,
915854
}
916855

917856
void Vreg1LoweringHelper::constrainAsLaneMask(Incoming &In) {}
857+
858+
/// Lower all instructions that def or use vreg_1 registers.
859+
///
860+
/// In a first pass, we lower COPYs from vreg_1 to vector registers, as can
861+
/// occur around inline assembly. We do this first, before vreg_1 registers
862+
/// are changed to scalar mask registers.
863+
///
864+
/// Then we lower all defs of vreg_1 registers. Phi nodes are lowered before
865+
/// all others, because phi lowering looks through copies and can therefore
866+
/// often make copy lowering unnecessary.
867+
static bool runFixI1Copies(MachineFunction &MF, MachineDominatorTree &MDT,
868+
MachinePostDominatorTree &MPDT) {
869+
// Only need to run this in SelectionDAG path.
870+
if (MF.getProperties().hasProperty(
871+
MachineFunctionProperties::Property::Selected))
872+
return false;
873+
874+
Vreg1LoweringHelper Helper(&MF, &MDT, &MPDT);
875+
bool Changed = false;
876+
Changed |= Helper.lowerCopiesFromI1();
877+
Changed |= Helper.lowerPhis();
878+
Changed |= Helper.lowerCopiesToI1();
879+
return Helper.cleanConstrainRegs(Changed);
880+
}
881+
882+
PreservedAnalyses
883+
SILowerI1CopiesPass::run(MachineFunction &MF,
884+
MachineFunctionAnalysisManager &MFAM) {
885+
MachineDominatorTree &MDT = MFAM.getResult<MachineDominatorTreeAnalysis>(MF);
886+
MachinePostDominatorTree &MPDT =
887+
MFAM.getResult<MachinePostDominatorTreeAnalysis>(MF);
888+
bool Changed = runFixI1Copies(MF, MDT, MPDT);
889+
if (!Changed)
890+
return PreservedAnalyses::all();
891+
892+
// TODO: Probably preserves most.
893+
PreservedAnalyses PA;
894+
PA.preserveSet<CFGAnalyses>();
895+
return PA;
896+
}
897+
898+
class SILowerI1CopiesLegacy : public MachineFunctionPass {
899+
public:
900+
static char ID;
901+
902+
SILowerI1CopiesLegacy() : MachineFunctionPass(ID) {
903+
initializeSILowerI1CopiesLegacyPass(*PassRegistry::getPassRegistry());
904+
}
905+
906+
bool runOnMachineFunction(MachineFunction &MF) override;
907+
908+
StringRef getPassName() const override { return "SI Lower i1 Copies"; }
909+
910+
void getAnalysisUsage(AnalysisUsage &AU) const override {
911+
AU.setPreservesCFG();
912+
AU.addRequired<MachineDominatorTreeWrapperPass>();
913+
AU.addRequired<MachinePostDominatorTreeWrapperPass>();
914+
MachineFunctionPass::getAnalysisUsage(AU);
915+
}
916+
};
917+
918+
bool SILowerI1CopiesLegacy::runOnMachineFunction(MachineFunction &MF) {
919+
MachineDominatorTree &MDT =
920+
getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
921+
MachinePostDominatorTree &MPDT =
922+
getAnalysis<MachinePostDominatorTreeWrapperPass>().getPostDomTree();
923+
return runFixI1Copies(MF, MDT, MPDT);
924+
}
925+
926+
INITIALIZE_PASS_BEGIN(SILowerI1CopiesLegacy, DEBUG_TYPE, "SI Lower i1 Copies",
927+
false, false)
928+
INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
929+
INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTreeWrapperPass)
930+
INITIALIZE_PASS_END(SILowerI1CopiesLegacy, DEBUG_TYPE, "SI Lower i1 Copies",
931+
false, false)
932+
933+
char SILowerI1CopiesLegacy::ID = 0;
934+
935+
char &llvm::SILowerI1CopiesLegacyID = SILowerI1CopiesLegacy::ID;
936+
937+
FunctionPass *llvm::createSILowerI1CopiesLegacyPass() {
938+
return new SILowerI1CopiesLegacy();
939+
}

llvm/test/CodeGen/AMDGPU/si-lower-i1-copies.mir

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -run-pass=si-i1-copies -o - %s | FileCheck -check-prefixes=GCN %s
2+
# RUN: llc -mtriple=amdgcn-amd-amdhsa -verify-machineinstrs -passes=si-i1-copies -o - %s | FileCheck -check-prefixes=GCN %s
23

34
# GCN-LABEL: name: lcssa_phi
45
---

0 commit comments

Comments
 (0)