6 #include <gtest/gtest.h>
13 TEST(GammaTests, test_gamma)
27 auto ev0 = gamma->AddEntryVar(v0);
28 auto ev1 = gamma->AddEntryVar(v1);
29 auto ev2 = gamma->AddEntryVar(v2);
30 gamma->AddExitVar({ ev0.branchArgument[0], ev1.branchArgument[1], ev2.branchArgument[2] });
34 EXPECT_NE(gamma,
nullptr);
41 { matchNode.output(0), v0, v1, v2 });
43 EXPECT_NE(
dynamic_cast<const GammaNode *
>(gamma2),
nullptr);
48 EXPECT_TRUE(gamma3->GetEntryVars().empty());
49 EXPECT_TRUE(gamma3->GetExitVars().empty());
52 TEST(GammaTests, test_predicate_reduction)
67 auto ev0 = gamma->AddEntryVar(v0);
68 auto ev1 = gamma->AddEntryVar(v1);
69 auto ev2 = gamma->AddEntryVar(v2);
70 gamma->AddExitVar({ ev0.branchArgument[0], ev1.branchArgument[1], ev2.branchArgument[2] });
77 auto gammaNode = TryGetOwnerNode<GammaNode>(*r.origin());
82 EXPECT_EQ(r.origin(), v1);
88 TEST(GammaTests, test_invariant_reduction)
100 auto [input, branchArgument] = gammaNode->AddEntryVar(value);
101 gammaNode->AddExitVar(branchArgument);
112 EXPECT_TRUE(success);
113 EXPECT_EQ(ex.origin(), value);
119 TEST(GammaTests, test_control_constant_reduction)
138 auto xv1 = gamma->AddExitVar({ t, f });
139 auto xv2 = gamma->AddExitVar({ n0, n1 });
147 auto gammaNode = TryGetOwnerNode<GammaNode>(*ex1.origin());
153 auto [matchNode, matchOperation] = TryGetSimpleNodeAndOptionalOp<MatchOperation>(*ex1.origin());
154 EXPECT_TRUE(matchNode && matchOperation);
155 EXPECT_EQ(matchOperation->default_alternative(), 0u);
157 EXPECT_EQ(TryGetOwnerNode<Node>(*ex2.origin()), gamma);
161 TEST(GammaTests, test_control_constant_reduction2)
179 auto xv = gamma->AddExitVar({ t1, t2, t3, f });
186 auto gammaNode = TryGetOwnerNode<GammaNode>(*ex.origin());
191 auto match = TryGetOwnerNode<SimpleNode>(*ex.origin());
192 EXPECT_TRUE(is<MatchOperation>(match->GetOperation()));
195 TEST(GammaTests, TestPruneOutputs)
211 auto gammaInput0 = gammaNode->AddEntryVar(v0);
212 auto gammaInput1 = gammaNode->AddEntryVar(v1);
213 auto gammaInput2 = gammaNode->AddEntryVar(v2);
214 auto gammaInput3 = gammaNode->AddEntryVar(v3);
216 auto gammaOutput0 = gammaNode->AddExitVar(gammaInput0.branchArgument);
217 gammaNode->AddExitVar(gammaInput1.branchArgument);
218 auto gammaOutput2 = gammaNode->AddExitVar(gammaInput2.branchArgument);
219 gammaNode->AddExitVar(gammaInput3.branchArgument);
225 gammaNode->PruneExitVars();
228 EXPECT_EQ(gammaNode->noutputs(), 2u);
229 EXPECT_EQ(gammaNode->subregion(0)->nresults(), 2u);
230 EXPECT_EQ(gammaNode->subregion(1)->nresults(), 2u);
232 EXPECT_EQ(gammaOutput0.output->index(), 0u);
233 EXPECT_EQ(gammaNode->GetExitVars()[0].output, gammaOutput0.output);
235 EXPECT_EQ(gammaOutput2.output->index(), 1u);
236 EXPECT_EQ(gammaNode->GetExitVars()[1].output, gammaOutput2.output);
239 TEST(GammaTests, TestIsInvariant)
253 auto gammaInput0 = gammaNode->AddEntryVar(v0);
254 auto gammaInput1 = gammaNode->AddEntryVar(v1);
255 auto gammaInput2 = gammaNode->AddEntryVar(v1);
257 auto gammaOutput0 = gammaNode->AddExitVar(gammaInput0.branchArgument);
259 gammaNode->AddExitVar({ gammaInput1.branchArgument[0], gammaInput2.branchArgument[1] });
261 gammaNode->AddExitVar({ gammaInput0.branchArgument[0], gammaInput2.branchArgument[1] });
264 std::optional<jlm::rvsdg::Output *> invariantOrigin;
266 EXPECT_NE(invariantOrigin,
nullptr);
267 EXPECT_EQ(*invariantOrigin, v0);
270 EXPECT_NE(invariantOrigin,
nullptr);
271 EXPECT_EQ(*invariantOrigin, v1);
274 EXPECT_EQ(invariantOrigin, std::nullopt);
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
static Output & createTrue(Region ®ion)
static Output & create(Region ®ion, ControlValueRepresentation value)
static Output & createFalse(Region ®ion)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
Conditional operator / pattern matching.
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
static GraphExport & Create(Output &origin, std::string name)
static GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Region & GetRootRegion() const noexcept
static Node & CreateNode(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
size_t numNodes() const noexcept
static std::shared_ptr< const TestType > createValueType()
TEST(GammaConversionTests, TestWithMatch)
bool ReduceGammaControlConstant(Node &node)
bool ReduceGammaWithStaticallyKnownPredicate(Node &node)
std::string view(const rvsdg::Region *region)
std::optional< rvsdg::Output * > GetGammaInvariantOrigin(const GammaNode &gamma, const GammaNode::ExitVar &exitvar)
Determines whether a gamma exit var is path-invariant.
bool ReduceGammaInvariantVariables(Node &node)