@@ -77,6 +77,15 @@ static const LLT NXV3P0 = LLT::scalable_vector(3, P0);
7777static const LLT NXV4P0 = LLT::scalable_vector(4 , P0);
7878static const LLT NXV12P0 = LLT::scalable_vector(12 , P0);
7979
80+ static void collectNonCopyMI (SmallVectorImpl<MachineInstr *> &MIList,
81+ MachineFunction *MF) {
82+ for (auto &MBB : *MF)
83+ for (MachineInstr &MI : MBB) {
84+ if (MI.getOpcode () != TargetOpcode::COPY)
85+ MIList.push_back (&MI);
86+ }
87+ }
88+
8089TEST (GISelUtilsTest, getGCDType) {
8190 EXPECT_EQ (S1, getGCDType (S1, S1));
8291 EXPECT_EQ (S32, getGCDType (S32, S32));
@@ -408,4 +417,90 @@ TEST_F(AArch64GISelMITest, ConstFalseTest) {
408417 }
409418 }
410419}
420+
421+ TEST_F (AMDGPUGISelMITest, isConstantOrConstantSplatVectorFP) {
422+ StringRef MIRString =
423+ " %cst0:_(s32) = G_FCONSTANT float 2.000000e+00\n "
424+ " %cst1:_(s32) = G_FCONSTANT float 0.0\n "
425+ " %cst2:_(s64) = G_FCONSTANT double 3.000000e-02\n "
426+ " %cst3:_(s32) = G_CONSTANT i32 2\n "
427+ " %cst4:_(<2 x s32>) = G_BUILD_VECTOR %cst0(s32), %cst0(s32)\n "
428+ " %cst5:_(<2 x s32>) = G_BUILD_VECTOR %cst1(s32), %cst0(s32)\n "
429+ " %cst6:_(<2 x s64>) = G_BUILD_VECTOR %cst2(s64), %cst2(s64)\n "
430+ " %cst7:_(<2 x s32>) = G_BUILD_VECTOR %cst3(s32), %cst3:_(s32)\n "
431+ " %cst8:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), %cst4:_(<2 "
432+ " x s32>)\n "
433+ " %cst9:_(<4 x s64>) = G_CONCAT_VECTORS %cst6:_(<2 x s64>), %cst6:_(<2 "
434+ " x s64>)\n "
435+ " %cst10:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), %cst5:_(<2 "
436+ " x s32>)\n "
437+ " %cst11:_(<4 x s32>) = G_CONCAT_VECTORS %cst7:_(<2 x s32>), %cst7:_(<2 "
438+ " x s32>)\n "
439+ " %cst12:_(s32) = G_IMPLICIT_DEF \n "
440+ " %cst13:_(<2 x s32>) = G_BUILD_VECTOR %cst12(s32), %cst12(s32)\n "
441+ " %cst14:_(<2 x s32>) = G_BUILD_VECTOR %cst0(s32), %cst12(s32)\n "
442+ " %cst15:_(<4 x s32>) = G_CONCAT_VECTORS %cst4:_(<2 x s32>), "
443+ " %cst14:_(<2 "
444+ " x s32>)\n " ;
445+
446+ SmallVector<MachineInstr *, 16 > MIList;
447+
448+ setUp (MIRString);
449+ if (!TM)
450+ GTEST_SKIP ();
451+
452+ collectNonCopyMI (MIList, MF);
453+
454+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[0 ], *MRI).has_value ());
455+ auto val = isConstantOrConstantSplatVectorFP (*MIList[0 ], *MRI).value ();
456+ EXPECT_EQ (2.0 , val.convertToFloat ());
457+
458+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[1 ], *MRI).has_value ());
459+ val = isConstantOrConstantSplatVectorFP (*MIList[1 ], *MRI).value ();
460+ EXPECT_EQ (0.0 , val.convertToFloat ());
461+
462+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[2 ], *MRI).has_value ());
463+ val = isConstantOrConstantSplatVectorFP (*MIList[2 ], *MRI).value ();
464+ EXPECT_EQ (0.03 , val.convertToDouble ());
465+
466+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[3 ], *MRI).has_value ());
467+
468+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[4 ], *MRI).has_value ());
469+ val = isConstantOrConstantSplatVectorFP (*MIList[4 ], *MRI).value ();
470+ EXPECT_EQ (2.0 , val.convertToFloat ());
471+
472+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[5 ], *MRI).has_value ());
473+
474+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[6 ], *MRI).has_value ());
475+ val = isConstantOrConstantSplatVectorFP (*MIList[6 ], *MRI).value ();
476+ EXPECT_EQ (0.03 , val.convertToDouble ());
477+
478+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[7 ], *MRI).has_value ());
479+
480+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[8 ], *MRI).has_value ());
481+ val = isConstantOrConstantSplatVectorFP (*MIList[8 ], *MRI).value ();
482+ EXPECT_EQ (2.0 , val.convertToFloat ());
483+
484+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[9 ], *MRI).has_value ());
485+ val = isConstantOrConstantSplatVectorFP (*MIList[9 ], *MRI).value ();
486+ EXPECT_EQ (0.03 , val.convertToDouble ());
487+
488+ EXPECT_FALSE (
489+ isConstantOrConstantSplatVectorFP (*MIList[10 ], *MRI).has_value ());
490+
491+ EXPECT_FALSE (
492+ isConstantOrConstantSplatVectorFP (*MIList[11 ], *MRI).has_value ());
493+
494+ EXPECT_FALSE (
495+ isConstantOrConstantSplatVectorFP (*MIList[12 ], *MRI).has_value ());
496+
497+ EXPECT_FALSE (
498+ isConstantOrConstantSplatVectorFP (*MIList[13 ], *MRI).has_value ());
499+
500+ EXPECT_FALSE (
501+ isConstantOrConstantSplatVectorFP (*MIList[14 ], *MRI).has_value ());
502+
503+ EXPECT_FALSE (
504+ isConstantOrConstantSplatVectorFP (*MIList[15 ], *MRI).has_value ());
505+ }
411506}
0 commit comments