@@ -39,7 +39,10 @@ namespace xls {
39
39
namespace {
40
40
41
41
using status_testing::IsOkAndHolds;
42
+
42
43
using ::testing::_;
44
+ using ::testing::Each;
45
+ using ::testing::UnorderedElementsAre;
43
46
using ::testing::VariantWith;
44
47
45
48
class StrengthReductionPassTest : public IrTestBase {
@@ -416,7 +419,7 @@ TEST_F(StrengthReductionPassTest, ArithToSelect) {
416
419
ASSERT_THAT (Run (f), IsOkAndHolds (true ));
417
420
// Actual verification of result is done by semantics test.
418
421
EXPECT_THAT (f->return_value ()->operands (),
419
- testing:: Each (m::Select (m::Eq (), {m::Literal (), m::Literal ()})));
422
+ Each (m::Select (m::Eq (), {m::Literal (), m::Literal ()})));
420
423
}
421
424
422
425
TEST_F (StrengthReductionPassTest, ArithToSelectOnlyWithOneBit) {
@@ -476,5 +479,35 @@ TEST_F(StrengthReductionPassTest, DoNotPushDownMultipleSelects) {
476
479
ASSERT_THAT (Run (f), IsOkAndHolds (false )) << f->DumpIr ();
477
480
}
478
481
482
+ TEST_F (StrengthReductionPassTest, ReplaceWidth0Param) {
483
+ auto p = CreatePackage ();
484
+ FunctionBuilder fb (TestName (), p.get ());
485
+ BValue ret = fb.Or (fb.ZeroExtend (fb.Param (" x" , p->GetBitsType (0 )), 1 ),
486
+ fb.Param (" y" , p->GetBitsType (1 )));
487
+ XLS_ASSERT_OK_AND_ASSIGN (Function * f, fb.BuildWithReturnValue (ret));
488
+ EXPECT_THAT (f->nodes (), UnorderedElementsAre (
489
+ m::Param (" x" ), m::Param (" y" ), m::ZeroExt (),
490
+ m::Or (m::ZeroExt (m::Param (" x" )), m::Param (" y" ))));
491
+ ASSERT_THAT (Run (f), IsOkAndHolds (true ));
492
+ EXPECT_THAT (f->nodes (),
493
+ UnorderedElementsAre (m::Param (" x" ), m::Param (" y" ), m::Literal (),
494
+ m::Or (m::Literal (0 ), m::Param (" y" ))));
495
+ }
496
+
497
+ TEST_F (StrengthReductionPassTest, DoNotReplaceUnusedWidth0Param) {
498
+ auto p = CreatePackage ();
499
+ FunctionBuilder fb (TestName (), p.get ());
500
+ fb.Param (" x" , p->GetBitsType (0 ));
501
+ XLS_ASSERT_OK_AND_ASSIGN (
502
+ Function * f, fb.BuildWithReturnValue (fb.Param (" y" , p->GetBitsType (1 ))));
503
+ EXPECT_THAT (f->nodes (), UnorderedElementsAre (m::Param (" x" ), m::Param (" y" )));
504
+ // Normally, the empty param would be replaced with a literal, but since it
505
+ // is unused, it doesn't get replaced.
506
+ // Replacing unused params with literals can lead to an infinite loop with
507
+ // strength reduction adding the literal and DCE removing it.
508
+ ASSERT_THAT (Run (f), IsOkAndHolds (false ));
509
+ EXPECT_THAT (f->nodes (), UnorderedElementsAre (m::Param (" x" ), m::Param (" y" )));
510
+ }
511
+
479
512
} // namespace
480
513
} // namespace xls
0 commit comments