@@ -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,72 @@ 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+
440+ SmallVector<MachineInstr *, 16 > MIList;
441+
442+ setUp (MIRString);
443+ if (!TM)
444+ GTEST_SKIP ();
445+
446+ collectNonCopyMI (MIList, MF);
447+
448+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[0 ], *MRI).has_value ());
449+ auto val = isConstantOrConstantSplatVectorFP (*MIList[0 ], *MRI).value ();
450+ EXPECT_EQ (2.0 , val.convertToFloat ());
451+
452+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[1 ], *MRI).has_value ());
453+ val = isConstantOrConstantSplatVectorFP (*MIList[1 ], *MRI).value ();
454+ EXPECT_EQ (0.0 , val.convertToFloat ());
455+
456+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[2 ], *MRI).has_value ());
457+ val = isConstantOrConstantSplatVectorFP (*MIList[2 ], *MRI).value ();
458+ EXPECT_EQ (0.03 , val.convertToDouble ());
459+
460+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[3 ], *MRI).has_value ());
461+
462+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[4 ], *MRI).has_value ());
463+ val = isConstantOrConstantSplatVectorFP (*MIList[4 ], *MRI).value ();
464+ EXPECT_EQ (2.0 , val.convertToFloat ());
465+
466+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[5 ], *MRI).has_value ());
467+
468+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[6 ], *MRI).has_value ());
469+ val = isConstantOrConstantSplatVectorFP (*MIList[6 ], *MRI).value ();
470+ EXPECT_EQ (0.03 , val.convertToDouble ());
471+
472+ EXPECT_FALSE (isConstantOrConstantSplatVectorFP (*MIList[7 ], *MRI).has_value ());
473+
474+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[8 ], *MRI).has_value ());
475+ val = isConstantOrConstantSplatVectorFP (*MIList[8 ], *MRI).value ();
476+ EXPECT_EQ (2.0 , val.convertToFloat ());
477+
478+ EXPECT_TRUE (isConstantOrConstantSplatVectorFP (*MIList[9 ], *MRI).has_value ());
479+ val = isConstantOrConstantSplatVectorFP (*MIList[9 ], *MRI).value ();
480+ EXPECT_EQ (0.03 , val.convertToDouble ());
481+
482+ EXPECT_FALSE (
483+ isConstantOrConstantSplatVectorFP (*MIList[10 ], *MRI).has_value ());
484+
485+ EXPECT_FALSE (
486+ isConstantOrConstantSplatVectorFP (*MIList[11 ], *MRI).has_value ());
487+ }
411488}
0 commit comments