diff --git a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h --- a/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h +++ b/llvm/include/llvm/CodeGen/GlobalISel/LegalizationArtifactCombiner.h @@ -396,7 +396,15 @@ for (unsigned Idx = 0; Idx < NumDefs; ++Idx) { Register NewDef = MergeI->getOperand(Idx + 1).getReg(); - MRI.replaceRegWith(MI.getOperand(Idx).getReg(), NewDef); + Register OldReg = MI.getOperand(Idx).getReg(); + auto *OldRC = MRI.getRegClassOrNull(OldReg); + auto *NewRC = MRI.getRegClassOrNull(NewDef); + if ((!OldRC && !NewRC) || (OldRC && NewRC && OldRC == NewRC)) + MRI.replaceRegWith(OldReg, NewDef); + else { + Builder.setInstr(MI); + Builder.buildInstr(TargetOpcode::COPY, {OldReg}, {NewDef}); + } UpdatedDefs.push_back(NewDef); } }