Skip to content

Commit 655714a

Browse files
committed
[AArch64] Use GlobalISel MatchTable Combiner Backend
Only a few minor test changes needed because I removed the "helper" suffix from the combiner name, as it's not really a helper anymore but more like the implementation itself. Depends on D153757 NOTE: This would land iff D153757 (RFC) lands too. Reviewed By: aemerson Differential Revision: https://reviews.llvm.org/D153850
1 parent 8444038 commit 655714a

27 files changed

+358
-246
lines changed

llvm/lib/Target/AArch64/AArch64Combine.td

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,21 +33,15 @@ def fold_global_offset : GICombineRule<
3333
(apply [{ applyFoldGlobalOffset(*${root}, MRI, B, Observer, ${matchinfo});}])
3434
>;
3535

36-
def AArch64PreLegalizerCombinerHelper: GICombinerHelper<
37-
"AArch64GenPreLegalizerCombinerHelper", [all_combines,
38-
fconstant_to_constant,
39-
icmp_redundant_trunc,
40-
fold_global_offset]> {
41-
let DisableRuleOption = "aarch64prelegalizercombiner-disable-rule";
42-
let StateClass = "AArch64PreLegalizerCombinerHelperState";
43-
let AdditionalArguments = [];
36+
def AArch64PreLegalizerCombiner: GICombinerHelper<
37+
"AArch64PreLegalizerCombinerImpl", [all_combines,
38+
fconstant_to_constant,
39+
icmp_redundant_trunc,
40+
fold_global_offset]> {
4441
}
4542

46-
def AArch64O0PreLegalizerCombinerHelper: GICombinerHelper<
47-
"AArch64GenO0PreLegalizerCombinerHelper", [optnone_combines]> {
48-
let DisableRuleOption = "aarch64O0prelegalizercombiner-disable-rule";
49-
let StateClass = "AArch64O0PreLegalizerCombinerHelperState";
50-
let AdditionalArguments = [];
43+
def AArch64O0PreLegalizerCombiner: GICombinerHelper<
44+
"AArch64O0PreLegalizerCombinerImpl", [optnone_combines]> {
5145
}
5246

5347
// Matchdata for combines which replace a G_SHUFFLE_VECTOR with a
@@ -213,18 +207,17 @@ def vector_sext_inreg_to_shift : GICombineRule<
213207
// Post-legalization combines which should happen at all optimization levels.
214208
// (E.g. ones that facilitate matching for the selector) For example, matching
215209
// pseudos.
216-
def AArch64PostLegalizerLoweringHelper
217-
: GICombinerHelper<"AArch64GenPostLegalizerLoweringHelper",
210+
def AArch64PostLegalizerLowering
211+
: GICombinerHelper<"AArch64PostLegalizerLoweringImpl",
218212
[shuffle_vector_lowering, vashr_vlshr_imm,
219213
icmp_lowering, build_vector_lowering,
220214
lower_vector_fcmp, form_truncstore,
221215
vector_sext_inreg_to_shift]> {
222-
let DisableRuleOption = "aarch64postlegalizerlowering-disable-rule";
223216
}
224217

225218
// Post-legalization combines which are primarily optimizations.
226-
def AArch64PostLegalizerCombinerHelper
227-
: GICombinerHelper<"AArch64GenPostLegalizerCombinerHelper",
219+
def AArch64PostLegalizerCombiner
220+
: GICombinerHelper<"AArch64PostLegalizerCombinerImpl",
228221
[copy_prop, combines_for_extload,
229222
sext_trunc_sextload, mutate_anyext_to_zext,
230223
hoist_logic_op_with_same_opcode_hands,
@@ -238,5 +231,4 @@ def AArch64PostLegalizerCombinerHelper
238231
ptr_add_immed_chain, overlapping_and,
239232
split_store_zero_128, undef_combines,
240233
select_to_minmax]> {
241-
let DisableRuleOption = "aarch64postlegalizercombiner-disable-rule";
242234
}

llvm/lib/Target/AArch64/CMakeLists.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ tablegen(LLVM AArch64GenDAGISel.inc -gen-dag-isel)
1010
tablegen(LLVM AArch64GenDisassemblerTables.inc -gen-disassembler)
1111
tablegen(LLVM AArch64GenFastISel.inc -gen-fast-isel)
1212
tablegen(LLVM AArch64GenGlobalISel.inc -gen-global-isel)
13-
tablegen(LLVM AArch64GenO0PreLegalizeGICombiner.inc -gen-global-isel-combiner
14-
-combiners="AArch64O0PreLegalizerCombinerHelper")
15-
tablegen(LLVM AArch64GenPreLegalizeGICombiner.inc -gen-global-isel-combiner
16-
-combiners="AArch64PreLegalizerCombinerHelper")
17-
tablegen(LLVM AArch64GenPostLegalizeGICombiner.inc -gen-global-isel-combiner
18-
-combiners="AArch64PostLegalizerCombinerHelper")
19-
tablegen(LLVM AArch64GenPostLegalizeGILowering.inc -gen-global-isel-combiner
20-
-combiners="AArch64PostLegalizerLoweringHelper")
13+
tablegen(LLVM AArch64GenO0PreLegalizeGICombiner.inc -gen-global-isel-combiner-matchtable
14+
-combiners="AArch64O0PreLegalizerCombiner")
15+
tablegen(LLVM AArch64GenPreLegalizeGICombiner.inc -gen-global-isel-combiner-matchtable
16+
-combiners="AArch64PreLegalizerCombiner")
17+
tablegen(LLVM AArch64GenPostLegalizeGICombiner.inc -gen-global-isel-combiner-matchtable
18+
-combiners="AArch64PostLegalizerCombiner")
19+
tablegen(LLVM AArch64GenPostLegalizeGILowering.inc -gen-global-isel-combiner-matchtable
20+
-combiners="AArch64PostLegalizerLowering")
2121
tablegen(LLVM AArch64GenInstrInfo.inc -gen-instr-info)
2222
tablegen(LLVM AArch64GenMCCodeEmitter.inc -gen-emitter)
2323
tablegen(LLVM AArch64GenMCPseudoLowering.inc -gen-pseudo-lowering)

llvm/lib/Target/AArch64/GISel/AArch64O0PreLegalizerCombiner.cpp

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "llvm/CodeGen/GlobalISel/Combiner.h"
1717
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
1818
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
19+
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h"
20+
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
1921
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
2022
#include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
2123
#include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h"
@@ -27,33 +29,67 @@
2729
#include "llvm/IR/Instructions.h"
2830
#include "llvm/Support/Debug.h"
2931

32+
#define GET_GICOMBINER_DEPS
33+
#include "AArch64GenO0PreLegalizeGICombiner.inc"
34+
#undef GET_GICOMBINER_DEPS
35+
3036
#define DEBUG_TYPE "aarch64-O0-prelegalizer-combiner"
3137

3238
using namespace llvm;
3339
using namespace MIPatternMatch;
40+
namespace {
41+
#define GET_GICOMBINER_TYPES
42+
#include "AArch64GenO0PreLegalizeGICombiner.inc"
43+
#undef GET_GICOMBINER_TYPES
3444

35-
class AArch64O0PreLegalizerCombinerHelperState {
45+
class AArch64O0PreLegalizerCombinerImpl : public GIMatchTableExecutor {
3646
protected:
3747
CombinerHelper &Helper;
48+
const AArch64O0PreLegalizerCombinerImplRuleConfig &RuleConfig;
49+
50+
const AArch64Subtarget &STI;
51+
GISelChangeObserver &Observer;
52+
MachineIRBuilder &B;
53+
MachineFunction &MF;
54+
55+
MachineRegisterInfo &MRI;
3856

3957
public:
40-
AArch64O0PreLegalizerCombinerHelperState(CombinerHelper &Helper)
41-
: Helper(Helper) {}
42-
};
58+
AArch64O0PreLegalizerCombinerImpl(
59+
const AArch64O0PreLegalizerCombinerImplRuleConfig &RuleConfig,
60+
GISelChangeObserver &Observer, MachineIRBuilder &B,
61+
CombinerHelper &Helper);
62+
63+
static const char *getName() { return "AArch64O0PreLegalizerCombiner"; }
4364

44-
#define AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
65+
bool tryCombineAll(MachineInstr &I) const;
66+
67+
private:
68+
#define GET_GICOMBINER_CLASS_MEMBERS
4569
#include "AArch64GenO0PreLegalizeGICombiner.inc"
46-
#undef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
70+
#undef GET_GICOMBINER_CLASS_MEMBERS
71+
};
4772

48-
namespace {
49-
#define AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
73+
#define GET_GICOMBINER_IMPL
74+
#include "AArch64GenO0PreLegalizeGICombiner.inc"
75+
#undef GET_GICOMBINER_IMPL
76+
77+
AArch64O0PreLegalizerCombinerImpl::AArch64O0PreLegalizerCombinerImpl(
78+
const AArch64O0PreLegalizerCombinerImplRuleConfig &RuleConfig,
79+
GISelChangeObserver &Observer, MachineIRBuilder &B, CombinerHelper &Helper)
80+
: Helper(Helper), RuleConfig(RuleConfig),
81+
STI(B.getMF().getSubtarget<AArch64Subtarget>()), Observer(Observer), B(B),
82+
MF(B.getMF()), MRI(*B.getMRI()),
83+
#define GET_GICOMBINER_CONSTRUCTOR_INITS
5084
#include "AArch64GenO0PreLegalizeGICombiner.inc"
51-
#undef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
85+
#undef GET_GICOMBINER_CONSTRUCTOR_INITS
86+
{
87+
}
5288

5389
class AArch64O0PreLegalizerCombinerInfo : public CombinerInfo {
5490
GISelKnownBits *KB;
5591
MachineDominatorTree *MDT;
56-
AArch64GenO0PreLegalizerCombinerHelperRuleConfig GeneratedRuleCfg;
92+
AArch64O0PreLegalizerCombinerImplRuleConfig RuleConfig;
5793

5894
public:
5995
AArch64O0PreLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize,
@@ -62,7 +98,7 @@ class AArch64O0PreLegalizerCombinerInfo : public CombinerInfo {
6298
: CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
6399
/*LegalizerInfo*/ nullptr, EnableOpt, OptSize, MinSize),
64100
KB(KB), MDT(MDT) {
65-
if (!GeneratedRuleCfg.parseCommandLineOption())
101+
if (!RuleConfig.parseCommandLineOption())
66102
report_fatal_error("Invalid rule identifier");
67103
}
68104

@@ -74,9 +110,10 @@ bool AArch64O0PreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
74110
MachineInstr &MI,
75111
MachineIRBuilder &B) const {
76112
CombinerHelper Helper(Observer, B, /*IsPreLegalize*/ true, KB, MDT);
77-
AArch64GenO0PreLegalizerCombinerHelper Generated(GeneratedRuleCfg, Helper);
113+
AArch64O0PreLegalizerCombinerImpl Impl(RuleConfig, Observer, B, Helper);
114+
Impl.setupMF(*MI.getMF(), KB);
78115

79-
if (Generated.tryCombineAll(Observer, MI, B))
116+
if (Impl.tryCombineAll(MI))
80117
return true;
81118

82119
unsigned Opc = MI.getOpcode();
@@ -104,10 +141,6 @@ bool AArch64O0PreLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
104141
return false;
105142
}
106143

107-
#define AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
108-
#include "AArch64GenO0PreLegalizeGICombiner.inc"
109-
#undef AARCH64O0PRELEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
110-
111144
// Pass boilerplate
112145
// ================
113146

llvm/lib/Target/AArch64/GISel/AArch64PostLegalizerCombiner.cpp

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include "llvm/CodeGen/GlobalISel/Combiner.h"
2525
#include "llvm/CodeGen/GlobalISel/CombinerHelper.h"
2626
#include "llvm/CodeGen/GlobalISel/CombinerInfo.h"
27+
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h"
28+
#include "llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
2729
#include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
2830
#include "llvm/CodeGen/GlobalISel/GISelKnownBits.h"
2931
#include "llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
@@ -37,11 +39,21 @@
3739
#include "llvm/CodeGen/TargetPassConfig.h"
3840
#include "llvm/Support/Debug.h"
3941

42+
#define GET_GICOMBINER_DEPS
43+
#include "AArch64GenPostLegalizeGICombiner.inc"
44+
#undef GET_GICOMBINER_DEPS
45+
4046
#define DEBUG_TYPE "aarch64-postlegalizer-combiner"
4147

4248
using namespace llvm;
4349
using namespace MIPatternMatch;
4450

51+
namespace {
52+
53+
#define GET_GICOMBINER_TYPES
54+
#include "AArch64GenPostLegalizeGICombiner.inc"
55+
#undef GET_GICOMBINER_TYPES
56+
4557
/// This combine tries do what performExtractVectorEltCombine does in SDAG.
4658
/// Rewrite for pairwise fadd pattern
4759
/// (s32 (g_extract_vector_elt
@@ -109,13 +121,13 @@ void applyExtractVecEltPairwiseAdd(
109121
MI.eraseFromParent();
110122
}
111123

112-
static bool isSignExtended(Register R, MachineRegisterInfo &MRI) {
124+
bool isSignExtended(Register R, MachineRegisterInfo &MRI) {
113125
// TODO: check if extended build vector as well.
114126
unsigned Opc = MRI.getVRegDef(R)->getOpcode();
115127
return Opc == TargetOpcode::G_SEXT || Opc == TargetOpcode::G_SEXT_INREG;
116128
}
117129

118-
static bool isZeroExtended(Register R, MachineRegisterInfo &MRI) {
130+
bool isZeroExtended(Register R, MachineRegisterInfo &MRI) {
119131
// TODO: check if extended build vector as well.
120132
return MRI.getVRegDef(R)->getOpcode() == TargetOpcode::G_ZEXT;
121133
}
@@ -264,7 +276,7 @@ void applyFoldMergeToZext(MachineInstr &MI, MachineRegisterInfo &MRI,
264276

265277
/// \returns True if a G_ANYEXT instruction \p MI should be mutated to a G_ZEXT
266278
/// instruction.
267-
static bool matchMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI) {
279+
bool matchMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI) {
268280
// If this is coming from a scalar compare then we can use a G_ZEXT instead of
269281
// a G_ANYEXT:
270282
//
@@ -281,17 +293,17 @@ static bool matchMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI)
281293
m_GFCmp(m_Pred(), m_Reg(), m_Reg())));
282294
}
283295

284-
static void applyMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI,
285-
MachineIRBuilder &B,
286-
GISelChangeObserver &Observer) {
296+
void applyMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI,
297+
MachineIRBuilder &B,
298+
GISelChangeObserver &Observer) {
287299
Observer.changingInstr(MI);
288300
MI.setDesc(B.getTII().get(TargetOpcode::G_ZEXT));
289301
Observer.changedInstr(MI);
290302
}
291303

292304
/// Match a 128b store of zero and split it into two 64 bit stores, for
293305
/// size/performance reasons.
294-
static bool matchSplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI) {
306+
bool matchSplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI) {
295307
GStore &Store = cast<GStore>(MI);
296308
if (!Store.isSimple())
297309
return false;
@@ -307,9 +319,9 @@ static bool matchSplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI) {
307319
return MaybeCst && MaybeCst->isZero();
308320
}
309321

310-
static void applySplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI,
311-
MachineIRBuilder &B,
312-
GISelChangeObserver &Observer) {
322+
void applySplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI,
323+
MachineIRBuilder &B,
324+
GISelChangeObserver &Observer) {
313325
B.setInstrAndDebugLoc(MI);
314326
GStore &Store = cast<GStore>(MI);
315327
assert(MRI.getType(Store.getValueReg()).isVector() &&
@@ -327,29 +339,63 @@ static void applySplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI,
327339
Store.eraseFromParent();
328340
}
329341

330-
#define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
342+
class AArch64PostLegalizerCombinerImpl : public GIMatchTableExecutor {
343+
protected:
344+
CombinerHelper &Helper;
345+
const AArch64PostLegalizerCombinerImplRuleConfig &RuleConfig;
346+
347+
const AArch64Subtarget &STI;
348+
MachineRegisterInfo &MRI;
349+
GISelChangeObserver &Observer;
350+
MachineIRBuilder &B;
351+
MachineFunction &MF;
352+
353+
public:
354+
AArch64PostLegalizerCombinerImpl(
355+
const AArch64PostLegalizerCombinerImplRuleConfig &RuleConfig,
356+
const AArch64Subtarget &STI, GISelChangeObserver &Observer,
357+
MachineIRBuilder &B, CombinerHelper &Helper);
358+
359+
static const char *getName() { return "AArch64PostLegalizerCombiner"; }
360+
361+
bool tryCombineAll(MachineInstr &I) const;
362+
363+
private:
364+
#define GET_GICOMBINER_CLASS_MEMBERS
331365
#include "AArch64GenPostLegalizeGICombiner.inc"
332-
#undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
366+
#undef GET_GICOMBINER_CLASS_MEMBERS
367+
};
333368

334-
namespace {
335-
#define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
369+
#define GET_GICOMBINER_IMPL
336370
#include "AArch64GenPostLegalizeGICombiner.inc"
337-
#undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
371+
#undef GET_GICOMBINER_IMPL
372+
373+
AArch64PostLegalizerCombinerImpl::AArch64PostLegalizerCombinerImpl(
374+
const AArch64PostLegalizerCombinerImplRuleConfig &RuleConfig,
375+
const AArch64Subtarget &STI, GISelChangeObserver &Observer,
376+
MachineIRBuilder &B, CombinerHelper &Helper)
377+
: Helper(Helper), RuleConfig(RuleConfig), STI(STI), MRI(*B.getMRI()),
378+
Observer(Observer), B(B), MF(B.getMF()),
379+
#define GET_GICOMBINER_CONSTRUCTOR_INITS
380+
#include "AArch64GenPostLegalizeGICombiner.inc"
381+
#undef GET_GICOMBINER_CONSTRUCTOR_INITS
382+
{
383+
}
338384

339385
class AArch64PostLegalizerCombinerInfo : public CombinerInfo {
340386
GISelKnownBits *KB;
341387
MachineDominatorTree *MDT;
342388

343389
public:
344-
AArch64GenPostLegalizerCombinerHelperRuleConfig GeneratedRuleCfg;
390+
AArch64PostLegalizerCombinerImplRuleConfig RuleConfig;
345391

346392
AArch64PostLegalizerCombinerInfo(bool EnableOpt, bool OptSize, bool MinSize,
347393
GISelKnownBits *KB,
348394
MachineDominatorTree *MDT)
349395
: CombinerInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
350396
/*LegalizerInfo*/ nullptr, EnableOpt, OptSize, MinSize),
351397
KB(KB), MDT(MDT) {
352-
if (!GeneratedRuleCfg.parseCommandLineOption())
398+
if (!RuleConfig.parseCommandLineOption())
353399
report_fatal_error("Invalid rule identifier");
354400
}
355401

@@ -360,17 +406,14 @@ class AArch64PostLegalizerCombinerInfo : public CombinerInfo {
360406
bool AArch64PostLegalizerCombinerInfo::combine(GISelChangeObserver &Observer,
361407
MachineInstr &MI,
362408
MachineIRBuilder &B) const {
363-
const auto *LI =
364-
MI.getParent()->getParent()->getSubtarget().getLegalizerInfo();
409+
const auto &STI = MI.getMF()->getSubtarget<AArch64Subtarget>();
410+
const auto *LI = STI.getLegalizerInfo();
365411
CombinerHelper Helper(Observer, B, /*IsPreLegalize*/ false, KB, MDT, LI);
366-
AArch64GenPostLegalizerCombinerHelper Generated(GeneratedRuleCfg);
367-
return Generated.tryCombineAll(Observer, MI, B, Helper);
412+
AArch64PostLegalizerCombinerImpl Impl(RuleConfig, STI, Observer, B, Helper);
413+
Impl.setupMF(*MI.getMF(), KB);
414+
return Impl.tryCombineAll(MI);
368415
}
369416

370-
#define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
371-
#include "AArch64GenPostLegalizeGICombiner.inc"
372-
#undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
373-
374417
class AArch64PostLegalizerCombiner : public MachineFunctionPass {
375418
public:
376419
static char ID;

0 commit comments

Comments
 (0)