24
24
#include " llvm/CodeGen/GlobalISel/Combiner.h"
25
25
#include " llvm/CodeGen/GlobalISel/CombinerHelper.h"
26
26
#include " llvm/CodeGen/GlobalISel/CombinerInfo.h"
27
+ #include " llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h"
28
+ #include " llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h"
27
29
#include " llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
28
30
#include " llvm/CodeGen/GlobalISel/GISelKnownBits.h"
29
31
#include " llvm/CodeGen/GlobalISel/GenericMachineInstrs.h"
37
39
#include " llvm/CodeGen/TargetPassConfig.h"
38
40
#include " llvm/Support/Debug.h"
39
41
42
+ #define GET_GICOMBINER_DEPS
43
+ #include " AArch64GenPostLegalizeGICombiner.inc"
44
+ #undef GET_GICOMBINER_DEPS
45
+
40
46
#define DEBUG_TYPE " aarch64-postlegalizer-combiner"
41
47
42
48
using namespace llvm ;
43
49
using namespace MIPatternMatch ;
44
50
51
+ namespace {
52
+
53
+ #define GET_GICOMBINER_TYPES
54
+ #include " AArch64GenPostLegalizeGICombiner.inc"
55
+ #undef GET_GICOMBINER_TYPES
56
+
45
57
// / This combine tries do what performExtractVectorEltCombine does in SDAG.
46
58
// / Rewrite for pairwise fadd pattern
47
59
// / (s32 (g_extract_vector_elt
@@ -109,13 +121,13 @@ void applyExtractVecEltPairwiseAdd(
109
121
MI.eraseFromParent ();
110
122
}
111
123
112
- static bool isSignExtended (Register R, MachineRegisterInfo &MRI) {
124
+ bool isSignExtended (Register R, MachineRegisterInfo &MRI) {
113
125
// TODO: check if extended build vector as well.
114
126
unsigned Opc = MRI.getVRegDef (R)->getOpcode ();
115
127
return Opc == TargetOpcode::G_SEXT || Opc == TargetOpcode::G_SEXT_INREG;
116
128
}
117
129
118
- static bool isZeroExtended (Register R, MachineRegisterInfo &MRI) {
130
+ bool isZeroExtended (Register R, MachineRegisterInfo &MRI) {
119
131
// TODO: check if extended build vector as well.
120
132
return MRI.getVRegDef (R)->getOpcode () == TargetOpcode::G_ZEXT;
121
133
}
@@ -264,7 +276,7 @@ void applyFoldMergeToZext(MachineInstr &MI, MachineRegisterInfo &MRI,
264
276
265
277
// / \returns True if a G_ANYEXT instruction \p MI should be mutated to a G_ZEXT
266
278
// / instruction.
267
- static bool matchMutateAnyExtToZExt (MachineInstr &MI, MachineRegisterInfo &MRI) {
279
+ bool matchMutateAnyExtToZExt (MachineInstr &MI, MachineRegisterInfo &MRI) {
268
280
// If this is coming from a scalar compare then we can use a G_ZEXT instead of
269
281
// a G_ANYEXT:
270
282
//
@@ -281,17 +293,17 @@ static bool matchMutateAnyExtToZExt(MachineInstr &MI, MachineRegisterInfo &MRI)
281
293
m_GFCmp (m_Pred (), m_Reg (), m_Reg ())));
282
294
}
283
295
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) {
287
299
Observer.changingInstr (MI);
288
300
MI.setDesc (B.getTII ().get (TargetOpcode::G_ZEXT));
289
301
Observer.changedInstr (MI);
290
302
}
291
303
292
304
// / Match a 128b store of zero and split it into two 64 bit stores, for
293
305
// / size/performance reasons.
294
- static bool matchSplitStoreZero128 (MachineInstr &MI, MachineRegisterInfo &MRI) {
306
+ bool matchSplitStoreZero128 (MachineInstr &MI, MachineRegisterInfo &MRI) {
295
307
GStore &Store = cast<GStore>(MI);
296
308
if (!Store.isSimple ())
297
309
return false ;
@@ -307,9 +319,9 @@ static bool matchSplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI) {
307
319
return MaybeCst && MaybeCst->isZero ();
308
320
}
309
321
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) {
313
325
B.setInstrAndDebugLoc (MI);
314
326
GStore &Store = cast<GStore>(MI);
315
327
assert (MRI.getType (Store.getValueReg ()).isVector () &&
@@ -327,29 +339,63 @@ static void applySplitStoreZero128(MachineInstr &MI, MachineRegisterInfo &MRI,
327
339
Store.eraseFromParent ();
328
340
}
329
341
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
331
365
#include " AArch64GenPostLegalizeGICombiner.inc"
332
- #undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_DEPS
366
+ #undef GET_GICOMBINER_CLASS_MEMBERS
367
+ };
333
368
334
- namespace {
335
- #define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_H
369
+ #define GET_GICOMBINER_IMPL
336
370
#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
+ }
338
384
339
385
class AArch64PostLegalizerCombinerInfo : public CombinerInfo {
340
386
GISelKnownBits *KB;
341
387
MachineDominatorTree *MDT;
342
388
343
389
public:
344
- AArch64GenPostLegalizerCombinerHelperRuleConfig GeneratedRuleCfg ;
390
+ AArch64PostLegalizerCombinerImplRuleConfig RuleConfig ;
345
391
346
392
AArch64PostLegalizerCombinerInfo (bool EnableOpt, bool OptSize, bool MinSize,
347
393
GISelKnownBits *KB,
348
394
MachineDominatorTree *MDT)
349
395
: CombinerInfo(/* AllowIllegalOps*/ true , /* ShouldLegalizeIllegal*/ false ,
350
396
/* LegalizerInfo*/ nullptr , EnableOpt, OptSize, MinSize),
351
397
KB (KB), MDT(MDT) {
352
- if (!GeneratedRuleCfg .parseCommandLineOption ())
398
+ if (!RuleConfig .parseCommandLineOption ())
353
399
report_fatal_error (" Invalid rule identifier" );
354
400
}
355
401
@@ -360,17 +406,14 @@ class AArch64PostLegalizerCombinerInfo : public CombinerInfo {
360
406
bool AArch64PostLegalizerCombinerInfo::combine (GISelChangeObserver &Observer,
361
407
MachineInstr &MI,
362
408
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 ();
365
411
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);
368
415
}
369
416
370
- #define AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
371
- #include " AArch64GenPostLegalizeGICombiner.inc"
372
- #undef AARCH64POSTLEGALIZERCOMBINERHELPER_GENCOMBINERHELPER_CPP
373
-
374
417
class AArch64PostLegalizerCombiner : public MachineFunctionPass {
375
418
public:
376
419
static char ID;
0 commit comments