@@ -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,
@@ -1375,7 +1376,8 @@ Expected<BuildMIAction &> GlobalISelEmitter::createAndImportInstructionRenderer(
13751376 CopyToPhysRegMIBuilder.addRenderer <CopyPhysRegRenderer>(PhysInput.first );
13761377 }
13771378
1378- if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst)
1379+ if (auto Error = importExplicitDefRenderers (InsertPt, M, DstMIBuilder, Dst,
1380+ /* IsRoot=*/ true )
13791381 .takeError ())
13801382 return std::move (Error);
13811383
@@ -1404,8 +1406,8 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer(
14041406 DstMIBuilder.addRenderer <TempRegRenderer>(TempRegID, true );
14051407
14061408 // Handle additional (ignored) results.
1407- InsertPtOrError = importExplicitDefRenderers (std::prev (*InsertPtOrError), M,
1408- DstMIBuilder, Dst, /* Start =*/ 1 );
1409+ InsertPtOrError = importExplicitDefRenderers (
1410+ std::prev (*InsertPtOrError), M, DstMIBuilder, Dst, /* IsRoot =*/ false );
14091411 if (auto Error = InsertPtOrError.takeError ())
14101412 return std::move (Error);
14111413
@@ -1446,16 +1448,16 @@ GlobalISelEmitter::createInstructionRenderer(action_iterator InsertPt,
14461448
14471449Expected<action_iterator> GlobalISelEmitter::importExplicitDefRenderers (
14481450 action_iterator InsertPt, RuleMatcher &M, BuildMIAction &DstMIBuilder,
1449- const TreePatternNode &Dst, unsigned Start ) const {
1451+ const TreePatternNode &Dst, bool IsRoot ) const {
14501452 const CodeGenInstruction *DstI = DstMIBuilder.getCGI ();
14511453
14521454 // Process explicit defs. The caller may have already handled the first def.
1453- for (unsigned I = Start , E = DstI->Operands .NumDefs ; I != E; ++I) {
1455+ for (unsigned I = IsRoot ? 0 : 1 , E = DstI->Operands .NumDefs ; I != E; ++I) {
14541456 const CGIOperandList::OperandInfo &OpInfo = DstI->Operands [I];
14551457 std::string OpName = getMangledRootDefName (OpInfo.Name );
14561458
14571459 // If the def is used in the source DAG, forward it.
1458- if (M.hasOperand (OpName)) {
1460+ if (IsRoot && M.hasOperand (OpName)) {
14591461 // CopyRenderer saves a StringRef, so cannot pass OpName itself -
14601462 // let's use a string with an appropriate lifetime.
14611463 StringRef PermanentRef = M.getOperandMatcher (OpName).getSymbolicName ();
0 commit comments