Skip to content

Commit 106429b

Browse files
committed
GlobalISel: Add another overload of buildUnmerge
It's annoying to have to create an array of the result type, particularly when you don't care about the size of the value. llvm-svn: 357763
1 parent 4ed6cca commit 106429b

File tree

3 files changed

+32
-0
lines changed

3 files changed

+32
-0
lines changed

llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,9 @@ class MachineIRBuilder {
731731
MachineInstrBuilder buildUnmerge(ArrayRef<LLT> Res, const SrcOp &Op);
732732
MachineInstrBuilder buildUnmerge(ArrayRef<unsigned> Res, const SrcOp &Op);
733733

734+
/// Build and insert an unmerge of \p Res sized pieces to cover \p Op
735+
MachineInstrBuilder buildUnmerge(LLT Res, const SrcOp &Op);
736+
734737
/// Build and insert \p Res = G_BUILD_VECTOR \p Op0, ...
735738
///
736739
/// G_BUILD_VECTOR creates a vector value from multiple scalar registers.

llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,15 @@ MachineInstrBuilder MachineIRBuilder::buildUnmerge(ArrayRef<LLT> Res,
547547
return buildInstr(TargetOpcode::G_UNMERGE_VALUES, TmpVec, Op);
548548
}
549549

550+
MachineInstrBuilder MachineIRBuilder::buildUnmerge(LLT Res,
551+
const SrcOp &Op) {
552+
unsigned NumReg = Op.getLLTTy(*getMRI()).getSizeInBits() / Res.getSizeInBits();
553+
SmallVector<unsigned, 8> TmpVec;
554+
for (unsigned I = 0; I != NumReg; ++I)
555+
TmpVec.push_back(getMRI()->createGenericVirtualRegister(Res));
556+
return buildUnmerge(TmpVec, Op);
557+
}
558+
550559
MachineInstrBuilder MachineIRBuilder::buildUnmerge(ArrayRef<unsigned> Res,
551560
const SrcOp &Op) {
552561
// Unfortunately to convert from ArrayRef<unsigned> to ArrayRef<DstOp>,

llvm/unittests/CodeGen/GlobalISel/MachineIRBuilderTest.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,3 +90,23 @@ TEST_F(GISelMITest, DstOpSrcOp) {
9090

9191
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
9292
}
93+
94+
TEST_F(GISelMITest, BuildUnmerge) {
95+
if (!TM)
96+
return;
97+
98+
SmallVector<unsigned, 4> Copies;
99+
collectCopies(Copies, MF);
100+
B.buildUnmerge(LLT::scalar(32), Copies[0]);
101+
B.buildUnmerge(LLT::scalar(16), Copies[1]);
102+
103+
auto CheckStr = R"(
104+
; CHECK: [[COPY0:%[0-9]+]]:_(s64) = COPY $x0
105+
; CHECK: [[COPY1:%[0-9]+]]:_(s64) = COPY $x1
106+
; CHECK: [[UNMERGE32_0:%[0-9]+]]:_(s32), [[UNMERGE32_1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[COPY0]]
107+
; CHECK: [[UNMERGE16_0:%[0-9]+]]:_(s16), [[UNMERGE16_1:%[0-9]+]]:_(s16), [[UNMERGE16_2:%[0-9]+]]:_(s16), [[UNMERGE16_3:%[0-9]+]]:_(s16) = G_UNMERGE_VALUES [[COPY1]]
108+
109+
)";
110+
111+
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
112+
}

0 commit comments

Comments
 (0)