@@ -314,7 +314,7 @@ static Expected<LLTCodeGen> getInstResultType(const TreePatternNode &Dst,
314314
315315class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
316316public:
317- explicit GlobalISelEmitter (RecordKeeper &RK);
317+ explicit GlobalISelEmitter (const RecordKeeper &RK);
318318
319319 void emitAdditionalImpl (raw_ostream &OS) override ;
320320
@@ -335,18 +335,18 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
335335private:
336336 std::string ClassName;
337337
338- RecordKeeper &RK;
338+ const RecordKeeper &RK;
339339 const CodeGenDAGPatterns CGP;
340340 const CodeGenTarget &Target;
341341 CodeGenRegBank &CGRegs;
342342
343- std::vector< Record *> AllPatFrags;
343+ ArrayRef< const Record *> AllPatFrags;
344344
345345 // / Keep track of the equivalence between SDNodes and Instruction by mapping
346346 // / SDNodes to the GINodeEquiv mapping. We need to map to the GINodeEquiv to
347347 // / check for attributes on the relation such as CheckMMOIsNonAtomic.
348348 // / This is defined using 'GINodeEquiv' in the target description.
349- DenseMap<const Record *, Record *> NodeEquivs;
349+ DenseMap<const Record *, const Record *> NodeEquivs;
350350
351351 // / Keep track of the equivalence between ComplexPattern's and
352352 // / GIComplexOperandMatcher. Map entries are specified by subclassing
@@ -379,8 +379,8 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
379379 void gatherTypeIDValues ();
380380 void gatherNodeEquivs ();
381381
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,
384384 const TreePatternNode &N) const ;
385385
386386 Error importRulePredicates (RuleMatcher &M,
@@ -472,7 +472,7 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
472472 InstructionMatcher &InsnMatcher, bool &HasAddedMatcher);
473473};
474474
475- StringRef getPatFragPredicateEnumName (Record *R) { return R->getName (); }
475+ StringRef getPatFragPredicateEnumName (const Record *R) { return R->getName (); }
476476
477477void GlobalISelEmitter::gatherOpcodeValues () {
478478 InstructionOpcodeMatcher::initOpcodeValuesMap (Target);
@@ -484,32 +484,35 @@ void GlobalISelEmitter::gatherTypeIDValues() {
484484
485485void GlobalISelEmitter::gatherNodeEquivs () {
486486 assert (NodeEquivs.empty ());
487- for (Record *Equiv : RK.getAllDerivedDefinitions (" GINodeEquiv" ))
487+ for (const Record *Equiv : RK.getAllDerivedDefinitions (" GINodeEquiv" ))
488488 NodeEquivs[Equiv->getValueAsDef (" Node" )] = Equiv;
489489
490490 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" );
493494 if (!SelDAGEquiv)
494495 continue ;
495496 ComplexPatternEquivs[SelDAGEquiv] = Equiv;
496497 }
497498
498499 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" );
501503 if (!SelDAGEquiv)
502504 continue ;
503505 SDNodeXFormEquivs[SelDAGEquiv] = Equiv;
504506 }
505507}
506508
507- Record *GlobalISelEmitter::findNodeEquiv (const Record *N) const {
509+ const Record *GlobalISelEmitter::findNodeEquiv (const Record *N) const {
508510 return NodeEquivs.lookup (N);
509511}
510512
511513const CodeGenInstruction *
512- GlobalISelEmitter::getEquivNode (Record &Equiv, const TreePatternNode &N) const {
514+ GlobalISelEmitter::getEquivNode (const Record &Equiv,
515+ const TreePatternNode &N) const {
513516 if (N.getNumChildren () >= 1 ) {
514517 // setcc operation maps to two different G_* instructions based on the type.
515518 if (!Equiv.isValueUnset (" IfFloatingPoint" ) &&
@@ -536,7 +539,7 @@ GlobalISelEmitter::getEquivNode(Record &Equiv, const TreePatternNode &N) const {
536539 return &Target.getInstruction (Equiv.getValueAsDef (" I" ));
537540}
538541
539- GlobalISelEmitter::GlobalISelEmitter (RecordKeeper &RK)
542+ GlobalISelEmitter::GlobalISelEmitter (const RecordKeeper &RK)
540543 : GlobalISelMatchTableExecutorEmitter(), RK(RK), CGP(RK),
541544 Target (CGP.getTargetInfo()), CGRegs(Target.getRegBank()) {
542545 ClassName = Target.getName ().str () + " InstructionSelector" ;
@@ -721,7 +724,7 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
721724 const TreePatternNode &Src, unsigned &TempOpIdx) {
722725 const auto SavedFlags = Rule.setGISelFlags (Src.getGISelFlagsRecord ());
723726
724- Record *SrcGIEquivOrNull = nullptr ;
727+ const Record *SrcGIEquivOrNull = nullptr ;
725728 const CodeGenInstruction *SrcGIOrNull = nullptr ;
726729
727730 // Start with the defined operands (i.e., the results of the root operator).
@@ -942,7 +945,7 @@ Error GlobalISelEmitter::importComplexPatternOperandMatcher(
942945// Get the name to use for a pattern operand. For an anonymous physical register
943946// input, this should use the register name.
944947static StringRef getSrcChildName (const TreePatternNode &SrcChild,
945- Record *&PhysReg) {
948+ const Record *&PhysReg) {
946949 StringRef SrcChildName = SrcChild.getName ();
947950 if (SrcChildName.empty () && SrcChild.isLeaf ()) {
948951 if (auto *ChildDefInit = dyn_cast<DefInit>(SrcChild.getLeafValue ())) {
@@ -962,7 +965,7 @@ Error GlobalISelEmitter::importChildMatcher(
962965 const TreePatternNode &SrcChild, bool OperandIsAPointer,
963966 bool OperandIsImmArg, unsigned OpIdx, unsigned &TempOpIdx) {
964967
965- Record *PhysReg = nullptr ;
968+ const Record *PhysReg = nullptr ;
966969 std::string SrcChildName = std::string (getSrcChildName (SrcChild, PhysReg));
967970 if (!SrcChild.isLeaf () &&
968971 SrcChild.getOperator ()->isSubClassOf (" ComplexPattern" )) {
@@ -1196,7 +1199,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
11961199 auto &Child = DstChild.getChild (0 );
11971200 auto I = SDNodeXFormEquivs.find (DstChild.getOperator ());
11981201 if (I != SDNodeXFormEquivs.end ()) {
1199- Record *XFormOpc = DstChild.getOperator ()->getValueAsDef (" Opcode" );
1202+ const Record *XFormOpc =
1203+ DstChild.getOperator ()->getValueAsDef (" Opcode" );
12001204 if (XFormOpc->getName () == " timm" ) {
12011205 // If this is a TargetConstant, there won't be a corresponding
12021206 // instruction to transform. Instead, this will refer directly to an
@@ -2290,65 +2294,65 @@ void GlobalISelEmitter::emitAdditionalImpl(raw_ostream &OS) {
22902294}
22912295
22922296void GlobalISelEmitter::emitMIPredicateFns (raw_ostream &OS) {
2293- std::vector<Record *> MatchedRecords;
2297+ std::vector<const Record *> MatchedRecords;
22942298 std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2295- std::back_inserter (MatchedRecords), [&]( Record *R) {
2299+ std::back_inserter (MatchedRecords), []( const Record *R) {
22962300 return !R->getValueAsString (" GISelPredicateCode" ).empty ();
22972301 });
2298- emitMIPredicateFnsImpl<Record *>(
2302+ emitMIPredicateFnsImpl<const Record *>(
22992303 OS,
23002304 " const MachineFunction &MF = *MI.getParent()->getParent();\n "
23012305 " const MachineRegisterInfo &MRI = MF.getRegInfo();\n "
23022306 " const auto &Operands = State.RecordedOperands;\n "
23032307 " (void)Operands;\n "
23042308 " (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" ); },
23072311 " PatFrag predicates." );
23082312}
23092313
23102314void GlobalISelEmitter::emitI64ImmPredicateFns (raw_ostream &OS) {
2311- std::vector<Record *> MatchedRecords;
2315+ std::vector<const Record *> MatchedRecords;
23122316 std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2313- std::back_inserter (MatchedRecords), [&]( Record *R) {
2317+ std::back_inserter (MatchedRecords), []( const Record *R) {
23142318 bool Unset;
23152319 return !R->getValueAsString (" ImmediateCode" ).empty () &&
23162320 !R->getValueAsBitOrUnset (" IsAPFloat" , Unset) &&
23172321 !R->getValueAsBit (" IsAPInt" );
23182322 });
2319- emitImmPredicateFnsImpl<Record *>(
2320- OS, " I64" , " int64_t" , ArrayRef<Record *>(MatchedRecords),
2323+ emitImmPredicateFnsImpl<const Record *>(
2324+ OS, " I64" , " int64_t" , ArrayRef<const Record *>(MatchedRecords),
23212325 &getPatFragPredicateEnumName,
2322- [&]( Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2326+ []( const Record *R) { return R->getValueAsString (" ImmediateCode" ); },
23232327 " PatFrag predicates." );
23242328}
23252329
23262330void GlobalISelEmitter::emitAPFloatImmPredicateFns (raw_ostream &OS) {
2327- std::vector<Record *> MatchedRecords;
2331+ std::vector<const Record *> MatchedRecords;
23282332 std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2329- std::back_inserter (MatchedRecords), [&]( Record *R) {
2333+ std::back_inserter (MatchedRecords), []( const Record *R) {
23302334 bool Unset;
23312335 return !R->getValueAsString (" ImmediateCode" ).empty () &&
23322336 R->getValueAsBitOrUnset (" IsAPFloat" , Unset);
23332337 });
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" ); },
23382342 " PatFrag predicates." );
23392343}
23402344
23412345void GlobalISelEmitter::emitAPIntImmPredicateFns (raw_ostream &OS) {
2342- std::vector<Record *> MatchedRecords;
2346+ std::vector<const Record *> MatchedRecords;
23432347 std::copy_if (AllPatFrags.begin (), AllPatFrags.end (),
2344- std::back_inserter (MatchedRecords), [&]( Record *R) {
2348+ std::back_inserter (MatchedRecords), []( const Record *R) {
23452349 return !R->getValueAsString (" ImmediateCode" ).empty () &&
23462350 R->getValueAsBit (" IsAPInt" );
23472351 });
2348- emitImmPredicateFnsImpl<Record *>(
2349- OS, " APInt" , " const APInt &" , ArrayRef<Record *>(MatchedRecords),
2352+ emitImmPredicateFnsImpl<const Record *>(
2353+ OS, " APInt" , " const APInt &" , ArrayRef<const Record *>(MatchedRecords),
23502354 &getPatFragPredicateEnumName,
2351- [&]( Record *R) { return R->getValueAsString (" ImmediateCode" ); },
2355+ []( const Record *R) { return R->getValueAsString (" ImmediateCode" ); },
23522356 " PatFrag predicates." );
23532357}
23542358
@@ -2461,7 +2465,7 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
24612465 return A->getName () < B->getName ();
24622466 };
24632467
2464- std::vector<Record *> ComplexPredicates =
2468+ std::vector<const Record *> ComplexPredicates =
24652469 RK.getAllDerivedDefinitions (" GIComplexOperandMatcher" );
24662470 llvm::sort (ComplexPredicates, OrderByName);
24672471
0 commit comments