@@ -314,7 +314,7 @@ static Expected<LLTCodeGen> getInstResultType(const TreePatternNode &Dst,
314
314
315
315
class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
316
316
public:
317
- explicit GlobalISelEmitter (RecordKeeper &RK);
317
+ explicit GlobalISelEmitter (const RecordKeeper &RK);
318
318
319
319
void emitAdditionalImpl (raw_ostream &OS) override ;
320
320
@@ -335,18 +335,18 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
335
335
private:
336
336
std::string ClassName;
337
337
338
- RecordKeeper &RK;
338
+ const RecordKeeper &RK;
339
339
const CodeGenDAGPatterns CGP;
340
340
const CodeGenTarget &Target;
341
341
CodeGenRegBank &CGRegs;
342
342
343
- std::vector< Record *> AllPatFrags;
343
+ ArrayRef< const Record *> AllPatFrags;
344
344
345
345
// / Keep track of the equivalence between SDNodes and Instruction by mapping
346
346
// / SDNodes to the GINodeEquiv mapping. We need to map to the GINodeEquiv to
347
347
// / check for attributes on the relation such as CheckMMOIsNonAtomic.
348
348
// / This is defined using 'GINodeEquiv' in the target description.
349
- DenseMap<const Record *, Record *> NodeEquivs;
349
+ DenseMap<const Record *, const Record *> NodeEquivs;
350
350
351
351
// / Keep track of the equivalence between ComplexPattern's and
352
352
// / GIComplexOperandMatcher. Map entries are specified by subclassing
@@ -379,8 +379,8 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
379
379
void gatherTypeIDValues ();
380
380
void gatherNodeEquivs ();
381
381
382
- Record *findNodeEquiv (const Record *N) const ;
383
- const CodeGenInstruction *getEquivNode (Record &Equiv,
382
+ const Record *findNodeEquiv (const Record *N) const ;
383
+ const CodeGenInstruction *getEquivNode (const Record &Equiv,
384
384
const TreePatternNode &N) const ;
385
385
386
386
Error importRulePredicates (RuleMatcher &M,
@@ -472,7 +472,7 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
472
472
InstructionMatcher &InsnMatcher, bool &HasAddedMatcher);
473
473
};
474
474
475
- StringRef getPatFragPredicateEnumName (Record *R) { return R->getName (); }
475
+ StringRef getPatFragPredicateEnumName (const Record *R) { return R->getName (); }
476
476
477
477
void GlobalISelEmitter::gatherOpcodeValues () {
478
478
InstructionOpcodeMatcher::initOpcodeValuesMap (Target);
@@ -484,32 +484,35 @@ void GlobalISelEmitter::gatherTypeIDValues() {
484
484
485
485
void GlobalISelEmitter::gatherNodeEquivs () {
486
486
assert (NodeEquivs.empty ());
487
- for (Record *Equiv : RK.getAllDerivedDefinitions (" GINodeEquiv" ))
487
+ for (const Record *Equiv : RK.getAllDerivedDefinitions (" GINodeEquiv" ))
488
488
NodeEquivs[Equiv->getValueAsDef (" Node" )] = Equiv;
489
489
490
490
assert (ComplexPatternEquivs.empty ());
491
- for (Record *Equiv : RK.getAllDerivedDefinitions (" GIComplexPatternEquiv" )) {
492
- Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
491
+ for (const Record *Equiv :
492
+ RK.getAllDerivedDefinitions (" GIComplexPatternEquiv" )) {
493
+ const Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
493
494
if (!SelDAGEquiv)
494
495
continue ;
495
496
ComplexPatternEquivs[SelDAGEquiv] = Equiv;
496
497
}
497
498
498
499
assert (SDNodeXFormEquivs.empty ());
499
- for (Record *Equiv : RK.getAllDerivedDefinitions (" GISDNodeXFormEquiv" )) {
500
- Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
500
+ for (const Record *Equiv :
501
+ RK.getAllDerivedDefinitions (" GISDNodeXFormEquiv" )) {
502
+ const Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
501
503
if (!SelDAGEquiv)
502
504
continue ;
503
505
SDNodeXFormEquivs[SelDAGEquiv] = Equiv;
504
506
}
505
507
}
506
508
507
- Record *GlobalISelEmitter::findNodeEquiv (const Record *N) const {
509
+ const Record *GlobalISelEmitter::findNodeEquiv (const Record *N) const {
508
510
return NodeEquivs.lookup (N);
509
511
}
510
512
511
513
const CodeGenInstruction *
512
- GlobalISelEmitter::getEquivNode (Record &Equiv, const TreePatternNode &N) const {
514
+ GlobalISelEmitter::getEquivNode (const Record &Equiv,
515
+ const TreePatternNode &N) const {
513
516
if (N.getNumChildren () >= 1 ) {
514
517
// setcc operation maps to two different G_* instructions based on the type.
515
518
if (!Equiv.isValueUnset (" IfFloatingPoint" ) &&
@@ -536,7 +539,7 @@ GlobalISelEmitter::getEquivNode(Record &Equiv, const TreePatternNode &N) const {
536
539
return &Target.getInstruction (Equiv.getValueAsDef (" I" ));
537
540
}
538
541
539
- GlobalISelEmitter::GlobalISelEmitter (RecordKeeper &RK)
542
+ GlobalISelEmitter::GlobalISelEmitter (const RecordKeeper &RK)
540
543
: GlobalISelMatchTableExecutorEmitter(), RK(RK), CGP(RK),
541
544
Target (CGP.getTargetInfo()), CGRegs(Target.getRegBank()) {
542
545
ClassName = Target.getName ().str () + " InstructionSelector" ;
@@ -721,7 +724,7 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
721
724
const TreePatternNode &Src, unsigned &TempOpIdx) {
722
725
const auto SavedFlags = Rule.setGISelFlags (Src.getGISelFlagsRecord ());
723
726
724
- Record *SrcGIEquivOrNull = nullptr ;
727
+ const Record *SrcGIEquivOrNull = nullptr ;
725
728
const CodeGenInstruction *SrcGIOrNull = nullptr ;
726
729
727
730
// Start with the defined operands (i.e., the results of the root operator).
@@ -942,7 +945,7 @@ Error GlobalISelEmitter::importComplexPatternOperandMatcher(
942
945
// Get the name to use for a pattern operand. For an anonymous physical register
943
946
// input, this should use the register name.
944
947
static StringRef getSrcChildName (const TreePatternNode &SrcChild,
945
- Record *&PhysReg) {
948
+ const Record *&PhysReg) {
946
949
StringRef SrcChildName = SrcChild.getName ();
947
950
if (SrcChildName.empty () && SrcChild.isLeaf ()) {
948
951
if (auto *ChildDefInit = dyn_cast<DefInit>(SrcChild.getLeafValue ())) {
@@ -962,7 +965,7 @@ Error GlobalISelEmitter::importChildMatcher(
962
965
const TreePatternNode &SrcChild, bool OperandIsAPointer,
963
966
bool OperandIsImmArg, unsigned OpIdx, unsigned &TempOpIdx) {
964
967
965
- Record *PhysReg = nullptr ;
968
+ const Record *PhysReg = nullptr ;
966
969
std::string SrcChildName = std::string (getSrcChildName (SrcChild, PhysReg));
967
970
if (!SrcChild.isLeaf () &&
968
971
SrcChild.getOperator ()->isSubClassOf (" ComplexPattern" )) {
@@ -1196,7 +1199,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1196
1199
auto &Child = DstChild.getChild (0 );
1197
1200
auto I = SDNodeXFormEquivs.find (DstChild.getOperator ());
1198
1201
if (I != SDNodeXFormEquivs.end ()) {
1199
- Record *XFormOpc = DstChild.getOperator ()->getValueAsDef (" Opcode" );
1202
+ const Record *XFormOpc =
1203
+ DstChild.getOperator ()->getValueAsDef (" Opcode" );
1200
1204
if (XFormOpc->getName () == " timm" ) {
1201
1205
// If this is a TargetConstant, there won't be a corresponding
1202
1206
// instruction to transform. Instead, this will refer directly to an
@@ -2290,65 +2294,65 @@ void GlobalISelEmitter::emitAdditionalImpl(raw_ostream &OS) {
2290
2294
}
2291
2295
2292
2296
void GlobalISelEmitter::emitMIPredicateFns (raw_ostream &OS) {
2293
- std::vector<Record *> MatchedRecords;
2297
+ std::vector<const Record *> MatchedRecords;
2294
2298
std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2295
- std::back_inserter (MatchedRecords), [&]( Record *R) {
2299
+ std::back_inserter (MatchedRecords), []( const Record *R) {
2296
2300
return !R->getValueAsString (" GISelPredicateCode" ).empty ();
2297
2301
});
2298
- emitMIPredicateFnsImpl<Record *>(
2302
+ emitMIPredicateFnsImpl<const Record *>(
2299
2303
OS,
2300
2304
" const MachineFunction &MF = *MI.getParent()->getParent();\n "
2301
2305
" const MachineRegisterInfo &MRI = MF.getRegInfo();\n "
2302
2306
" const auto &Operands = State.RecordedOperands;\n "
2303
2307
" (void)Operands;\n "
2304
2308
" (void)MRI;" ,
2305
- ArrayRef<Record *>(MatchedRecords), &getPatFragPredicateEnumName,
2306
- [&]( Record *R) { return R->getValueAsString (" GISelPredicateCode" ); },
2309
+ ArrayRef<const Record *>(MatchedRecords), &getPatFragPredicateEnumName,
2310
+ []( const Record *R) { return R->getValueAsString (" GISelPredicateCode" ); },
2307
2311
" PatFrag predicates." );
2308
2312
}
2309
2313
2310
2314
void GlobalISelEmitter::emitI64ImmPredicateFns (raw_ostream &OS) {
2311
- std::vector<Record *> MatchedRecords;
2315
+ std::vector<const Record *> MatchedRecords;
2312
2316
std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2313
- std::back_inserter (MatchedRecords), [&]( Record *R) {
2317
+ std::back_inserter (MatchedRecords), []( const Record *R) {
2314
2318
bool Unset;
2315
2319
return !R->getValueAsString (" ImmediateCode" ).empty () &&
2316
2320
!R->getValueAsBitOrUnset (" IsAPFloat" , Unset) &&
2317
2321
!R->getValueAsBit (" IsAPInt" );
2318
2322
});
2319
- emitImmPredicateFnsImpl<Record *>(
2320
- OS, " I64" , " int64_t" , ArrayRef<Record *>(MatchedRecords),
2323
+ emitImmPredicateFnsImpl<const Record *>(
2324
+ OS, " I64" , " int64_t" , ArrayRef<const Record *>(MatchedRecords),
2321
2325
&getPatFragPredicateEnumName,
2322
- [&]( Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2326
+ []( const Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2323
2327
" PatFrag predicates." );
2324
2328
}
2325
2329
2326
2330
void GlobalISelEmitter::emitAPFloatImmPredicateFns (raw_ostream &OS) {
2327
- std::vector<Record *> MatchedRecords;
2331
+ std::vector<const Record *> MatchedRecords;
2328
2332
std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2329
- std::back_inserter (MatchedRecords), [&]( Record *R) {
2333
+ std::back_inserter (MatchedRecords), []( const Record *R) {
2330
2334
bool Unset;
2331
2335
return !R->getValueAsString (" ImmediateCode" ).empty () &&
2332
2336
R->getValueAsBitOrUnset (" IsAPFloat" , Unset);
2333
2337
});
2334
- emitImmPredicateFnsImpl<Record *>(
2335
- OS, " APFloat" , " const APFloat &" , ArrayRef<Record *>(MatchedRecords),
2336
- &getPatFragPredicateEnumName,
2337
- [&]( Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2338
+ emitImmPredicateFnsImpl<const Record *>(
2339
+ OS, " APFloat" , " const APFloat &" ,
2340
+ ArrayRef< const Record *>(MatchedRecords), &getPatFragPredicateEnumName,
2341
+ []( const Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2338
2342
" PatFrag predicates." );
2339
2343
}
2340
2344
2341
2345
void GlobalISelEmitter::emitAPIntImmPredicateFns (raw_ostream &OS) {
2342
- std::vector<Record *> MatchedRecords;
2346
+ std::vector<const Record *> MatchedRecords;
2343
2347
std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2344
- std::back_inserter (MatchedRecords), [&]( Record *R) {
2348
+ std::back_inserter (MatchedRecords), []( const Record *R) {
2345
2349
return !R->getValueAsString (" ImmediateCode" ).empty () &&
2346
2350
R->getValueAsBit (" IsAPInt" );
2347
2351
});
2348
- emitImmPredicateFnsImpl<Record *>(
2349
- OS, " APInt" , " const APInt &" , ArrayRef<Record *>(MatchedRecords),
2352
+ emitImmPredicateFnsImpl<const Record *>(
2353
+ OS, " APInt" , " const APInt &" , ArrayRef<const Record *>(MatchedRecords),
2350
2354
&getPatFragPredicateEnumName,
2351
- [&]( Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2355
+ []( const Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2352
2356
" PatFrag predicates." );
2353
2357
}
2354
2358
@@ -2461,7 +2465,7 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
2461
2465
return A->getName () < B->getName ();
2462
2466
};
2463
2467
2464
- std::vector<Record *> ComplexPredicates =
2468
+ std::vector<const Record *> ComplexPredicates =
2465
2469
RK.getAllDerivedDefinitions (" GIComplexOperandMatcher" );
2466
2470
llvm::sort (ComplexPredicates, OrderByName);
2467
2471
0 commit comments