Skip to content

Commit a174f0d

Browse files
committed
AMDGPU/GlobalISel: Add pre-legalize combiner pass
Just copy the AArch64 pass as-is for now, except for removing the memcpy handling.
1 parent 968561b commit a174f0d

File tree

10 files changed

+263
-118
lines changed

10 files changed

+263
-118
lines changed

llvm/lib/Target/AMDGPU/AMDGPU.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class TargetOptions;
2727
class PassRegistry;
2828
class Module;
2929

30+
// GlobalISel passes
31+
void initializeAMDGPUPreLegalizerCombinerPass(PassRegistry &);
32+
FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone);
33+
3034
// R600 Passes
3135
FunctionPass *createR600VectorRegMerger();
3236
FunctionPass *createR600ExpandSpecialInstrsPass();
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//=- AMDGPUCombine.td - Define AMDGPU Combine Rules ----------*- tablegen -*-=//
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+
include "llvm/Target/GlobalISel/Combine.td"
10+
11+
def AMDGPUPreLegalizerCombinerHelper: GICombinerHelper<
12+
"AMDGPUGenPreLegalizerCombinerHelper", [all_combines,
13+
elide_br_by_inverting_cond]> {
14+
let DisableRuleOption = "amdgpuprelegalizercombiner-disable-rule";
15+
}

llvm/lib/Target/AMDGPU/AMDGPUGISel.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
include "AMDGPU.td"
14+
include "AMDGPUCombine.td"
1415

