18TEST(ForkInsertionTests, ForkInsertion)
24 auto bit32Type = rvsdg::BitType::Create(32);
26 { bit32Type, bit32Type, bit32Type },
27 { bit32Type, bit32Type, bit32Type });
30 auto & rootRegion = rvsdgModule.Rvsdg().GetRootRegion();
34 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
36 auto loop = hls::LoopNode::create(lambda->subregion());
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);
46 auto & matchNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
48 loop->set_predicate(matchNode.output(0));
50 auto lambdaOutput = lambda->finalize({ loop->output(0), loop->output(1), loop->output(2) });
51 rvsdg::GraphExport::Create(*lambdaOutput,
"");
53 rvsdg::view(rvsdgModule.Rvsdg(), stdout);
58 rvsdg::view(rvsdgModule.Rvsdg(), stdout);
62 EXPECT_EQ(rootRegion.numNodes(), 1u);
63 auto lambda = util::assertedCast<jlm::rvsdg::LambdaNode>(rootRegion.Nodes().begin().ptr());
66 auto lambdaSubregion = lambda->subregion();
67 EXPECT_EQ(lambdaSubregion->numNodes(), 1u);
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(), 1u);
75 EXPECT_EQ(forkNode->noutputs(), 4u);
76 EXPECT_FALSE(forkOperation->IsConstant());
80TEST(SinkInsertionTests, ConstantForkInsertion)
86 auto bit32Type = rvsdg::BitType::Create(32);
87 const auto functionType = rvsdg::FunctionType::Create({ bit32Type }, { bit32Type });
90 auto & rootRegion = rvsdgModule.Rvsdg().GetRootRegion();
92 auto lambda = rvsdg::LambdaNode::Create(
94 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
96 auto loop = hls::LoopNode::create(lambda->subregion());
97 auto subregion = loop->subregion();
99 loop->AddLoopVar(lambda->GetFunctionArguments()[0], &idvBuffer);
100 auto bitConstant1 = &rvsdg::BitConstantOperation::create(*subregion, { 32, 1 });
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);
104 auto & matchNode = rvsdg::MatchOperation::CreateNode(*cmp, { { 1, 1 } }, 0, 2);
106 loop->set_predicate(matchNode.output(0));
108 auto lambdaOutput = lambda->finalize({ loop->output(0) });
109 rvsdg::GraphExport::Create(*lambdaOutput,
"");
111 rvsdg::view(rvsdgModule.Rvsdg(), stdout);
116 rvsdg::view(rvsdgModule.Rvsdg(), stdout);
120 EXPECT_EQ(rootRegion.numNodes(), 1u);
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(), 1u);
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(), 1u);
138 EXPECT_EQ(forkNode->noutputs(), 2u);
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(), 1u);
146 EXPECT_EQ(cForkNode->noutputs(), 2u);
147 EXPECT_TRUE(cForkOperation->IsConstant());