@@ -77,6 +77,15 @@ static const LLT NXV3P0 = LLT::scalable_vector(3, P0);
77
77
static const LLT NXV4P0 = LLT::scalable_vector(4 , P0);
78
78
static const LLT NXV12P0 = LLT::scalable_vector(12 , P0);
79
79
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
+
80
89
TEST (GISelUtilsTest, getGCDType) {
81
90
EXPECT_EQ (S1, getGCDType (S1, S1));
82
91
EXPECT_EQ (S32, getGCDType (S32, S32));
@@ -408,4 +417,90 @@ TEST_F(AArch64GISelMITest, ConstFalseTest) {
408
417
}
409
418
}
410
419
}
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
+ }
411
506
}
0 commit comments