@@ -404,9 +404,10 @@ class GlobalISelEmitter final : public GlobalISelMatchTableExecutorEmitter {
404404 createInstructionRenderer (action_iterator InsertPt, RuleMatcher &M,
405405 const TreePatternNode &Dst) const ;
406406
407- Expected<action_iterator> importExplicitDefRenderers (
408- action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
409- const TreePatternNode &Dst, unsigned Start = 0 ) const ;
407+ Expected<action_iterator>
408+ importExplicitDefRenderers (action_iterator InsertPt, RuleMatcher &M,
409+ BuildMIAction &DstMIBuilder,
410+ const TreePatternNode &Dst, bool IsRoot) const ;
410411
411412 Expected<action_iterator>
412413 importExplicitUseRenderers (action_iterator InsertPt, RuleMatcher &M,
@@ -1369,7 +1370,8 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
13691370 CopyToPhysRegMIBuilder.addRenderer <CopyPhysRegRenderer>(PhysInput.first );
13701371 }
13711372
1372- if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst)
1373+ if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst,
1374+ /* IsRoot=*/ true )
13731375 .takeError ())
13741376 return std::move (Error);
13751377
@@ -1398,8 +1400,8 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
13981400 DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID, true );
13991401
14001402 // Handle additional (ignored) results.
1401- InsertPtOrError = importExplicitDefRenderers (std::prev (*InsertPtOrError), M,
1402- DstMIBuilder, Dst, /* Start =*/ 1 );
1403+ InsertPtOrError = importExplicitDefRenderers (
1404+ std::prev (*InsertPtOrError), M, DstMIBuilder, Dst, /* IsRoot =*/ false );
14031405 if (auto Error = InsertPtOrError.takeError ())
14041406 return std::move (Error);
14051407
@@ -1440,16 +1442,16 @@ GlobalISelEmitter::createInstructionRenderer(action_iterator InsertPt,
14401442
14411443Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers (
14421444 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1443- const TreePatternNode &Dst, unsigned Start ) const {
1445+ const TreePatternNode &Dst, bool IsRoot ) const {
14441446 const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
14451447
14461448 // Process explicit defs. The caller may have already handled the first def.
1447- for (unsigned I = Start , E = DstI->Operands .NumDefs ; I != E; ++I) {
1449+ for (unsigned I = IsRoot ? 0 : 1 , E = DstI->Operands .NumDefs ; I != E; ++I) {
14481450 const CGIOperandList::OperandInfo &OpInfo = DstI->Operands [I];
14491451 std::string OpName = getMangledRootDefName (OpInfo.Name );
14501452
14511453 // If the def is used in the source DAG, forward it.
1452- if (M.hasOperand (OpName)) {
1454+ if (IsRoot && M.hasOperand (OpName)) {
14531455 // CopyRenderer saves a StringRef, so cannot pass OpName itself -
14541456 // let's use a string with an appropriate lifetime.
14551457 StringRef PermanentRef = M.getOperandMatcher (OpName).getSymbolicName ();
0 commit comments