15TEST(RedundantBufferEliminationTests, BufferWithLocalLoad)
25 auto memoryStateType = MemoryStateType::Create();
28 auto & rvsdg = rvsdgModule.
Rvsdg();
34 auto loadResults = LocalLoadOperation::create(importI64, { &importMemState }, importValue);
35 auto bufferResults = BufferOperation::create(*loadResults[1], 4,
false);
48 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
49 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
50 EXPECT_TRUE(bufferNode && bufferOperation);
51 EXPECT_EQ(bufferOperation->Capacity(), 4u);
52 EXPECT_TRUE(bufferOperation->IsPassThrough());
55TEST(RedundantBufferEliminationTests, BufferWithLocalStore)
65 auto memoryStateType = MemoryStateType::Create();
68 auto & rvsdg = rvsdgModule.
Rvsdg();
74 auto storeResults = LocalStoreOperation::create(importI64, importValue, { &importMemState });
75 auto bufferResults = BufferOperation::create(*storeResults[0], 4,
false);
88 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
89 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
90 EXPECT_TRUE(bufferNode && bufferOperation);
91 EXPECT_EQ(bufferOperation->Capacity(), 4u);
92 EXPECT_TRUE(bufferOperation->IsPassThrough());
95TEST(RedundantBufferEliminationTests, BufferWithLoad)
104 auto pointerType = PointerType::Create();
105 auto memoryStateType = MemoryStateType::Create();
108 auto & rvsdg = rvsdgModule.
Rvsdg();
114 auto loadResults = LoadOperation::create(importPtr, { &importMemState }, importValue);
115 auto bufferResults = BufferOperation::create(*loadResults[1], 4,
false);
128 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
129 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
130 EXPECT_TRUE(bufferNode && bufferOperation);
131 EXPECT_EQ(bufferOperation->Capacity(), 4u);
132 EXPECT_TRUE(bufferOperation->IsPassThrough());
135TEST(RedundantBufferEliminationTests, BufferWithStore)
144 auto pointerType = PointerType::Create();
145 auto memoryStateType = MemoryStateType::Create();
148 auto & rvsdg = rvsdgModule.
Rvsdg();
158 { &importMemState0 },
160 auto bufferResults = BufferOperation::create(*storeResults[0], 4,
false);
173 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
174 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
175 EXPECT_TRUE(bufferNode && bufferOperation);
176 EXPECT_EQ(bufferOperation->Capacity(), 4u);
177 EXPECT_TRUE(bufferOperation->IsPassThrough());
180TEST(RedundantBufferEliminationTests, BufferWithForkAndLocalLoad)
190 auto memoryStateType = MemoryStateType::Create();
193 auto & rvsdg = rvsdgModule.
Rvsdg();
199 auto loadResults = LocalLoadOperation::create(importI64, { &importMemState }, importValue);
200 auto forkResults = ForkOperation::create(2, *loadResults[1]);
201 auto bufferResults = BufferOperation::create(*forkResults[0], 4,
false);
214 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 3u);
215 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
216 EXPECT_TRUE(bufferNode && bufferOperation);
217 EXPECT_EQ(bufferOperation->Capacity(), 4u);
218 EXPECT_TRUE(bufferOperation->IsPassThrough());
221TEST(RedundantBufferEliminationTests, BufferWithBranchAndLocalLoad)
231 auto controlType = ControlType::Create(2);
232 auto memoryStateType = MemoryStateType::Create();
235 auto & rvsdg = rvsdgModule.
Rvsdg();
242 auto loadResults = LocalLoadOperation::create(importI64, { &importMemState }, importValue);
243 auto branchResults = BranchOperation::create(importControl, *loadResults[1]);
244 auto bufferResults = BufferOperation::create(*branchResults[0], 4,
false);
257 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 3u);
258 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
259 EXPECT_TRUE(bufferNode && bufferOperation);
260 EXPECT_EQ(bufferOperation->Capacity(), 4u);
261 EXPECT_TRUE(bufferOperation->IsPassThrough());
264TEST(RedundantBufferEliminationTests, BufferWithOtherNode)
273 auto memoryStateType = MemoryStateType::Create();
276 auto & rvsdg = rvsdgModule.
Rvsdg();
281 TestOperation::createNode(&rvsdg.GetRootRegion(), { &importValue }, { memoryStateType });
282 auto bufferResults = BufferOperation::create(*node->output(0), 4,
false);
296 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
297 EXPECT_EQ(x.origin(), bufferResults[0]);
298 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
299 EXPECT_TRUE(bufferNode && bufferOperation);
300 EXPECT_EQ(bufferOperation->Capacity(), 4u);
301 EXPECT_FALSE(bufferOperation->IsPassThrough());
304TEST(RedundantBufferEliminationTests, BufferWithNonMemoryStateOperand)
314 auto memoryStateType = MemoryStateType::Create();
317 auto & rvsdg = rvsdgModule.
Rvsdg();
323 auto loadResults = LocalLoadOperation::create(importI64, { &importMemState }, importValue);
324 auto bufferResults = BufferOperation::create(*loadResults[0], 4,
false);
338 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
339 EXPECT_EQ(x.origin(), bufferResults[0]);
340 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
341 EXPECT_TRUE(bufferNode && bufferOperation);
342 EXPECT_EQ(bufferOperation->Capacity(), 4u);
343 EXPECT_FALSE(bufferOperation->IsPassThrough());
346TEST(RedundantBufferEliminationTests, PassthroughBuffer)
356 auto memoryStateType = MemoryStateType::Create();
359 auto & rvsdg = rvsdgModule.
Rvsdg();
365 auto loadResults = LocalLoadOperation::create(importI64, { &importMemState }, importValue);
366 auto bufferResults = BufferOperation::create(*loadResults[1], 4,
true);
380 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2u);
381 EXPECT_EQ(x.origin(), bufferResults[0]);
382 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
383 EXPECT_TRUE(bufferNode && bufferOperation);
384 EXPECT_EQ(bufferOperation->Capacity(), 4u);
385 EXPECT_TRUE(bufferOperation->IsPassThrough());