Index: include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h =================================================================== --- include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h +++ include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h @@ -731,6 +731,9 @@ MachineInstrBuilder buildUnmerge(ArrayRef Res, const SrcOp &Op); MachineInstrBuilder buildUnmerge(ArrayRef Res, const SrcOp &Op); + /// Build and insert an unmerge of \p Res sized pieces to cover \p Op + MachineInstrBuilder buildUnmerge(LLT Res, const SrcOp &Op); + /// Build and insert \p Res = G_BUILD_VECTOR \p Op0, ... /// /// G_BUILD_VECTOR creates a vector value from multiple scalar registers. Index: lib/CodeGen/GlobalISel/MachineIRBuilder.cpp =================================================================== --- lib/CodeGen/GlobalISel/MachineIRBuilder.cpp +++ lib/CodeGen/GlobalISel/MachineIRBuilder.cpp @@ -547,6 +547,15 @@ return buildInstr(TargetOpcode::G_UNMERGE_VALUES, TmpVec, Op); } +MachineInstrBuilder MachineIRBuilder::buildUnmerge(LLT Res, + const SrcOp &Op) { + unsigned NumReg = Op.getLLTTy(*getMRI()).getSizeInBits() / Res.getSizeInBits(); + SmallVector TmpVec; + for (unsigned I = 0; I != NumReg; ++I) + TmpVec.push_back(getMRI()->createGenericVirtualRegister(Res)); + return buildUnmerge(TmpVec, Op); +} + MachineInstrBuilder MachineIRBuilder::buildUnmerge(ArrayRef Res, const SrcOp &Op) { // Unfortunately to convert from ArrayRef to ArrayRef,