6 #include <gtest/gtest.h>
15 TEST(RedundantBufferEliminationTests, BufferWithLocalLoad)
28 auto & rvsdg = rvsdgModule.
Rvsdg();
48 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
49 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
50 EXPECT_TRUE(bufferNode && bufferOperation);
51 EXPECT_EQ(bufferOperation->Capacity(), 4);
52 EXPECT_TRUE(bufferOperation->IsPassThrough());
55 TEST(RedundantBufferEliminationTests, BufferWithLocalStore)
68 auto & rvsdg = rvsdgModule.
Rvsdg();
88 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
89 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
90 EXPECT_TRUE(bufferNode && bufferOperation);
91 EXPECT_EQ(bufferOperation->Capacity(), 4);
92 EXPECT_TRUE(bufferOperation->IsPassThrough());
95 TEST(RedundantBufferEliminationTests, BufferWithLoad)
108 auto & rvsdg = rvsdgModule.
Rvsdg();
128 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
129 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
130 EXPECT_TRUE(bufferNode && bufferOperation);
131 EXPECT_EQ(bufferOperation->Capacity(), 4);
132 EXPECT_TRUE(bufferOperation->IsPassThrough());
135 TEST(RedundantBufferEliminationTests, BufferWithStore)
148 auto & rvsdg = rvsdgModule.
Rvsdg();
158 { &importMemState0 },
173 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
174 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
175 EXPECT_TRUE(bufferNode && bufferOperation);
176 EXPECT_EQ(bufferOperation->Capacity(), 4);
177 EXPECT_TRUE(bufferOperation->IsPassThrough());
180 TEST(RedundantBufferEliminationTests, BufferWithForkAndLocalLoad)
193 auto & rvsdg = rvsdgModule.
Rvsdg();
214 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 3);
215 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
216 EXPECT_TRUE(bufferNode && bufferOperation);
217 EXPECT_EQ(bufferOperation->Capacity(), 4);
218 EXPECT_TRUE(bufferOperation->IsPassThrough());
221 TEST(RedundantBufferEliminationTests, BufferWithBranchAndLocalLoad)
235 auto & rvsdg = rvsdgModule.
Rvsdg();
257 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 3);
258 auto [bufferNode, bufferOperation] = TryGetSimpleNodeAndOptionalOp<BufferOperation>(*x.origin());
259 EXPECT_TRUE(bufferNode && bufferOperation);
260 EXPECT_EQ(bufferOperation->Capacity(), 4);
261 EXPECT_TRUE(bufferOperation->IsPassThrough());
264 TEST(RedundantBufferEliminationTests, BufferWithOtherNode)
276 auto & rvsdg = rvsdgModule.
Rvsdg();
296 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
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(), 4);
301 EXPECT_FALSE(bufferOperation->IsPassThrough());
304 TEST(RedundantBufferEliminationTests, BufferWithNonMemoryStateOperand)
317 auto & rvsdg = rvsdgModule.
Rvsdg();
338 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
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(), 4);
343 EXPECT_FALSE(bufferOperation->IsPassThrough());
346 TEST(RedundantBufferEliminationTests, PassthroughBuffer)
359 auto & rvsdg = rvsdgModule.
Rvsdg();
380 EXPECT_EQ(rvsdg.GetRootRegion().numNodes(), 2);
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(), 4);
385 EXPECT_TRUE(bufferOperation->IsPassThrough());
static jlm::util::StatisticsCollector statisticsCollector
TEST(RedundantBufferEliminationTests, BufferWithLocalLoad)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &predicate, jlm::rvsdg::Output &value, bool loop=false)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &value, size_t capacity, bool pass_through=false)
static std::vector< jlm::rvsdg::Output * > create(size_t nalternatives, jlm::rvsdg::Output &value, bool isConstant=false)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &load_result)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &index, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &load_result)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &index, jlm::rvsdg::Output &value, const std::vector< jlm::rvsdg::Output * > &states)
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, jlm::rvsdg::Output &value, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &resp)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
static GraphExport & Create(Output &origin, std::string name)
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
static SimpleNode * createNode(Region *region, const std::vector< Output * > &operands, std::vector< std::shared_ptr< const Type >> resultTypes)
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)