14TEST(SimpleOperationTests, NormalizeSimpleOperationCne_NodesWithoutOperands)
20 const auto valueType = TestType::createValueType();
21 const auto stateType = TestType::createStateType();
23 auto & nullaryValueNode1 = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), valueType);
24 auto & nullaryValueNode2 = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), valueType);
25 auto & nullaryStateNode1 = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), stateType);
26 auto & nullaryStateNode2 = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), stateType);
28 auto & exNullaryValueNode1 = GraphExport::Create(*nullaryValueNode1.output(0),
"nvn1");
29 auto & exNullaryValueNode2 = GraphExport::Create(*nullaryValueNode2.output(0),
"nvn2");
30 auto & exNullaryStateNode1 = GraphExport::Create(*nullaryStateNode1.output(0),
"nsn1");
31 auto & exNullaryStateNode2 = GraphExport::Create(*nullaryStateNode2.output(0),
"nsn2");
36 auto NormalizeCne = [&](
const SimpleOperation & operation,
const std::vector<Output *> & operands)
38 return NormalizeSimpleOperationCommonNodeElimination(
45 ReduceNode<SimpleOperation>(
47 *TryGetOwnerNode<SimpleNode>(*exNullaryValueNode1.origin()));
48 ReduceNode<SimpleOperation>(
50 *TryGetOwnerNode<SimpleNode>(*exNullaryValueNode2.origin()));
51 ReduceNode<SimpleOperation>(
53 *TryGetOwnerNode<SimpleNode>(*exNullaryStateNode1.origin()));
54 ReduceNode<SimpleOperation>(
56 *TryGetOwnerNode<SimpleNode>(*exNullaryStateNode2.origin()));
62 EXPECT_EQ(exNullaryValueNode1.origin(), exNullaryValueNode2.origin());
63 EXPECT_EQ(exNullaryStateNode1.origin(), exNullaryStateNode2.origin());
64 EXPECT_NE(exNullaryValueNode1.origin(), exNullaryStateNode2.origin());
67TEST(SimpleOperationTests, NormalizeSimpleOperationCne_NodesWithOperands)
73 const auto valueType = TestType::createValueType();
74 const auto stateType = TestType::createStateType();
76 auto v1 = &GraphImport::Create(graph, valueType,
"v1");
77 auto s1 = &GraphImport::Create(graph, stateType,
"s1");
79 auto & valueNode1 = CreateOpNode<TestUnaryOperation>({ v1 }, valueType, valueType);
80 auto & valueNode2 = CreateOpNode<TestUnaryOperation>({ v1 }, valueType, valueType);
81 auto & stateNode1 = CreateOpNode<TestUnaryOperation>({ s1 }, stateType, stateType);
82 auto & stateNode2 = CreateOpNode<TestUnaryOperation>({ s1 }, stateType, stateType);
84 auto & exValueNode1 = GraphExport::Create(*valueNode1.output(0),
"nvn1");
85 auto & exValueNode2 = GraphExport::Create(*valueNode2.output(0),
"nvn2");
86 auto & exStateNode1 = GraphExport::Create(*stateNode1.output(0),
"nsn1");
87 auto & exStateNode2 = GraphExport::Create(*stateNode2.output(0),
"nsn2");
92 auto NormalizeCne = [&](
const SimpleOperation & operation,
const std::vector<Output *> & operands)
94 return NormalizeSimpleOperationCommonNodeElimination(
101 ReduceNode<SimpleOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*exValueNode1.origin()));
102 ReduceNode<SimpleOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*exValueNode2.origin()));
103 ReduceNode<SimpleOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*exStateNode1.origin()));
104 ReduceNode<SimpleOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*exStateNode2.origin()));
110 EXPECT_EQ(exValueNode1.origin(), exValueNode2.origin());
111 EXPECT_EQ(exStateNode1.origin(), exStateNode2.origin());
112 EXPECT_NE(exValueNode1.origin(), exStateNode2.origin());
115TEST(SimpleOperationTests, NormalizeSimpleOperationCne_Mixed)
123 [&](
const SimpleOperation & operation,
const std::vector<jlm::rvsdg::Output *> & operands)
125 return NormalizeSimpleOperationCommonNodeElimination(
131 auto valueType = TestType::createValueType();
135 auto o1 = TestOperation::createNode(&graph.
GetRootRegion(), {}, { valueType })->output(0);
136 auto o2 = TestOperation::createNode(&graph.
GetRootRegion(), { i }, { valueType })->output(0);
137 auto o3 = TestOperation::createNode(&graph.
GetRootRegion(), {}, { valueType })->output(0);
138 auto o4 = TestOperation::createNode(&graph.
GetRootRegion(), { i }, { valueType })->output(0);
140 auto & e1 = GraphExport::Create(*o1,
"o1");
141 auto & e2 = GraphExport::Create(*o2,
"o2");
142 auto & e3 = GraphExport::Create(*o3,
"o3");
143 auto & e4 = GraphExport::Create(*o4,
"o4");
146 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e1.origin()));
147 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e2.origin()));
148 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e3.origin()));
149 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e4.origin()));
151 EXPECT_EQ(e1.origin(), e3.origin());
152 EXPECT_EQ(e2.origin(), e4.origin());
154 auto o5 = TestOperation::createNode(&graph.
GetRootRegion(), {}, { valueType })->output(0);
155 auto & e5 = GraphExport::Create(*o5,
"o5");
156 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e5.origin()));
157 EXPECT_EQ(e5.origin(), e1.origin());
159 auto o6 = TestOperation::createNode(&graph.
GetRootRegion(), { i }, { valueType })->output(0);
160 auto & e6 = GraphExport::Create(*o6,
"o6");
161 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e6.origin()));
162 EXPECT_EQ(e6.origin(), e2.origin());
164 auto o7 = TestOperation::createNode(&graph.
GetRootRegion(), {}, { valueType })->output(0);
165 auto & e7 = GraphExport::Create(*o7,
"o7");
166 EXPECT_NE(e7.origin(), e1.origin());
168 ReduceNode<TestOperation>(NormalizeCne, *TryGetOwnerNode<SimpleNode>(*e7.origin()));
169 EXPECT_EQ(e7.origin(), e1.origin());
172TEST(SimpleOperationTests, NormalizeSimpleOperationCne_Failure)
178 const auto valueType = TestType::createValueType();
179 const auto stateType = TestType::createStateType();
181 auto v1 = &GraphImport::Create(graph, valueType,
"v1");
182 auto s1 = &GraphImport::Create(graph, stateType,
"s1");
184 auto & nullaryValueNode = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), valueType);
185 auto & nullaryStateNode = CreateOpNode<TestNullaryOperation>(graph.
GetRootRegion(), stateType);
186 auto & unaryValueNode = CreateOpNode<TestUnaryOperation>({ v1 }, valueType, valueType);
187 auto & unaryStateNode = CreateOpNode<TestUnaryOperation>({ s1 }, stateType, stateType);
189 auto & exNullaryValueNode = GraphExport::Create(*nullaryValueNode.output(0),
"nvn1");
190 auto & exNullaryStateNode = GraphExport::Create(*nullaryStateNode.output(0),
"nvn2");
191 auto & exUnaryValueNode = GraphExport::Create(*unaryValueNode.output(0),
"nsn1");
192 auto & exUnaryStateNode = GraphExport::Create(*unaryStateNode.output(0),
"nsn2");
197 auto NormalizeCne = [&](
const SimpleOperation & operation,
const std::vector<Output *> & operands)
199 return NormalizeSimpleOperationCommonNodeElimination(
206 ReduceNode<SimpleOperation>(
208 *TryGetOwnerNode<SimpleNode>(*exNullaryValueNode.origin()));
209 ReduceNode<SimpleOperation>(
211 *TryGetOwnerNode<SimpleNode>(*exNullaryStateNode.origin()));
212 ReduceNode<SimpleOperation>(
214 *TryGetOwnerNode<SimpleNode>(*exUnaryValueNode.origin()));
215 ReduceNode<SimpleOperation>(
217 *TryGetOwnerNode<SimpleNode>(*exUnaryStateNode.origin()));
223 EXPECT_EQ(TryGetOwnerNode<Node>(*exNullaryValueNode.origin()), &nullaryValueNode);
224 EXPECT_EQ(TryGetOwnerNode<Node>(*exNullaryStateNode.origin()), &nullaryStateNode);
225 EXPECT_EQ(TryGetOwnerNode<Node>(*exUnaryValueNode.origin()), &unaryValueNode);
226 EXPECT_EQ(TryGetOwnerNode<Node>(*exUnaryStateNode.origin()), &unaryStateNode);