@@ -393,28 +393,30 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
393393 bool OperandIsAPointer, bool OperandIsImmArg,
394394 unsigned OpIdx, unsigned &TempOpIdx);
395395
396- Expected<BuildMIAction &> createAndImportInstructionRenderer (
397- RuleMatcher &M, InstructionMatcher &InsnMatcher,
398- const TreePatternNode &Src, const TreePatternNode &Dst);
396+ Expected<BuildMIAction &>
397+ createAndImportInstructionRenderer (RuleMatcher &M,
398+ InstructionMatcher &InsnMatcher,
399+ const TreePatternNode &Dst);
399400 Expected<action_iterator> createAndImportSubInstructionRenderer (
400401 action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
401- const TreePatternNode &Src, unsigned TempReg);
402+ unsigned TempReg);
402403 Expected<action_iterator>
403404 createInstructionRenderer (action_iterator InsertPt, RuleMatcher &M,
404405 const TreePatternNode &Dst);
405406
406407 Expected<action_iterator>
407408 importExplicitDefRenderers (action_iterator InsertPt, RuleMatcher &M,
408409 BuildMIAction &DstMIBuilder,
409- const TreePatternNode &Src,
410410 const TreePatternNode &Dst, unsigned Start = 0 );
411411
412- Expected<action_iterator> importExplicitUseRenderers (
413- action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
414- const llvm::TreePatternNode &Dst, const TreePatternNode &Src);
415- Expected<action_iterator> importExplicitUseRenderer (
416- action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
417- const TreePatternNode &DstChild, const TreePatternNode &Src);
412+ Expected<action_iterator>
413+ importExplicitUseRenderers (action_iterator InsertPt, RuleMatcher &M,
414+ BuildMIAction &DstMIBuilder,
415+ const TreePatternNode &Dst);
416+ Expected<action_iterator>
417+ importExplicitUseRenderer (action_iterator InsertPt, RuleMatcher &Rule,
418+ BuildMIAction &DstMIBuilder,
419+ const TreePatternNode &Dst);
418420 Error importDefaultOperandRenderers (action_iterator InsertPt, RuleMatcher &M,
419421 BuildMIAction &DstMIBuilder,
420422 const DAGDefaultOperand &DefaultOp) const ;
@@ -1196,23 +1198,22 @@ Error GlobalISelEmitter::importChildMatcher(
11961198
11971199Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer (
11981200 action_iterator InsertPt, RuleMatcher &Rule, BuildMIAction &DstMIBuilder,
1199- const TreePatternNode &DstChild, const TreePatternNode &Src ) {
1201+ const TreePatternNode &Dst ) {
12001202
1201- const auto &SubOperand = Rule.getComplexSubOperand (DstChild .getName ());
1203+ const auto &SubOperand = Rule.getComplexSubOperand (Dst .getName ());
12021204 if (SubOperand) {
12031205 DstMIBuilder.addRenderer <RenderComplexPatternOperand>(
1204- *std::get<0 >(*SubOperand), DstChild .getName (), std::get<1 >(*SubOperand),
1206+ *std::get<0 >(*SubOperand), Dst .getName (), std::get<1 >(*SubOperand),
12051207 std::get<2 >(*SubOperand));
12061208 return InsertPt;
12071209 }
12081210
1209- if (!DstChild .isLeaf ()) {
1210- if (DstChild .getOperator ()->isSubClassOf (" SDNodeXForm" )) {
1211- auto &Child = DstChild .getChild (0 );
1212- auto I = SDNodeXFormEquivs.find (DstChild .getOperator ());
1211+ if (!Dst .isLeaf ()) {
1212+ if (Dst .getOperator ()->isSubClassOf (" SDNodeXForm" )) {
1213+ auto &Child = Dst .getChild (0 );
1214+ auto I = SDNodeXFormEquivs.find (Dst .getOperator ());
12131215 if (I != SDNodeXFormEquivs.end ()) {
1214- const Record *XFormOpc =
1215- DstChild.getOperator ()->getValueAsDef (" Opcode" );
1216+ const Record *XFormOpc = Dst.getOperator ()->getValueAsDef (" Opcode" );
12161217 if (XFormOpc->getName () == " timm" ) {
12171218 // If this is a TargetConstant, there won't be a corresponding
12181219 // instruction to transform. Instead, this will refer directly to an
@@ -1231,10 +1232,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12311232
12321233 // We accept 'bb' here. It's an operator because BasicBlockSDNode isn't
12331234 // inline, but in MI it's just another operand.
1234- if (DstChild .getOperator ()->isSubClassOf (" SDNode" )) {
1235- auto &ChildSDNI = CGP.getSDNodeInfo (DstChild .getOperator ());
1235+ if (Dst .getOperator ()->isSubClassOf (" SDNode" )) {
1236+ auto &ChildSDNI = CGP.getSDNodeInfo (Dst .getOperator ());
12361237 if (ChildSDNI.getSDClassName () == " BasicBlockSDNode" ) {
1237- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1238+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
12381239 return InsertPt;
12391240 }
12401241 }
@@ -1243,26 +1244,25 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12431244 // rendered as operands.
12441245 // FIXME: The target should be able to choose sign-extended when appropriate
12451246 // (e.g. on Mips).
1246- if (DstChild .getOperator ()->getName () == " timm" ) {
1247- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1247+ if (Dst .getOperator ()->getName () == " timm" ) {
1248+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
12481249 return InsertPt;
12491250 }
1250- if (DstChild .getOperator ()->getName () == " tframeindex" ) {
1251- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1251+ if (Dst .getOperator ()->getName () == " tframeindex" ) {
1252+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
12521253 return InsertPt;
12531254 }
1254- if (DstChild .getOperator ()->getName () == " imm" ) {
1255- DstMIBuilder.addRenderer <CopyConstantAsImmRenderer>(DstChild .getName ());
1255+ if (Dst .getOperator ()->getName () == " imm" ) {
1256+ DstMIBuilder.addRenderer <CopyConstantAsImmRenderer>(Dst .getName ());
12561257 return InsertPt;
12571258 }
1258- if (DstChild.getOperator ()->getName () == " fpimm" ) {
1259- DstMIBuilder.addRenderer <CopyFConstantAsFPImmRenderer>(
1260- DstChild.getName ());
1259+ if (Dst.getOperator ()->getName () == " fpimm" ) {
1260+ DstMIBuilder.addRenderer <CopyFConstantAsFPImmRenderer>(Dst.getName ());
12611261 return InsertPt;
12621262 }
12631263
1264- if (DstChild .getOperator ()->isSubClassOf (" Instruction" )) {
1265- auto OpTy = getInstResultType (DstChild , Target);
1264+ if (Dst .getOperator ()->isSubClassOf (" Instruction" )) {
1265+ auto OpTy = getInstResultType (Dst , Target);
12661266 if (!OpTy)
12671267 return OpTy.takeError ();
12681268
@@ -1272,29 +1272,28 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12721272 DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID);
12731273
12741274 auto InsertPtOrError = createAndImportSubInstructionRenderer (
1275- ++InsertPt, Rule, DstChild, Src , TempRegID);
1275+ ++InsertPt, Rule, Dst , TempRegID);
12761276 if (auto Error = InsertPtOrError.takeError ())
12771277 return std::move (Error);
12781278 return InsertPtOrError.get ();
12791279 }
12801280
12811281 return failedImport (" Dst pattern child isn't a leaf node or an MBB" +
1282- llvm::to_string (DstChild ));
1282+ llvm::to_string (Dst ));
12831283 }
12841284
12851285 // It could be a specific immediate in which case we should just check for
12861286 // that immediate.
1287- if (const IntInit *ChildIntInit =
1288- dyn_cast<IntInit>(DstChild.getLeafValue ())) {
1287+ if (const IntInit *ChildIntInit = dyn_cast<IntInit>(Dst.getLeafValue ())) {
12891288 DstMIBuilder.addRenderer <ImmRenderer>(ChildIntInit->getValue ());
12901289 return InsertPt;
12911290 }
12921291
12931292 // Otherwise, we're looking for a bog-standard RegisterClass operand.
1294- if (auto *ChildDefInit = dyn_cast<DefInit>(DstChild .getLeafValue ())) {
1293+ if (auto *ChildDefInit = dyn_cast<DefInit>(Dst .getLeafValue ())) {
12951294 auto *ChildRec = ChildDefInit->getDef ();
12961295
1297- ArrayRef<TypeSetByHwMode> ChildTypes = DstChild .getExtTypes ();
1296+ ArrayRef<TypeSetByHwMode> ChildTypes = Dst .getExtTypes ();
12981297 if (ChildTypes.size () != 1 )
12991298 return failedImport (" Dst pattern child has multiple results" );
13001299
@@ -1315,11 +1314,11 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13151314 if (ChildRec->isSubClassOf (" RegisterOperand" ) &&
13161315 !ChildRec->isValueUnset (" GIZeroRegister" )) {
13171316 DstMIBuilder.addRenderer <CopyOrAddZeroRegRenderer>(
1318- DstChild .getName (), ChildRec->getValueAsDef (" GIZeroRegister" ));
1317+ Dst .getName (), ChildRec->getValueAsDef (" GIZeroRegister" ));
13191318 return InsertPt;
13201319 }
13211320
1322- DstMIBuilder.addRenderer <CopyRenderer>(DstChild .getName ());
1321+ DstMIBuilder.addRenderer <CopyRenderer>(Dst .getName ());
13231322 return InsertPt;
13241323 }
13251324
@@ -1335,9 +1334,9 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13351334 return failedImport (
13361335 " SelectionDAG ComplexPattern not mapped to GlobalISel" );
13371336
1338- const OperandMatcher &OM = Rule.getOperandMatcher (DstChild .getName ());
1337+ const OperandMatcher &OM = Rule.getOperandMatcher (Dst .getName ());
13391338 DstMIBuilder.addRenderer <RenderComplexPatternOperand>(
1340- *ComplexPattern->second , DstChild .getName (),
1339+ *ComplexPattern->second , Dst .getName (),
13411340 OM.getAllocatedTemporariesBaseID ());
13421341 return InsertPt;
13431342 }
@@ -1348,16 +1347,19 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
13481347
13491348 // Handle the case where the MVT/register class is omitted in the dest pattern
13501349 // but MVT exists in the source pattern.
1351- if (isa<UnsetInit>(DstChild.getLeafValue ()) &&
1352- Rule.hasOperand (DstChild.getName ())) {
1353- DstMIBuilder.addRenderer <CopyRenderer>(DstChild.getName ());
1350+ if (isa<UnsetInit>(Dst.getLeafValue ()) && Rule.hasOperand (Dst.getName ())) {
1351+ DstMIBuilder.addRenderer <CopyRenderer>(Dst.getName ());
13541352 return InsertPt;
13551353 }
13561354 return failedImport (" Dst pattern child is an unsupported kind" );
13571355}
13581356
1357+ // / Generates code that builds the resulting instruction(s) from the destination
1358+ // / DAG. Note that to do this we do not and should not need the source DAG.
1359+ // / We do need to know whether a generated instruction defines a result of the
1360+ // / source DAG; this information is available via RuleMatcher::hasOperand.
13591361Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer (
1360- RuleMatcher &M, InstructionMatcher &InsnMatcher, const TreePatternNode &Src,
1362+ RuleMatcher &M, InstructionMatcher &InsnMatcher,
13611363 const TreePatternNode &Dst) {
13621364 auto InsertPtOrError = createInstructionRenderer (M.actions_end (), M, Dst);
13631365 if (auto Error = InsertPtOrError.takeError ())
@@ -1377,23 +1379,21 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
13771379 CopyToPhysRegMIBuilder.addRenderer <CopyPhysRegRenderer>(PhysInput.first );
13781380 }
13791381
1380- if (auto Error =
1381- importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Src, Dst)
1382- .takeError ())
1382+ if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst)
1383+ .takeError ())
13831384 return std::move (Error);
13841385
1385- if (auto Error =
1386- importExplicitUseRenderers (InsertPt, M, DstMIBuilder, Dst, Src)
1387- .takeError ())
1386+ if (auto Error = importExplicitUseRenderers (InsertPt, M, DstMIBuilder, Dst)
1387+ .takeError ())
13881388 return std::move (Error);
13891389
13901390 return DstMIBuilder;
13911391}
13921392
13931393Expected<action_iterator>
13941394GlobalISelEmitter::createAndImportSubInstructionRenderer (
1395- const action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396- const TreePatternNode &Src, unsigned TempRegID) {
1395+ action_iterator InsertPt, RuleMatcher &M, const TreePatternNode &Dst,
1396+ unsigned TempRegID) {
13971397 auto InsertPtOrError = createInstructionRenderer (InsertPt, M, Dst);
13981398
13991399 // TODO: Assert there's exactly one result.
@@ -1408,13 +1408,13 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
14081408 DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID, true );
14091409
14101410 // Handle additional (ignored) results.
1411- InsertPtOrError = importExplicitDefRenderers (
1412- std::prev (*InsertPtOrError), M, DstMIBuilder, Src , Dst, /* Start=*/ 1 );
1411+ InsertPtOrError = importExplicitDefRenderers (std::prev (*InsertPtOrError), M,
1412+ DstMIBuilder , Dst, /* Start=*/ 1 );
14131413 if (auto Error = InsertPtOrError.takeError ())
14141414 return std::move (Error);
14151415
1416- InsertPtOrError = importExplicitUseRenderers (InsertPtOrError. get (), M,
1417- DstMIBuilder, Dst, Src );
1416+ InsertPtOrError =
1417+ importExplicitUseRenderers (InsertPtOrError. get (), M, DstMIBuilder, Dst);
14181418 if (auto Error = InsertPtOrError.takeError ())
14191419 return std::move (Error);
14201420
@@ -1448,7 +1448,7 @@ Expected<action_iterator> GlobalISelEmitter::createInstructionRenderer(
14481448
14491449Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers (
14501450 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1451- const TreePatternNode &Src, const TreePatternNode & Dst, unsigned Start) {
1451+ const TreePatternNode &Dst, unsigned Start) {
14521452 const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
14531453
14541454 // Some instructions have multiple defs, but are missing a type entry
@@ -1497,7 +1497,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers(
14971497
14981498Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers (
14991499 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1500- const llvm:: TreePatternNode &Dst, const llvm::TreePatternNode &Src ) {
1500+ const TreePatternNode &Dst) {
15011501 const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
15021502 CodeGenInstruction *OrigDstI = &Target.getInstruction (Dst.getOperator ());
15031503
@@ -1527,7 +1527,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
15271527 TempRegID);
15281528
15291529 auto InsertPtOrError = createAndImportSubInstructionRenderer (
1530- ++InsertPt, M, ValChild, Src, TempRegID);
1530+ ++InsertPt, M, ValChild, TempRegID);
15311531 if (auto Error = InsertPtOrError.takeError ())
15321532 return std::move (Error);
15331533
@@ -1585,7 +1585,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
15851585 CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx (SubRegInit->getDef ());
15861586
15871587 auto InsertPtOrError =
1588- importExplicitUseRenderer (InsertPt, M, DstMIBuilder, ValChild, Src );
1588+ importExplicitUseRenderer (InsertPt, M, DstMIBuilder, ValChild);
15891589 if (auto Error = InsertPtOrError.takeError ())
15901590 return std::move (Error);
15911591 InsertPt = InsertPtOrError.get ();
@@ -1654,7 +1654,7 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderers(
16541654 }
16551655
16561656 auto InsertPtOrError = importExplicitUseRenderer (InsertPt, M, DstMIBuilder,
1657- Dst.getChild (Child), Src );
1657+ Dst.getChild (Child));
16581658 if (auto Error = InsertPtOrError.takeError ())
16591659 return std::move (Error);
16601660 InsertPt = InsertPtOrError.get ();
@@ -2135,7 +2135,7 @@ Expected<RuleMatcher> GlobalISelEmitter::runOnPattern(const PatternToMatch &P) {
21352135 }
21362136
21372137 auto DstMIBuilderOrError =
2138- createAndImportInstructionRenderer (M, InsnMatcher, Src, Dst);
2138+ createAndImportInstructionRenderer (M, InsnMatcher, Dst);
21392139 if (auto Error = DstMIBuilderOrError.takeError ())
21402140 return std::move (Error);
21412141 BuildMIAction &DstMIBuilder = DstMIBuilderOrError.get ();
0 commit comments