6 #include <gtest/gtest.h>
21 TEST(IfConversionTests, GammaWithoutMatch)
35 rvsdgModule.Rvsdg().GetRootRegion(),
37 const auto conditionValue = lambdaNode->GetFunctionArguments()[0];
38 const auto trueValue = lambdaNode->GetFunctionArguments()[1];
39 const auto falseValue = lambdaNode->GetFunctionArguments()[2];
42 auto gammaInput1 = gammaNode->AddEntryVar(trueValue);
43 auto gammaInput2 = gammaNode->AddEntryVar(falseValue);
45 gammaNode->AddExitVar({ gammaInput1.branchArgument[0], gammaInput2.branchArgument[1] });
47 auto lambdaOutput = lambdaNode->finalize({ gammaOutput.output });
57 view(rvsdgModule.Rvsdg(), stdout);
61 EXPECT_TRUE(gammaNode->IsDead());
62 const auto selectNode =
63 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaNode->subregion()->result(0)->origin());
64 EXPECT_TRUE(selectNode && is<SelectOperation>(selectNode));
65 EXPECT_EQ(selectNode->input(1)->origin(), falseValue);
66 EXPECT_EQ(selectNode->input(2)->origin(), trueValue);
68 const auto controlToBitsNode =
69 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*selectNode->input(0)->origin());
70 EXPECT_TRUE(controlToBitsNode && is<ControlToIntOperation>(controlToBitsNode));
71 EXPECT_EQ(controlToBitsNode->input(0)->origin(), conditionValue);
74 TEST(IfConversionTests, EmptyGammaWithTwoSubregionsAndMatch)
88 rvsdgModule.Rvsdg().GetRootRegion(),
90 const auto conditionValue = lambdaNode->GetFunctionArguments()[0];
91 const auto trueValue = lambdaNode->GetFunctionArguments()[1];
92 const auto falseValue = lambdaNode->GetFunctionArguments()[2];
99 auto [inputTrue, branchArgumentTrue] = gammaNode->AddEntryVar(trueValue);
100 auto [inputFalse, branchArgumentFalse] = gammaNode->AddEntryVar(falseValue);
101 auto [_, gammaOutput] = gammaNode->AddExitVar({ branchArgumentTrue[0], branchArgumentFalse[1] });
103 const auto lambdaOutput = lambdaNode->finalize({ gammaOutput });
106 view(rvsdgModule.Rvsdg(), stdout);
113 view(rvsdgModule.Rvsdg(), stdout);
117 EXPECT_TRUE(gammaNode->IsDead());
118 const auto selectNode =
119 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaNode->subregion()->result(0)->origin());
120 EXPECT_TRUE(selectNode && is<SelectOperation>(selectNode));
121 EXPECT_EQ(selectNode->input(1)->origin(), trueValue);
122 EXPECT_EQ(selectNode->input(2)->origin(), falseValue);
125 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*selectNode->input(0)->origin());
126 EXPECT_TRUE(eqNode && is<IntegerEqOperation>(eqNode));
129 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*eqNode->input(0)->origin());
132 EXPECT_EQ(eqNode->input(1)->origin(), conditionValue);
133 auto constantOperation =
135 EXPECT_NE(constantOperation,
nullptr);
136 EXPECT_EQ(constantOperation->Representation(), 24);
140 EXPECT_EQ(eqNode->input(0)->origin(), conditionValue);
141 constantNode = jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::SimpleNode>(*eqNode->input(1)->origin());
142 auto constantOperation =
144 EXPECT_NE(constantOperation,
nullptr);
145 EXPECT_EQ(constantOperation->Representation(), 24);
149 TEST(IfConversionTests, EmptyGammaWithTwoSubregions)
163 rvsdgModule.Rvsdg().GetRootRegion(),
165 const auto trueValue = lambdaNode->GetFunctionArguments()[1];
166 const auto falseValue = lambdaNode->GetFunctionArguments()[2];
169 *lambdaNode->GetFunctionArguments()[0],
175 const auto & c0 = jlm::rvsdg::CreateOpNode<jlm::rvsdg::ControlConstantOperation>(
176 *gammaNode0->subregion(0),
178 const auto & c1 = jlm::rvsdg::CreateOpNode<jlm::rvsdg::ControlConstantOperation>(
179 *gammaNode0->subregion(1),
181 auto c = gammaNode0->AddExitVar({ c0.output(0), c1.output(0) });
184 auto [inputTrue, branchArgumentTrue] = gammaNode1->AddEntryVar(trueValue);
185 auto [inputFalse, branchArgumentFalse] = gammaNode1->AddEntryVar(falseValue);
186 auto [_, gammaOutput] = gammaNode1->AddExitVar({ branchArgumentFalse[0], branchArgumentTrue[1] });
188 const auto lambdaOutput = lambdaNode->finalize({ gammaOutput });
191 view(rvsdgModule.Rvsdg(), stdout);
198 view(rvsdgModule.Rvsdg(), stdout);
201 EXPECT_TRUE(gammaNode1->IsDead());
202 const auto selectNode =
203 jlm::rvsdg::TryGetOwnerNode<jlm::rvsdg::Node>(*lambdaNode->subregion()->result(0)->origin());
204 EXPECT_TRUE(selectNode && is<SelectOperation>(selectNode));
205 EXPECT_EQ(selectNode->input(1)->origin(), trueValue);
206 EXPECT_EQ(selectNode->input(2)->origin(), falseValue);
209 TEST(IfConversionTests, EmptyGammaWithThreeSubregions)
223 rvsdgModule.Rvsdg().GetRootRegion(),
227 *lambdaNode->GetFunctionArguments()[0],
228 { { 0, 0 }, { 1, 1 } },
233 auto gammaInput1 = gammaNode->AddEntryVar(lambdaNode->GetFunctionArguments()[1]);
234 auto gammaInput2 = gammaNode->AddEntryVar(lambdaNode->GetFunctionArguments()[2]);
235 auto gammaOutput = gammaNode->AddExitVar({ gammaInput1.branchArgument[0],
236 gammaInput1.branchArgument[1],
237 gammaInput2.branchArgument[2] });
239 auto lambdaOutput = lambdaNode->finalize({ gammaOutput.output });
242 view(rvsdgModule.Rvsdg(), stdout);
249 view(rvsdgModule.Rvsdg(), stdout);
255 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2u);
256 EXPECT_FALSE(gammaNode->IsDead());
259 TEST(IfConversionTests, PartialEmptyGamma)
274 rvsdgModule.Rvsdg().GetRootRegion(),
278 MatchOperation::CreateNode(*lambdaNode->GetFunctionArguments()[0], { { 0, 0 } }, 1, 2);
279 auto gammaNode = GammaNode::create(matchNode.output(0), 2);
280 auto gammaInput = gammaNode->AddEntryVar(lambdaNode->GetFunctionArguments()[1]);
281 auto output = TestOperation::createNode(
282 gammaNode->subregion(1),
283 { gammaInput.branchArgument[1] },
286 auto gammaOutput = gammaNode->AddExitVar({ gammaInput.branchArgument[0], output });
288 auto lambdaOutput = lambdaNode->finalize({ gammaOutput.output });
292 view(rvsdgModule.Rvsdg(), stdout);
299 view(rvsdgModule.Rvsdg(), stdout);
305 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2u);
306 EXPECT_FALSE(gammaNode->IsDead());
309 TEST(IfConversionTests, GammaWithMatchAlternativeMismatch)
323 rvsdgModule.Rvsdg().GetRootRegion(),
325 const auto conditionValue = lambdaNode->GetFunctionArguments()[0];
326 const auto trueValue = lambdaNode->GetFunctionArguments()[1];
327 const auto falseValue = lambdaNode->GetFunctionArguments()[2];
331 { { 24, 0 }, { 3, 0 }, { 45, 0 } },
336 auto [inputTrue, branchArgumentTrue] = gammaNode->AddEntryVar(trueValue);
337 auto [inputFalse, branchArgumentFalse] = gammaNode->AddEntryVar(falseValue);
338 auto [_, gammaOutput] = gammaNode->AddExitVar({ branchArgumentTrue[0], branchArgumentFalse[1] });
340 const auto lambdaOutput = lambdaNode->finalize({ gammaOutput });
343 view(rvsdgModule.Rvsdg(), stdout);
350 view(rvsdgModule.Rvsdg(), stdout);
356 EXPECT_EQ(lambdaNode->subregion()->numNodes(), 2u);
357 EXPECT_FALSE(gammaNode->IsDead());
static jlm::util::StatisticsCollector statisticsCollector
TEST(IfConversionTests, GammaWithoutMatch)
If-Conversion Transformation.
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
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 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 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 GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
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)
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)