Skip to content

Commit

Permalink
[GlobalISel] Add buildMerge with SrcOp initializer list
Browse files Browse the repository at this point in the history
Allows more flexible use of buildMerge in places where
use operands are available as SrcOp since it does not
require explicit conversion to Register.
Simplify code with new buildMerge.

Differential Revision: https://reviews.llvm.org/D74223
  • Loading branch information
Petar Avramovic authored and Petar Avramovic committed Feb 7, 2020
1 parent e2d7c5b commit 7df5fc9
Show file tree
Hide file tree
Showing 6 changed files with 17 additions and 9 deletions.
2 changes: 2 additions & 0 deletions llvm/include/llvm/CodeGen/GlobalISel/MachineIRBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -788,6 +788,8 @@ class MachineIRBuilder {
///
/// \return a MachineInstrBuilder for the newly created instruction.
MachineInstrBuilder buildMerge(const DstOp &Res, ArrayRef<Register> Ops);
MachineInstrBuilder buildMerge(const DstOp &Res,
std::initializer_list<SrcOp> Ops);

/// Build and insert \p Res0, ... = G_UNMERGE_VALUES \p Op
///
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3393,7 +3393,7 @@ LegalizerHelper::narrowScalarShiftByConstant(MachineInstr &MI, const APInt &Amt,
}
}

MIRBuilder.buildMerge(MI.getOperand(0), {Lo.getReg(), Hi.getReg()});
MIRBuilder.buildMerge(MI.getOperand(0), {Lo, Hi});
MI.eraseFromParent();

return Legalized;
Expand Down Expand Up @@ -3994,7 +3994,7 @@ LegalizerHelper::narrowScalarCTLZ(MachineInstr &MI, unsigned TypeIdx,
auto HiCTLZ = B.buildCTLZ_ZERO_UNDEF(NarrowTy, UnmergeSrc.getReg(1));
auto LoOut = B.buildSelect(NarrowTy, HiIsZero, HiIsZeroCTLZ, HiCTLZ);

B.buildMerge(MI.getOperand(0), {LoOut.getReg(0), C_0.getReg(0)});
B.buildMerge(MI.getOperand(0), {LoOut, C_0});

MI.eraseFromParent();
return Legalized;
Expand Down Expand Up @@ -4025,7 +4025,7 @@ LegalizerHelper::narrowScalarCTTZ(MachineInstr &MI, unsigned TypeIdx,
auto LoCTTZ = B.buildCTTZ_ZERO_UNDEF(NarrowTy, UnmergeSrc.getReg(0));
auto LoOut = B.buildSelect(NarrowTy, LoIsZero, LoIsZeroCTTZ, LoCTTZ);

B.buildMerge(MI.getOperand(0), {LoOut.getReg(0), C_0.getReg(0)});
B.buildMerge(MI.getOperand(0), {LoOut, C_0});

MI.eraseFromParent();
return Legalized;
Expand Down
7 changes: 7 additions & 0 deletions llvm/lib/CodeGen/GlobalISel/MachineIRBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -579,6 +579,13 @@ MachineInstrBuilder MachineIRBuilder::buildMerge(const DstOp &Res,
return buildInstr(TargetOpcode::G_MERGE_VALUES, Res, TmpVec);
}

MachineInstrBuilder
MachineIRBuilder::buildMerge(const DstOp &Res,
std::initializer_list<SrcOp> Ops) {
assert(Ops.size() > 1);
return buildInstr(TargetOpcode::G_MERGE_VALUES, Res, Ops);
}

MachineInstrBuilder MachineIRBuilder::buildUnmerge(ArrayRef<LLT> Res,
const SrcOp &Op) {
// Unfortunately to convert from ArrayRef<LLT> to ArrayRef<DstOp>,
Expand Down
3 changes: 1 addition & 2 deletions llvm/lib/Target/AArch64/AArch64CallLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,8 +316,7 @@ bool AArch64CallLowering::lowerReturn(MachineIRBuilder &MIRBuilder,
}
auto Undef = MIRBuilder.buildUndef({OldLLT});
CurVReg =
MIRBuilder.buildMerge({NewLLT}, {CurVReg, Undef.getReg(0)})
.getReg(0);
MIRBuilder.buildMerge({NewLLT}, {CurVReg, Undef}).getReg(0);
} else {
// Just do a vector extend.
CurVReg = MIRBuilder.buildInstr(ExtendOp, {NewLLT}, {CurVReg})
Expand Down
6 changes: 3 additions & 3 deletions llvm/lib/Target/AMDGPU/AMDGPULegalizerInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1398,7 +1398,7 @@ bool AMDGPULegalizerInfo::legalizeAddrSpaceCast(
// extra ptrtoint would be kind of pointless.
auto HighAddr = B.buildConstant(
LLT::pointer(AMDGPUAS::CONSTANT_ADDRESS_32BIT, 32), AddrHiVal);
B.buildMerge(Dst, {Src, HighAddr.getReg(0)});
B.buildMerge(Dst, {Src, HighAddr});
MI.eraseFromParent();
return true;
}
Expand Down Expand Up @@ -1555,7 +1555,7 @@ bool AMDGPULegalizerInfo::legalizeIntrinsicTrunc(
const auto Zero32 = B.buildConstant(S32, 0);

// Extend back to 64-bits.
auto SignBit64 = B.buildMerge(S64, {Zero32.getReg(0), SignBit.getReg(0)});
auto SignBit64 = B.buildMerge(S64, {Zero32, SignBit});

auto Shr = B.buildAShr(S64, FractMask, Exp);
auto Not = B.buildNot(S64, Shr);
Expand Down Expand Up @@ -1632,7 +1632,7 @@ bool AMDGPULegalizerInfo::legalizeFPTOI(
B.buildFPTOUI(S32, FloorMul);
auto Lo = B.buildFPTOUI(S32, Fma);

B.buildMerge(Dst, { Lo.getReg(0), Hi.getReg(0) });
B.buildMerge(Dst, { Lo, Hi });
MI.eraseFromParent();

return true;
Expand Down
2 changes: 1 addition & 1 deletion llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1037,7 +1037,7 @@ TEST_F(GISelMITest, WidenScalarMergeValuesPointer) {
auto Lo = B.buildTrunc(S32, Copies[0]);
auto Hi = B.buildTrunc(S32, Copies[1]);

auto Merge = B.buildMerge(P0, {Lo.getReg(0), Hi.getReg(0)});
auto Merge = B.buildMerge(P0, {Lo, Hi});

EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized,
Helper.widenScalar(*Merge, 1, S64));
Expand Down

0 comments on commit 7df5fc9

Please sign in to comment.