@@ -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