6 #include <gtest/gtest.h>
18 TEST(ForkInsertionTests, ForkInsertion)
26 { bit32Type, bit32Type, bit32Type },
27 { bit32Type, bit32Type, bit32Type });
30 auto & rootRegion = rvsdgModule.Rvsdg().GetRootRegion();
38 loop->AddLoopVar(lambda->GetFunctionArguments()[0], &idvBuffer);
40 loop->AddLoopVar(lambda->GetFunctionArguments()[1], &lvsBuffer);
42 loop->AddLoopVar(lambda->GetFunctionArguments()[2], &lveBuffer);
44 auto arm = rvsdg::CreateOpNode<rvsdg::bitadd_op>({ idvBuffer, lvsBuffer }, 32).output(0);
45 auto cmp = rvsdg::CreateOpNode<rvsdg::bitult_op>({ arm, lveBuffer }, 32).output(0);
48 loop->set_predicate(matchNode.output(0));
50 auto lambdaOutput = lambda->finalize({ loop->output(0), loop->output(1), loop->output(2) });
62 EXPECT_EQ(rootRegion.numNodes(), 1);
63 auto lambda = util::assertedCast<jlm::rvsdg::LambdaNode>(rootRegion.Nodes().begin().ptr());
66 auto lambdaSubregion = lambda->subregion();
67 EXPECT_EQ(lambdaSubregion->numNodes(), 1);
68 auto loop = util::assertedCast<hls::LoopNode>(lambdaSubregion->Nodes().begin().ptr());
69 EXPECT_NE(
dynamic_cast<const hls::LoopNode *
>(loop),
nullptr);
71 auto [forkNode, forkOperation] = rvsdg::TryGetSimpleNodeAndOptionalOp<hls::ForkOperation>(
72 *loop->subregion()->result(0)->origin());
73 EXPECT_TRUE(forkNode && forkOperation);
74 EXPECT_EQ(forkNode->ninputs(), 1);
75 EXPECT_EQ(forkNode->noutputs(), 4);
76 EXPECT_FALSE(forkOperation->IsConstant());
80 TEST(SinkInsertionTests, ConstantForkInsertion)
90 auto & rootRegion = rvsdgModule.Rvsdg().GetRootRegion();
97 auto subregion = loop->subregion();
99 loop->AddLoopVar(lambda->GetFunctionArguments()[0], &idvBuffer);
102 auto arm = rvsdg::CreateOpNode<rvsdg::bitadd_op>({ idvBuffer, bitConstant1 }, 32).output(0);
103 auto cmp = rvsdg::CreateOpNode<rvsdg::bitult_op>({ arm, bitConstant1 }, 32).output(0);
106 loop->set_predicate(matchNode.output(0));
108 auto lambdaOutput = lambda->finalize({ loop->output(0) });
120 EXPECT_EQ(rootRegion.numNodes(), 1);
121 auto lambda = util::assertedCast<jlm::rvsdg::LambdaNode>(rootRegion.Nodes().begin().ptr());
122 EXPECT_TRUE(rvsdg::is<jlm::rvsdg::LambdaOperation>(lambda));
124 auto lambdaRegion = lambda->subregion();
125 EXPECT_EQ(lambdaRegion->numNodes(), 1);
129 EXPECT_NE(loopOutput,
nullptr);
130 auto loopNode = loopOutput->
node();
131 EXPECT_TRUE(rvsdg::is<hls::LoopOperation>(loopNode));
132 auto loop = util::assertedCast<hls::LoopNode>(loopNode);
134 auto [forkNode, forkOperation] = rvsdg::TryGetSimpleNodeAndOptionalOp<hls::ForkOperation>(
135 *loop->subregion()->result(0)->origin());
136 EXPECT_TRUE(forkNode && forkOperation);
137 EXPECT_EQ(forkNode->ninputs(), 1);
138 EXPECT_EQ(forkNode->noutputs(), 2);
139 EXPECT_FALSE(forkOperation->IsConstant());
141 auto matchNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*forkNode->input(0)->origin());
142 auto bitsUltNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*matchNode->input(0)->origin());
143 auto [cForkNode, cForkOperation] =
144 rvsdg::TryGetSimpleNodeAndOptionalOp<hls::ForkOperation>(*bitsUltNode->input(1)->origin());
145 EXPECT_EQ(cForkNode->ninputs(), 1);
146 EXPECT_EQ(cForkNode->noutputs(), 2);
147 EXPECT_TRUE(cForkOperation->IsConstant());
static jlm::util::StatisticsCollector statisticsCollector
TEST(ForkInsertionTests, ForkInsertion)
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
static LoopNode * create(rvsdg::Region *parent, bool init=true)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::CallingConvention callingConvention, jlm::llvm::AttributeSet attributes)
static Output & create(Region ®ion, BitValueRepresentation value)
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static std::shared_ptr< const FunctionType > Create(std::vector< std::shared_ptr< const jlm::rvsdg::Type >> argumentTypes, std::vector< std::shared_ptr< const jlm::rvsdg::Type >> resultTypes)
static GraphExport & Create(Output &origin, std::string name)
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
Node * node() const noexcept
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)