|
32 | 32 | #include "xls/ir/function_builder.h"
|
33 | 33 | #include "xls/ir/ir_matcher.h"
|
34 | 34 | #include "xls/ir/ir_test_base.h"
|
| 35 | +#include "xls/ir/nodes.h" |
35 | 36 | #include "xls/ir/package.h"
|
| 37 | +#include "xls/ir/proc.h" |
36 | 38 | #include "xls/ir/source_location.h"
|
37 | 39 | #include "xls/ir/value.h"
|
38 | 40 | #include "xls/passes/dce_pass.h"
|
@@ -77,27 +79,18 @@ TEST_F(UselessIORemovalPassTest, DontRemoveOnlySend) {
|
77 | 79 | p->CreateStreamingChannel("test_channel", ChannelOps::kSendOnly,
|
78 | 80 | p->GetBitsType(32)));
|
79 | 81 | ProcBuilder pb(TestName(), p.get());
|
| 82 | + BValue token = pb.StateElement("tkn", Value::Token()); |
80 | 83 | pb.StateElement("state", Value(UBits(0, 0)));
|
81 |
| - pb.SendIf(channel, pb.Literal(Value::Token()), pb.Literal(UBits(0, 1)), |
82 |
| - pb.Literal(UBits(1, 32))); |
83 |
| - XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, pb.Build({pb.Literal(UBits(0, 0))})); |
84 |
| - int64_t original_node_count = proc->node_count(); |
85 |
| - EXPECT_THAT(Run(p.get()), IsOkAndHolds(false)); |
86 |
| - EXPECT_EQ(proc->node_count(), original_node_count); |
87 |
| -} |
88 |
| - |
89 |
| -TEST_F(UselessIORemovalPassTest, DontRemoveOnlySendNewStyle) { |
90 |
| - auto p = CreatePackage(); |
91 |
| - TokenlessProcBuilder pb(NewStyleProc(), TestName(), "tkn", p.get()); |
92 |
| - XLS_ASSERT_OK_AND_ASSIGN( |
93 |
| - SendChannelInterface * channel, |
94 |
| - pb.AddOutputChannel("test_channel", p->GetBitsType(32))); |
95 |
| - pb.StateElement("state", Value(UBits(0, 0))); |
96 |
| - pb.SendIf(channel, pb.Literal(UBits(0, 1)), pb.Literal(UBits(1, 32))); |
97 |
| - XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, pb.Build({pb.Literal(UBits(0, 0))})); |
| 84 | + token = pb.SendIf(channel, token, pb.Literal(UBits(0, 1)), |
| 85 | + pb.Literal(UBits(1, 32)), SourceInfo(), "my_send"); |
| 86 | + XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, |
| 87 | + pb.Build({token, pb.Literal(UBits(0, 0))})); |
98 | 88 | int64_t original_node_count = proc->node_count();
|
99 |
| - EXPECT_THAT(Run(p.get()), IsOkAndHolds(false)); |
| 89 | + EXPECT_THAT(Run(p.get()), IsOkAndHolds(true)); |
100 | 90 | EXPECT_EQ(proc->node_count(), original_node_count);
|
| 91 | + XLS_ASSERT_OK_AND_ASSIGN(Node * send_node, proc->GetNode("my_send")); |
| 92 | + ASSERT_TRUE(send_node->Is<Send>()); |
| 93 | + EXPECT_THAT(send_node->As<Send>()->data(), m::Literal(0)); |
101 | 94 | }
|
102 | 95 |
|
103 | 96 | TEST_F(UselessIORemovalPassTest, RemoveSendIfLiteralFalse) {
|
@@ -243,6 +236,48 @@ TEST_F(UselessIORemovalPassTest, RemoveReceivePredIfLiteralTrue) {
|
243 | 236 | ElementsAre(m::Next(proc->GetStateRead(1), m::TupleIndex(tuple, 1))));
|
244 | 237 | }
|
245 | 238 |
|
| 239 | +TEST_F(UselessIORemovalPassTest, DontRemoveLastSendIfOnSendOnlyChannel) { |
| 240 | + auto p = CreatePackage(); |
| 241 | + XLS_ASSERT_OK_AND_ASSIGN( |
| 242 | + StreamingChannel * channel, |
| 243 | + p->CreateStreamingChannel("test_channel", ChannelOps::kSendOnly, |
| 244 | + p->GetBitsType(32))); |
| 245 | + ProcBuilder pb(TestName(), p.get()); |
| 246 | + BValue token = pb.StateElement("tkn", Value::Token()); |
| 247 | + pb.StateElement("state", Value(UBits(0, 0))); |
| 248 | + token = pb.SendIf(channel, token, pb.Literal(UBits(0, 1)), |
| 249 | + pb.Literal(UBits(1, 32)), SourceInfo(), "my_send"); |
| 250 | + XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, |
| 251 | + pb.Build({token, pb.Literal(UBits(0, 0))})); |
| 252 | + ASSERT_EQ(p->channels().size(), 1); |
| 253 | + int64_t original_node_count = proc->node_count(); |
| 254 | + EXPECT_THAT(Run(p.get()), IsOkAndHolds(true)); |
| 255 | + EXPECT_EQ(proc->node_count(), original_node_count); |
| 256 | + XLS_ASSERT_OK_AND_ASSIGN(Node * send_node, proc->GetNode("my_send")); |
| 257 | + ASSERT_TRUE(send_node->Is<Send>()); |
| 258 | + EXPECT_THAT(send_node->As<Send>()->data(), m::Literal(0)); |
| 259 | +} |
| 260 | + |
| 261 | +TEST_F(UselessIORemovalPassTest, DontRemoveLastReceiveIfOnReceiveOnlyChannel) { |
| 262 | + auto p = CreatePackage(); |
| 263 | + XLS_ASSERT_OK_AND_ASSIGN( |
| 264 | + StreamingChannel * channel, |
| 265 | + p->CreateStreamingChannel("test_channel", ChannelOps::kReceiveOnly, |
| 266 | + p->GetBitsType(32))); |
| 267 | + ProcBuilder pb(TestName(), p.get()); |
| 268 | + BValue token = pb.StateElement("tkn", Value::Token()); |
| 269 | + pb.StateElement("state", Value(UBits(0, 32))); |
| 270 | + BValue token_and_result = |
| 271 | + pb.ReceiveIf(channel, token, pb.Literal(UBits(0, 1))); |
| 272 | + token = pb.TupleIndex(token_and_result, 0); |
| 273 | + BValue result = pb.TupleIndex(token_and_result, 1); |
| 274 | + XLS_ASSERT_OK_AND_ASSIGN(Proc * proc, pb.Build({token, result})); |
| 275 | + ASSERT_EQ(p->channels().size(), 1); |
| 276 | + int64_t original_node_count = proc->node_count(); |
| 277 | + EXPECT_THAT(Run(p.get()), IsOkAndHolds(false)); |
| 278 | + EXPECT_EQ(proc->node_count(), original_node_count); |
| 279 | +} |
| 280 | + |
246 | 281 | void IrFuzzUselessIORemoval(FuzzPackageWithArgs fuzz_package_with_args) {
|
247 | 282 | UselessIORemovalPass pass;
|
248 | 283 | OptimizationPassChangesOutputs(std::move(fuzz_package_with_args), pass);
|
|
0 commit comments