Skip to content

Commit bd791b5

Browse files
committed
GlobalISel: widenScalar for G_BUILD_VECTOR
llvm-svn: 365320
1 parent 214f67e commit bd791b5

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -1398,6 +1398,25 @@ LegalizerHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, LLT WideTy) {
13981398
widenScalarDst(MI, WideTy, 0);
13991399
Observer.changedInstr(MI);
14001400
return Legalized;
1401+
case TargetOpcode::G_BUILD_VECTOR: {
1402+
Observer.changingInstr(MI);
1403+
1404+
const LLT WideEltTy = TypeIdx == 1 ? WideTy : WideTy.getElementType();
1405+
for (int I = 1, E = MI.getNumOperands(); I != E; ++I)
1406+
widenScalarSrc(MI, WideEltTy, I, TargetOpcode::G_ANYEXT);
1407+
1408+
// Avoid changing the result vector type if the source element type was
1409+
// requested.
1410+
if (TypeIdx == 1) {
1411+
auto &TII = *MI.getMF()->getSubtarget().getInstrInfo();
1412+
MI.setDesc(TII.get(TargetOpcode::G_BUILD_VECTOR_TRUNC));
1413+
} else {
1414+
widenScalarDst(MI, WideTy, 0);
1415+
}
1416+
1417+
Observer.changedInstr(MI);
1418+
return Legalized;
1419+
}
14011420
}
14021421
}
14031422

llvm/unittests/CodeGen/GlobalISel/LegalizerHelperTest.cpp

+47
Original file line numberDiff line numberDiff line change
@@ -853,4 +853,51 @@ TEST_F(GISelMITest, LowerMinMax) {
853853

854854
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
855855
}
856+
857+
TEST_F(GISelMITest, WidenScalarBuildVector) {
858+
if (!TM)
859+
return;
860+
861+
LLT S32 = LLT::scalar(32);
862+
LLT S16 = LLT::scalar(16);
863+
LLT V2S16 = LLT::vector(2, S16);
864+
LLT V2S32 = LLT::vector(2, S32);
865+
866+
DefineLegalizerInfo(A, {
867+
getActionDefinitionsBuilder({G_SMIN, G_SMAX, G_UMIN, G_UMAX})
868+
.lowerFor({s64, LLT::vector(2, s32)});
869+
});
870+
871+
AInfo Info(MF->getSubtarget());
872+
DummyGISelObserver Observer;
873+
LegalizerHelper Helper(*MF, Info, Observer, B);
874+
B.setInsertPt(*EntryMBB, EntryMBB->end());
875+
876+
Register Constant0 = B.buildConstant(S16, 1).getReg(0);
877+
Register Constant1 = B.buildConstant(S16, 2).getReg(0);
878+
auto BV0 = B.buildBuildVector(V2S16, {Constant0, Constant1});
879+
auto BV1 = B.buildBuildVector(V2S16, {Constant0, Constant1});
880+
881+
EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized,
882+
Helper.widenScalar(*BV0, 0, V2S32));
883+
EXPECT_EQ(LegalizerHelper::LegalizeResult::Legalized,
884+
Helper.widenScalar(*BV1, 1, S32));
885+
886+
auto CheckStr = R"(
887+
CHECK: [[K0:%[0-9]+]]:_(s16) = G_CONSTANT i16 1
888+
CHECK-NEXT: [[K1:%[0-9]+]]:_(s16) = G_CONSTANT i16 2
889+
CHECK-NEXT: [[EXT_K0_0:%[0-9]+]]:_(s32) = G_ANYEXT [[K0]]
890+
CHECK-NEXT: [[EXT_K1_0:%[0-9]+]]:_(s32) = G_ANYEXT [[K1]]
891+
CHECK-NEXT: [[BV0:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[EXT_K0_0]]:_(s32), [[EXT_K1_0]]:_(s32)
892+
CHECK-NEXT: [[BV0_TRUNC:%[0-9]+]]:_(<2 x s16>) = G_TRUNC [[BV0]]
893+
894+
CHECK: [[EXT_K0_1:%[0-9]+]]:_(s32) = G_ANYEXT [[K0]]
895+
CHECK-NEXT: [[EXT_K1_1:%[0-9]+]]:_(s32) = G_ANYEXT [[K1]]
896+
897+
CHECK-NEXT: [[BV1:%[0-9]+]]:_(<2 x s16>) = G_BUILD_VECTOR_TRUNC [[EXT_K0_1]]:_(s32), [[EXT_K1_1]]:_(s32)
898+
)";
899+
900+
EXPECT_TRUE(CheckMachineFunction(*MF, CheckStr)) << *MF;
901+
}
902+
856903
} // namespace

0 commit comments

Comments
 (0)