@@ -290,8 +290,7 @@ static Expected<LLTCodeGen> getInstResultType(const TreePatternNode *Dst) {
290
290
291
291
std::optional<LLTCodeGen> MaybeOpTy;
292
292
if (ChildTypes.front ().isMachineValueType ()) {
293
- MaybeOpTy =
294
- MVTToLLT (ChildTypes.front ().getMachineValueType ().SimpleTy );
293
+ MaybeOpTy = MVTToLLT (ChildTypes.front ().getMachineValueType ().SimpleTy );
295
294
}
296
295
297
296
if (!MaybeOpTy)
@@ -468,15 +467,15 @@ void GlobalISelEmitter::gatherNodeEquivs() {
468
467
if (!SelDAGEquiv)
469
468
continue ;
470
469
ComplexPatternEquivs[SelDAGEquiv] = Equiv;
471
- }
472
-
473
- assert (SDNodeXFormEquivs.empty ());
474
- for (Record *Equiv : RK.getAllDerivedDefinitions (" GISDNodeXFormEquiv" )) {
475
- Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
476
- if (!SelDAGEquiv)
477
- continue ;
478
- SDNodeXFormEquivs[SelDAGEquiv] = Equiv;
479
- }
470
+ }
471
+
472
+ assert (SDNodeXFormEquivs.empty ());
473
+ for (Record *Equiv : RK.getAllDerivedDefinitions (" GISDNodeXFormEquiv" )) {
474
+ Record *SelDAGEquiv = Equiv->getValueAsDef (" SelDAGEquivalent" );
475
+ if (!SelDAGEquiv)
476
+ continue ;
477
+ SDNodeXFormEquivs[SelDAGEquiv] = Equiv;
478
+ }
480
479
}
481
480
482
481
Record *GlobalISelEmitter::findNodeEquiv (Record *N) const {
@@ -772,12 +771,14 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
772
771
}
773
772
774
773
bool IsAtomic = false ;
775
- if (SrcGIEquivOrNull && SrcGIEquivOrNull->getValueAsBit (" CheckMMOIsNonAtomic" ))
774
+ if (SrcGIEquivOrNull &&
775
+ SrcGIEquivOrNull->getValueAsBit (" CheckMMOIsNonAtomic" ))
776
776
InsnMatcher.addPredicate <AtomicOrderingMMOPredicateMatcher>(" NotAtomic" );
777
- else if (SrcGIEquivOrNull && SrcGIEquivOrNull->getValueAsBit (" CheckMMOIsAtomic" )) {
777
+ else if (SrcGIEquivOrNull &&
778
+ SrcGIEquivOrNull->getValueAsBit (" CheckMMOIsAtomic" )) {
778
779
IsAtomic = true ;
779
780
InsnMatcher.addPredicate <AtomicOrderingMMOPredicateMatcher>(
780
- " Unordered" , AtomicOrderingMMOPredicateMatcher::AO_OrStronger);
781
+ " Unordered" , AtomicOrderingMMOPredicateMatcher::AO_OrStronger);
781
782
}
782
783
783
784
if (Src->isLeaf ()) {
@@ -817,9 +818,9 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
817
818
return failedImport (" Unable to handle CondCode" );
818
819
819
820
OperandMatcher &OM =
820
- InsnMatcher.addOperand (OpIdx++, SrcChild->getName (), TempOpIdx);
821
- StringRef PredType = IsFCmp ? CCDef->getValueAsString (" FCmpPredicate" ) :
822
- CCDef->getValueAsString (" ICmpPredicate" );
821
+ InsnMatcher.addOperand (OpIdx++, SrcChild->getName (), TempOpIdx);
822
+ StringRef PredType = IsFCmp ? CCDef->getValueAsString (" FCmpPredicate" )
823
+ : CCDef->getValueAsString (" ICmpPredicate" );
823
824
824
825
if (!PredType.empty ()) {
825
826
OM.addPredicate <CmpPredicateOperandMatcher>(std::string (PredType));
@@ -871,8 +872,9 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
871
872
bool OperandIsImmArg = SrcGIOrNull->isInOperandImmArg (i);
872
873
873
874
// SelectionDAG allows pointers to be represented with iN since it doesn't
874
- // distinguish between pointers and integers but they are different types in GlobalISel.
875
- // Coerce integers to pointers to address space 0 if the context indicates a pointer.
875
+ // distinguish between pointers and integers but they are different types
876
+ // in GlobalISel. Coerce integers to pointers to address space 0 if the
877
+ // context indicates a pointer.
876
878
//
877
879
bool OperandIsAPointer = SrcGIOrNull->isInOperandAPointer (i);
878
880
@@ -1029,7 +1031,8 @@ Error GlobalISelEmitter::importChildMatcher(
1029
1031
// This isn't strictly true. If the user were to provide exactly the same
1030
1032
// matchers as the original operand then we could allow it. However, it's
1031
1033
// simpler to not permit the redundant specification.
1032
- return failedImport (" Nested instruction cannot be the same as another operand" );
1034
+ return failedImport (
1035
+ " Nested instruction cannot be the same as another operand" );
1033
1036
}
1034
1037
1035
1038
// Map the node to a gMIR instruction.
@@ -1079,11 +1082,11 @@ Error GlobalISelEmitter::importChildMatcher(
1079
1082
if (ChildRec->isSubClassOf (" Register" )) {
1080
1083
// This just be emitted as a copy to the specific register.
1081
1084
ValueTypeByHwMode VT = ChildTypes.front ().getValueTypeByHwMode ();
1082
- const CodeGenRegisterClass *RC
1083
- = CGRegs.getMinimalPhysRegClass (ChildRec, &VT);
1085
+ const CodeGenRegisterClass *RC =
1086
+ CGRegs.getMinimalPhysRegClass (ChildRec, &VT);
1084
1087
if (!RC) {
1085
1088
return failedImport (
1086
- " Could not determine physical register class of pattern source" );
1089
+ " Could not determine physical register class of pattern source" );
1087
1090
}
1088
1091
1089
1092
OM.addPredicate <RegisterBankOperandMatcher>(*RC);
@@ -1118,10 +1121,10 @@ Error GlobalISelEmitter::importChildMatcher(
1118
1121
1119
1122
ValueTypeByHwMode VTy = ChildTypes.front ().getValueTypeByHwMode ();
1120
1123
1121
- const CodeGenInstruction &BuildVector
1122
- = Target.getInstruction (RK.getDef (" G_BUILD_VECTOR" ));
1123
- const CodeGenInstruction &BuildVectorTrunc
1124
- = Target.getInstruction (RK.getDef (" G_BUILD_VECTOR_TRUNC" ));
1124
+ const CodeGenInstruction &BuildVector =
1125
+ Target.getInstruction (RK.getDef (" G_BUILD_VECTOR" ));
1126
+ const CodeGenInstruction &BuildVectorTrunc =
1127
+ Target.getInstruction (RK.getDef (" G_BUILD_VECTOR_TRUNC" ));
1125
1128
1126
1129
// Treat G_BUILD_VECTOR as the canonical opcode, and G_BUILD_VECTOR_TRUNC
1127
1130
// as an alternative.
@@ -1218,8 +1221,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1218
1221
return OpTy.takeError ();
1219
1222
1220
1223
unsigned TempRegID = Rule.allocateTempRegID ();
1221
- InsertPt = Rule. insertAction <MakeTempRegisterAction>(
1222
- InsertPt, *OpTy, TempRegID);
1224
+ InsertPt =
1225
+ Rule. insertAction <MakeTempRegisterAction>( InsertPt, *OpTy, TempRegID);
1223
1226
DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1224
1227
1225
1228
auto InsertPtOrError = createAndImportSubInstructionRenderer (
@@ -1229,7 +1232,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
1229
1232
return InsertPtOrError.get ();
1230
1233
}
1231
1234
1232
- return failedImport (" Dst pattern child isn't a leaf node or an MBB" + llvm::to_string (*DstChild));
1235
+ return failedImport (" Dst pattern child isn't a leaf node or an MBB" +
1236
+ llvm::to_string (*DstChild));
1233
1237
}
1234
1238
1235
1239
// It could be a specific immediate in which case we should just check for
@@ -1324,9 +1328,8 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
1324
1328
&Target.getInstruction (RK.getDef (" COPY" )));
1325
1329
BuildMIAction &CopyToPhysRegMIBuilder =
1326
1330
*static_cast <BuildMIAction *>(InsertPt->get ());
1327
- CopyToPhysRegMIBuilder.addRenderer <AddRegisterRenderer>(Target,
1328
- PhysInput.first ,
1329
- true );
1331
+ CopyToPhysRegMIBuilder.addRenderer <AddRegisterRenderer>(
1332
+ Target, PhysInput.first , true );
1330
1333
CopyToPhysRegMIBuilder.addRenderer <CopyPhysRegRenderer>(PhysInput.first );
1331
1334
}
1332
1335
@@ -1399,19 +1402,19 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
1399
1402
auto SuperClass = inferRegClassFromPattern (Dst->getChild (0 ));
1400
1403
if (!SuperClass)
1401
1404
return failedImport (
1402
- " Cannot infer register class from EXTRACT_SUBREG operand #0" );
1405
+ " Cannot infer register class from EXTRACT_SUBREG operand #0" );
1403
1406
1404
1407
auto SubIdx = inferSubRegIndexForNode (Dst->getChild (1 ));
1405
1408
if (!SubIdx)
1406
1409
return failedImport (" EXTRACT_SUBREG child #1 is not a subreg index" );
1407
1410
1408
1411
const auto SrcRCDstRCPair =
1409
- (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
1412
+ (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
1410
1413
assert (SrcRCDstRCPair->second && " Couldn't find a matching subclass" );
1411
1414
M.insertAction <ConstrainOperandToRegClassAction>(
1412
- InsertPt, DstMIBuilder.getInsnID (), 0 , *SrcRCDstRCPair->second );
1415
+ InsertPt, DstMIBuilder.getInsnID (), 0 , *SrcRCDstRCPair->second );
1413
1416
M.insertAction <ConstrainOperandToRegClassAction>(
1414
- InsertPt, DstMIBuilder.getInsnID (), 1 , *SrcRCDstRCPair->first );
1417
+ InsertPt, DstMIBuilder.getInsnID (), 1 , *SrcRCDstRCPair->first );
1415
1418
1416
1419
// We're done with this pattern! It's eligible for GISel emission; return
1417
1420
// it.
@@ -1424,23 +1427,23 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
1424
1427
auto SubClass = inferRegClassFromPattern (Dst->getChild (1 ));
1425
1428
if (!SubClass)
1426
1429
return failedImport (
1427
- " Cannot infer register class from SUBREG_TO_REG child #1" );
1428
- auto SuperClass = inferSuperRegisterClass (Dst-> getExtType ( 0 ),
1429
- Dst->getChild (2 ));
1430
+ " Cannot infer register class from SUBREG_TO_REG child #1" );
1431
+ auto SuperClass =
1432
+ inferSuperRegisterClass (Dst-> getExtType ( 0 ), Dst->getChild (2 ));
1430
1433
if (!SuperClass)
1431
1434
return failedImport (
1432
- " Cannot infer register class for SUBREG_TO_REG operand #0" );
1435
+ " Cannot infer register class for SUBREG_TO_REG operand #0" );
1433
1436
M.insertAction <ConstrainOperandToRegClassAction>(
1434
- InsertPt, DstMIBuilder.getInsnID (), 0 , **SuperClass);
1437
+ InsertPt, DstMIBuilder.getInsnID (), 0 , **SuperClass);
1435
1438
M.insertAction <ConstrainOperandToRegClassAction>(
1436
- InsertPt, DstMIBuilder.getInsnID (), 2 , **SubClass);
1439
+ InsertPt, DstMIBuilder.getInsnID (), 2 , **SubClass);
1437
1440
return InsertPtOrError.get ();
1438
1441
}
1439
1442
1440
1443
if (OpName == " REG_SEQUENCE" ) {
1441
1444
auto SuperClass = inferRegClassFromPattern (Dst->getChild (0 ));
1442
1445
M.insertAction <ConstrainOperandToRegClassAction>(
1443
- InsertPt, DstMIBuilder.getInsnID (), 0 , **SuperClass);
1446
+ InsertPt, DstMIBuilder.getInsnID (), 0 , **SuperClass);
1444
1447
1445
1448
unsigned Num = Dst->getNumChildren ();
1446
1449
for (unsigned I = 1 ; I != Num; I += 2 ) {
@@ -1451,10 +1454,10 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
1451
1454
return failedImport (" REG_SEQUENCE child is not a subreg index" );
1452
1455
1453
1456
const auto SrcRCDstRCPair =
1454
- (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
1457
+ (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
1455
1458
assert (SrcRCDstRCPair->second && " Couldn't find a matching subclass" );
1456
1459
M.insertAction <ConstrainOperandToRegClassAction>(
1457
- InsertPt, DstMIBuilder.getInsnID (), I, *SrcRCDstRCPair->second );
1460
+ InsertPt, DstMIBuilder.getInsnID (), I, *SrcRCDstRCPair->second );
1458
1461
}
1459
1462
1460
1463
return InsertPtOrError.get ();
@@ -1514,7 +1517,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
1514
1517
1515
1518
unsigned TempRegID = M.allocateTempRegID ();
1516
1519
InsertPt =
1517
- M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1520
+ M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTy, TempRegID);
1518
1521
DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID, true , nullptr , true );
1519
1522
}
1520
1523
@@ -1548,11 +1551,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1548
1551
return ExtractSrcTy.takeError ();
1549
1552
1550
1553
unsigned TempRegID = M.allocateTempRegID ();
1551
- InsertPt = M.insertAction <MakeTempRegisterAction>(
1552
- InsertPt, *ExtractSrcTy, TempRegID);
1554
+ InsertPt = M.insertAction <MakeTempRegisterAction>(InsertPt, *ExtractSrcTy,
1555
+ TempRegID);
1553
1556
1554
1557
auto InsertPtOrError = createAndImportSubInstructionRenderer (
1555
- ++InsertPt, M, ValChild, Src, TempRegID);
1558
+ ++InsertPt, M, ValChild, Src, TempRegID);
1556
1559
if (auto Error = InsertPtOrError.takeError ())
1557
1560
return std::move (Error);
1558
1561
@@ -1569,7 +1572,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1569
1572
CodeGenRegisterClass *RC = CGRegs.getRegClass (RCDef);
1570
1573
1571
1574
const auto SrcRCDstRCPair =
1572
- RC->getMatchingSubClassWithSubRegs (CGRegs, SubIdx);
1575
+ RC->getMatchingSubClassWithSubRegs (CGRegs, SubIdx);
1573
1576
if (SrcRCDstRCPair) {
1574
1577
assert (SrcRCDstRCPair->second && " Couldn't find a matching subclass" );
1575
1578
if (SrcRCDstRCPair->first != RC)
@@ -1670,8 +1673,8 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
1670
1673
1671
1674
const CGIOperandList::OperandInfo &DstIOperand = DstI->Operands [InstOpNo];
1672
1675
DagInit *DefaultOps = DstIOperand.Rec ->getValueAsDag (" DefaultOps" );
1673
- if (auto Error = importDefaultOperandRenderers (
1674
- InsertPt, M, DstMIBuilder, DefaultOps))
1676
+ if (auto Error = importDefaultOperandRenderers (InsertPt, M, DstMIBuilder,
1677
+ DefaultOps))
1675
1678
return std::move (Error);
1676
1679
++NumDefaultOps;
1677
1680
continue ;
@@ -1706,8 +1709,7 @@ Error GlobalISelEmitter::importDefaultOperandRenderers(
1706
1709
if (const DefInit *DefaultDagOperator =
1707
1710
dyn_cast<DefInit>(DefaultDagOp->getOperator ())) {
1708
1711
if (DefaultDagOperator->getDef ()->isSubClassOf (" ValueType" )) {
1709
- OpTyOrNone = MVTToLLT (getValueType (
1710
- DefaultDagOperator->getDef ()));
1712
+ OpTyOrNone = MVTToLLT (getValueType (DefaultDagOperator->getDef ()));
1711
1713
DefaultOp = DefaultDagOp->getArg (0 );
1712
1714
}
1713
1715
}
@@ -1720,10 +1722,10 @@ Error GlobalISelEmitter::importDefaultOperandRenderers(
1720
1722
M.insertAction <MakeTempRegisterAction>(InsertPt, *OpTyOrNone,
1721
1723
TempRegID);
1722
1724
InsertPt = M.insertAction <BuildMIAction>(
1723
- InsertPt, M.allocateOutputInsnID (),
1724
- &Target.getInstruction (RK.getDef (" IMPLICIT_DEF" )));
1725
- BuildMIAction &IDMIBuilder = * static_cast <BuildMIAction *>(
1726
- InsertPt->get ());
1725
+ InsertPt, M.allocateOutputInsnID (),
1726
+ &Target.getInstruction (RK.getDef (" IMPLICIT_DEF" )));
1727
+ BuildMIAction &IDMIBuilder =
1728
+ * static_cast <BuildMIAction *>( InsertPt->get ());
1727
1729
IDMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1728
1730
DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
1729
1731
} else {
@@ -2021,7 +2023,8 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
2021
2023
} else if (DstIName == " EXTRACT_SUBREG" ) {
2022
2024
auto InferredClass = inferRegClassFromPattern (Dst->getChild (0 ));
2023
2025
if (!InferredClass)
2024
- return failedImport (" Could not infer class for EXTRACT_SUBREG operand #0" );
2026
+ return failedImport (
2027
+ " Could not infer class for EXTRACT_SUBREG operand #0" );
2025
2028
2026
2029
// We can assume that a subregister is in the same bank as it's super
2027
2030
// register.
@@ -2103,7 +2106,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
2103
2106
auto SuperClass = inferRegClassFromPattern (Dst->getChild (0 ));
2104
2107
if (!SuperClass)
2105
2108
return failedImport (
2106
- " Cannot infer register class from EXTRACT_SUBREG operand #0" );
2109
+ " Cannot infer register class from EXTRACT_SUBREG operand #0" );
2107
2110
2108
2111
auto SubIdx = inferSubRegIndexForNode (Dst->getChild (1 ));
2109
2112
if (!SubIdx)
@@ -2116,17 +2119,18 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
2116
2119
// FIXME: This may introduce an extra copy if the chosen class doesn't
2117
2120
// actually contain the subregisters.
2118
2121
assert (Src->getExtTypes ().size () == 1 &&
2119
- " Expected Src of EXTRACT_SUBREG to have one result type" );
2122
+ " Expected Src of EXTRACT_SUBREG to have one result type" );
2120
2123
2121
2124
const auto SrcRCDstRCPair =
2122
- (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
2125
+ (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
2123
2126
if (!SrcRCDstRCPair) {
2124
2127
return failedImport (" subreg index is incompatible "
2125
2128
" with inferred reg class" );
2126
2129
}
2127
2130
2128
2131
assert (SrcRCDstRCPair->second && " Couldn't find a matching subclass" );
2129
- M.addAction <ConstrainOperandToRegClassAction>(0 , 0 , *SrcRCDstRCPair->second );
2132
+ M.addAction <ConstrainOperandToRegClassAction>(0 , 0 ,
2133
+ *SrcRCDstRCPair->second );
2130
2134
M.addAction <ConstrainOperandToRegClassAction>(0 , 1 , *SrcRCDstRCPair->first );
2131
2135
2132
2136
// We're done with this pattern! It's eligible for GISel emission; return
@@ -2194,7 +2198,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
2194
2198
return failedImport (" REG_SEQUENCE child is not a subreg index" );
2195
2199
2196
2200
const auto SrcRCDstRCPair =
2197
- (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
2201
+ (*SuperClass)->getMatchingSubClassWithSubRegs (CGRegs, *SubIdx);
2198
2202
2199
2203
M.addAction <ConstrainOperandToRegClassAction>(0 , I,
2200
2204
*SrcRCDstRCPair->second );
@@ -2241,8 +2245,8 @@ void GlobalISelEmitter::emitCxxPredicateFns(
2241
2245
}
2242
2246
2243
2247
OS << " bool " << Target.getName () << " InstructionSelector::test" << ArgName
2244
- << " Predicate_" << TypeIdentifier << " (unsigned PredicateID, " << ArgType << " "
2245
- << ArgName << AdditionalArgs <<" ) const {\n "
2248
+ << " Predicate_" << TypeIdentifier << " (unsigned PredicateID, " << ArgType
2249
+ << " " << ArgName << AdditionalArgs << " ) const {\n "
2246
2250
<< AdditionalDeclarations;
2247
2251
if (!AdditionalDeclarations.empty ())
2248
2252
OS << " \n " ;
@@ -2346,8 +2350,10 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
2346
2350
// Track the GINodeEquiv definitions.
2347
2351
gatherNodeEquivs ();
2348
2352
2349
- emitSourceFileHeader ((" Global Instruction Selector for the " +
2350
- Target.getName () + " target" ).str (), OS);
2353
+ emitSourceFileHeader (
2354
+ (" Global Instruction Selector for the " + Target.getName () + " target" )
2355
+ .str (),
2356
+ OS);
2351
2357
std::vector<RuleMatcher> Rules;
2352
2358
// Look through the SelectionDAG patterns we found, possibly emitting some.
2353
2359
for (const PatternToMatch &Pat : CGP.ptms ()) {
@@ -2465,15 +2471,17 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
2465
2471
});
2466
2472
2467
2473
SubtargetFeatureInfo::emitComputeAvailableFeatures (
2468
- Target.getName (), " InstructionSelector" , " computeAvailableModuleFeatures" ,
2474
+ Target.getName (), " InstructionSelector" , " computeAvailableModuleFeatures" ,
2469
2475
ModuleFeatures, OS);
2470
2476
2471
-
2472
- OS << " void " << Target.getName () << " InstructionSelector"
2473
- " ::setupGeneratedPerFunctionState(MachineFunction &MF) {\n "
2474
- " AvailableFunctionFeatures = computeAvailableFunctionFeatures("
2475
- " (const " << Target.getName () << " Subtarget *)&MF.getSubtarget(), &MF);\n "
2476
- " }\n " ;
2477
+ OS << " void " << Target.getName ()
2478
+ << " InstructionSelector"
2479
+ " ::setupGeneratedPerFunctionState(MachineFunction &MF) {\n "
2480
+ " AvailableFunctionFeatures = computeAvailableFunctionFeatures("
2481
+ " (const "
2482
+ << Target.getName ()
2483
+ << " Subtarget *)&MF.getSubtarget(), &MF);\n "
2484
+ " }\n " ;
2477
2485
2478
2486
SubtargetFeatureInfo::emitComputeAvailableFeatures (
2479
2487
Target.getName (), " InstructionSelector" ,
0 commit comments