1516
def sd_vsrc0 : ComplexPattern<i32, 1, "">;
1617
def gi_vsrc0 :
Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
//=== lib/CodeGen/GlobalISel/AMDGPUPreLegalizerCombiner.cpp ---------------===//
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+
// This pass does combining of machine instructions at the generic MI level,
10+
// before the legalizer.
11+
//
12+
//===----------------------------------------------------------------------===//
13+
14+
#include "AMDGPUTargetMachine.h"
15+
#include "llvm/CodeGen/GlobalISel/Combiner.h"
16+
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
17+
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
18+
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
19+
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
20+
#include "llvm/CodeGen/MachineDominators.h"
21+
#include "llvm/CodeGen/MachineFunctionPass.h"
22+
#include "llvm/CodeGen/TargetPassConfig.h"
23+
#include "llvm/Support/Debug.h"
24+
25+
#define DEBUG_TYPE "amdgpu-prelegalizer-combiner"
26+
27+
using namespace llvm;
28+
using namespace MIPatternMatch;
29+
30+
#define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
31+
#include "AMDGPUGenGICombiner.inc"
32+
#undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
33+
34+
namespace {
35+
#define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
36+
#include "AMDGPUGenGICombiner.inc"
37+
#undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
38+
39+
class AMDGPUPreLegalizerCombinerInfo : public CombinerInfo {
40+
GISelKnownBits *KB;
41+
MachineDominatorTree *MDT;
42+
43+
public:
44+
AMDGPUGenPreLegalizerCombinerHelper Generated;
45+
46+
AMDGPUPreLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize,
47+
GISelKnownBits *KB, MachineDominatorTree *MDT)
48+
: CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
49+
/*LegalizerInfo*/ nullptr, EnableOpt, OptSize, MinSize),
50+
KB(KB), MDT(MDT) {
51+
if (!Generated.parseCommandLineOption())
52+
report_fatal_error("Invalid rule identifier");
53+
}
54+
55+
virtual bool combine(GISelChangeObserver &Observer, MachineInstr &MI,
56+
MachineIRBuilder &B) const override;
57+
};
58+
59+
bool AMDGPUPreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
60+
MachineInstr &MI,
61+
MachineIRBuilder &B) const {
62+
CombinerHelper Helper(Observer, B, KB, MDT);
63+
64+
if (Generated.tryCombineAll(Observer, MI, B, Helper))
65+
return true;
66+
67+
switch (MI.getOpcode()) {
68+
case TargetOpcode::G_CONCAT_VECTORS:
69+
return Helper.tryCombineConcatVectors(MI);
70+
case TargetOpcode::G_SHUFFLE_VECTOR:
71+
return Helper.tryCombineShuffleVector(MI);
72+
}
73+
74+
return false;
75+
}
76+
77+
#define AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
78+
#include "AMDGPUGenGICombiner.inc"
79+
#undef AMDGPUPRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
80+
81+
// Pass boilerplate
82+
// ================
83+
84+
class AMDGPUPreLegalizerCombiner : public MachineFunctionPass {
85+
public:
86+
static char ID;
87+
88+
AMDGPUPreLegalizerCombiner(bool IsOptNone = false);
89+
90+
StringRef getPassName() const override { return "AMDGPUPreLegalizerCombiner"; }
91+
92+
bool runOnMachineFunction(MachineFunction &MF) override;
93+
94+
void getAnalysisUsage(AnalysisUsage &AU) const override;
95+
private:
96+
bool IsOptNone;
97+
};
98+
} // end anonymous namespace
99+
100+
void AMDGPUPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
101+
AU.addRequired<TargetPassConfig>();
102+
AU.setPreservesCFG();
103+
getSelectionDAGFallbackAnalysisUsage(AU);
104+
AU.addRequired<GISelKnownBitsAnalysis>();
105+
AU.addPreserved<GISelKnownBitsAnalysis>();
106+
if (!IsOptNone) {
107+
AU.addRequired<MachineDominatorTree>();
108+
AU.addPreserved<MachineDominatorTree>();
109+
}
110+
MachineFunctionPass::getAnalysisUsage(AU);
111+
}
112+
113+
AMDGPUPreLegalizerCombiner::AMDGPUPreLegalizerCombiner(bool IsOptNone)
114+
: MachineFunctionPass(ID), IsOptNone(IsOptNone) {
115+
initializeAMDGPUPreLegalizerCombinerPass(*PassRegistry::getPassRegistry());
116+
}
117+
118+
bool AMDGPUPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
119+
if (MF.getProperties().hasProperty(
120+
MachineFunctionProperties::Property::FailedISel))
121+
return false;
122+
auto *TPC = &getAnalysis<TargetPassConfig>();
123+
const Function &F = MF.getFunction();
124+
bool EnableOpt =
125+
MF.getTarget().getOptLevel() != CodeGenOpt::None && !skipFunction(F);
126+
GISelKnownBits *KB = &getAnalysis<GISelKnownBitsAnalysis>().get(MF);
127+
MachineDominatorTree *MDT =
128+
IsOptNone ? nullptr : &getAnalysis<MachineDominatorTree>();
129+
AMDGPUPreLegalizerCombinerInfo PCInfo(EnableOpt, F.hasOptSize(),
130+
F.hasMinSize(), KB, MDT);
131+
Combiner C(PCInfo, TPC);
132+
return C.combineMachineInstrs(MF, /*CSEInfo*/ nullptr);
133+
}
134+
135+
char AMDGPUPreLegalizerCombiner::ID = 0;
136+
INITIALIZE_PASS_BEGIN(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
137+
"Combine AMDGPU machine instrs before legalization",
138+
false, false)
139+
INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
140+
INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
141+
INITIALIZE_PASS_END(AMDGPUPreLegalizerCombiner, DEBUG_TYPE,
142+
"Combine AMDGPU machine instrs before legalization", false,
143+
false)
144+
145+
namespace llvm {
146+
FunctionPass *createAMDGPUPreLegalizeCombiner(bool IsOptNone) {
147+
return new AMDGPUPreLegalizerCombiner(IsOptNone);
148+
}
149+
} // end namespace llvm

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAMDGPUTarget() {
217217
initializeAMDGPULowerKernelAttributesPass(*PR);
218218
initializeAMDGPULowerIntrinsicsPass(*PR);
219219
initializeAMDGPUOpenCLEnqueuedBlockLoweringPass(*PR);
220+
initializeAMDGPUPreLegalizerCombinerPass(*PR);
220221
initializeAMDGPUPromoteAllocaPass(*PR);
221222
initializeAMDGPUCodeGenPreparePass(*PR);
222223
initializeAMDGPUPropagateAttributesEarlyPass(*PR);
@@ -617,6 +618,7 @@ class GCNPassConfig final : public AMDGPUPassConfig {
617618
bool addILPOpts() override;
618619
bool addInstSelector() override;
619620
bool addIRTranslator() override;
621+
void addPreLegalizeMachineIR() override;
620622
bool addLegalizeMachineIR() override;
621623
bool addRegBankSelect() override;
622624
bool addGlobalInstructionSelect() override;
@@ -895,6 +897,11 @@ bool GCNPassConfig::addIRTranslator() {
895897
return false;
896898
}
897899

900+
void GCNPassConfig::addPreLegalizeMachineIR() {
901+
bool IsOptNone = getOptLevel() == CodeGenOpt::None;
902+
addPass(createAMDGPUPreLegalizeCombiner(IsOptNone));
903+
}
904+
898905
bool GCNPassConfig::addLegalizeMachineIR() {
899906
addPass(new Legalizer());
900907
return false;

llvm/lib/Target/AMDGPU/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ tablegen(LLVM AMDGPUGenSubtargetInfo.inc -gen-subtarget)
1515

1616
set(LLVM_TARGET_DEFINITIONS AMDGPUGISel.td)
1717
tablegen(LLVM AMDGPUGenGlobalISel.inc -gen-global-isel)
18+
tablegen(LLVM AMDGPUGenGICombiner.inc -gen-global-isel-combiner
19+
-combiners="AMDGPUPreLegalizerCombinerHelper")
1820

1921
set(LLVM_TARGET_DEFINITIONS R600.td)
2022
tablegen(LLVM R600GenAsmWriter.inc -gen-asm-writer)
@@ -58,6 +60,7 @@ add_llvm_target(AMDGPUCodeGen
5860
AMDGPUMacroFusion.cpp
5961
AMDGPUMCInstLower.cpp
6062
AMDGPUOpenCLEnqueuedBlockLowering.cpp
63+
AMDGPUPreLegalizerCombiner.cpp
6164
AMDGPUPromoteAlloca.cpp
6265
AMDGPUPropagateAttributes.cpp
6366
AMDGPURegisterBankInfo.cpp

0 commit comments

Comments
 (0)