18TEST(MemoryStateOperationTests, MemoryStateSplitEquality)
24 auto memoryStateType = MemoryStateType::Create();
27 TestOperation operation3({ memoryStateType }, { memoryStateType, memoryStateType });
30 EXPECT_EQ(operation1, operation1);
31 EXPECT_NE(operation1, operation2);
32 EXPECT_NE(operation1, operation3);
64TEST(MemoryStateOperationTests, MemoryStateSplitNormalizeNestedSplits)
70 const auto memoryStateType = MemoryStateType::Create();
74 auto & splitNode0 = MemoryStateSplitOperation::CreateNode(ix, 3);
75 auto & splitNode1 = MemoryStateSplitOperation::CreateNode(*splitNode0.output(0), 2);
76 auto & splitNode2 = MemoryStateSplitOperation::CreateNode(*splitNode0.output(2), 2);
88 MemoryStateSplitOperation::NormalizeNestedSplits,
91 MemoryStateSplitOperation::NormalizeNestedSplits,
99 auto [splitNode, splitOperation] =
100 TryGetSimpleNodeAndOptionalOp<MemoryStateSplitOperation>(*ex0.origin());
101 EXPECT_TRUE(splitNode && splitOperation);
109 EXPECT_EQ(splitNode->noutputs(), 7u);
110 EXPECT_EQ(TryGetOwnerNode<SimpleNode>(*ex0.origin()), splitNode);
111 EXPECT_EQ(TryGetOwnerNode<SimpleNode>(*ex1.origin()), splitNode);
112 EXPECT_EQ(TryGetOwnerNode<SimpleNode>(*ex2.origin()), splitNode);
113 EXPECT_EQ(TryGetOwnerNode<SimpleNode>(*ex3.origin()), splitNode);
114 EXPECT_EQ(TryGetOwnerNode<SimpleNode>(*ex4.origin()), splitNode);
117TEST(MemoryStateOperationTests, MemoryStateSplitNormalizeSplitMerge)
123 const auto memoryStateType = MemoryStateType::Create();
129 auto mergeResult = MemoryStateMergeOperation::Create({ &ix0, &ix1, &ix2 });
130 auto & splitNode = MemoryStateSplitOperation::CreateNode(*mergeResult, 3);
140 MemoryStateSplitOperation::NormalizeSplitMerge,
147 EXPECT_EQ(ex0.origin(), &ix0);
148 EXPECT_EQ(ex1.origin(), &ix1);
149 EXPECT_EQ(ex2.origin(), &ix2);
152TEST(MemoryStateOperationTests, MemoryStateMergeEquality)
158 auto memoryStateType = MemoryStateType::Create();
161 TestOperation operation3({ memoryStateType, memoryStateType }, { memoryStateType });
164 EXPECT_EQ(operation1, operation1);
165 EXPECT_NE(operation1, operation2);
166 EXPECT_NE(operation1, operation3);
169TEST(MemoryStateOperationTests, MemoryStateMergeNormalizeSingleOperand)
175 const auto memoryStateType = MemoryStateType::Create();
180 auto & mergeNode = MemoryStateMergeOperation::CreateNode({ &ix });
187 ReduceNode<MemoryStateMergeOperation>(
188 MemoryStateMergeOperation::NormalizeSingleOperand,
195 EXPECT_EQ(ex.origin(), &ix);
198TEST(MemoryStateOperationTests, MemoryStateMergeNormalizeDuplicateOperands)
204 const auto memoryStateType = MemoryStateType::Create();
210 auto & node = MemoryStateMergeOperation::CreateNode({ &ix0, &ix0, &ix1, &ix1 });
217 ReduceNode<MemoryStateMergeOperation>(
218 MemoryStateMergeOperation::NormalizeDuplicateOperands,
225 auto [mergeNode, mergeOperation] =
226 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(*ex.origin());
227 EXPECT_TRUE(mergeNode && mergeOperation);
229 EXPECT_EQ(mergeNode->ninputs(), 2u);
232TEST(MemoryStateOperationTests, MemoryStateMergeNormalizeNestedMerges)
238 const auto memoryStateType = MemoryStateType::Create();
247 auto & mergeNode0 = MemoryStateMergeOperation::CreateNode({ &ix0, &ix1 });
248 auto & mergeNode1 = MemoryStateMergeOperation::CreateNode({ &ix2, &ix3 });
250 MemoryStateMergeOperation::CreateNode({ mergeNode0.output(0), mergeNode1.output(0), &ix4 });
257 ReduceNode<MemoryStateMergeOperation>(
258 MemoryStateMergeOperation::NormalizeNestedMerges,
265 auto [mergeNode, mergeOperation] =
266 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(*ex.origin());
267 EXPECT_TRUE(mergeNode && mergeOperation);
269 EXPECT_EQ(mergeNode->ninputs(), 5u);
272TEST(MemoryStateOperationTests, MemoryStateMergeNormalizeNestedSplits)
278 const auto memoryStateType = MemoryStateType::Create();
285 auto & splitNode0 = MemoryStateSplitOperation::CreateNode(ix0, 2);
286 auto & splitNode1 = MemoryStateSplitOperation::CreateNode(ix1, 2);
287 auto & mergeNode = MemoryStateMergeOperation::CreateNode({ splitNode0.output(0),
288 splitNode0.output(1),
289 splitNode1.output(0),
290 splitNode1.output(1),
298 ReduceNode<MemoryStateMergeOperation>(MemoryStateMergeOperation::NormalizeMergeSplit, mergeNode);
304 auto [node, mergeOperation] =
305 TryGetSimpleNodeAndOptionalOp<MemoryStateMergeOperation>(*ex.origin());
306 EXPECT_TRUE(node && mergeOperation);
308 EXPECT_EQ(node->ninputs(), 5u);
309 EXPECT_EQ(node->input(0)->origin(), &ix0);
310 EXPECT_EQ(node->input(1)->origin(), &ix0);
311 EXPECT_EQ(node->input(2)->origin(), &ix1);
312 EXPECT_EQ(node->input(3)->origin(), &ix1);
313 EXPECT_EQ(node->input(4)->origin(), &ix2);
316TEST(MemoryStateOperationTests, MemoryStateJoin_NormalizeSingleOperand)
322 const auto memoryStateType = MemoryStateType::Create();
327 auto & mergeNode = MemoryStateJoinOperation::CreateNode({ &ix });
329 auto & ex = GraphExport::Create(*mergeNode.output(0),
"x");
334 ReduceNode<MemoryStateJoinOperation>(MemoryStateJoinOperation::NormalizeSingleOperand, mergeNode);
340 EXPECT_EQ(ex.origin(), &ix);
343TEST(MemoryStateOperationTests, MemoryStateJoin_NormalizeDuplicateOperands)
349 const auto memoryStateType = MemoryStateType::Create();
355 auto & node0 = MemoryStateJoinOperation::CreateNode({ &i0, &i0, &i1, &i1 });
356 auto & node1 = MemoryStateJoinOperation::CreateNode({ &i0, &i0, &i0, &i0 });
358 auto & x0 = GraphExport::Create(*node0.output(0),
"x0");
359 auto & x1 = GraphExport::Create(*node1.output(0),
"x1");
364 ReduceNode<MemoryStateJoinOperation>(MemoryStateJoinOperation::NormalizeDuplicateOperands, node0);
365 ReduceNode<MemoryStateJoinOperation>(MemoryStateJoinOperation::NormalizeDuplicateOperands, node1);
373 auto [joinNode, joinOperation] =
374 TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(*x0.origin());
375 EXPECT_TRUE(joinNode && joinOperation);
377 EXPECT_EQ(joinNode->ninputs(), 2u);
378 EXPECT_EQ(joinNode->input(0)->origin(), &i0);
379 EXPECT_EQ(joinNode->input(1)->origin(), &i1);
383 EXPECT_EQ(x1.origin(), &i0);
387TEST(MemoryStateOperationTests, MemoryStateJoin_NormalizeNestedJoins)
393 const auto memoryStateType = MemoryStateType::Create();
403 auto & joinNode0 = MemoryStateJoinOperation::CreateNode({ &ix0, &ix1 });
404 auto & joinNode1 = MemoryStateJoinOperation::CreateNode({ joinNode0.output(0), &ix2 });
405 auto & joinNode2 = MemoryStateJoinOperation::CreateNode({ &ix3, &ix4 });
407 MemoryStateJoinOperation::CreateNode({ joinNode1.output(0), joinNode2.output(0), &ix5 });
409 auto & ex = GraphExport::Create(*joinNode3.output(0),
"x");
414 ReduceNode<MemoryStateJoinOperation>(MemoryStateJoinOperation::NormalizeNestedJoins, joinNode3);
420 auto [joinNode, joinOperation] =
421 TryGetSimpleNodeAndOptionalOp<MemoryStateJoinOperation>(*ex.origin());
422 EXPECT_TRUE(joinNode && joinOperation);
424 EXPECT_EQ(joinNode->ninputs(), 6u);
425 EXPECT_EQ(joinNode->input(0)->origin(), &ix0);
426 EXPECT_EQ(joinNode->input(1)->origin(), &ix1);
427 EXPECT_EQ(joinNode->input(2)->origin(), &ix2);
428 EXPECT_EQ(joinNode->input(3)->origin(), &ix3);
429 EXPECT_EQ(joinNode->input(4)->origin(), &ix4);
430 EXPECT_EQ(joinNode->input(5)->origin(), &ix5);
433TEST(MemoryStateOperationTests, LambdaEntryMemStateOperatorEquality)
439 auto memoryStateType = MemoryStateType::Create();
443 const TestOperation operation4({ memoryStateType }, { memoryStateType, memoryStateType });
446 EXPECT_EQ(operation1, operation1);
447 EXPECT_NE(operation1, operation2);
448 EXPECT_NE(operation1, operation3);
449 EXPECT_NE(operation1, operation4);
452TEST(MemoryStateOperationTests, LambdaExitMemStateOperatorEquality)
458 auto memoryStateType = MemoryStateType::Create();
462 TestOperation operation4({ memoryStateType, memoryStateType }, { memoryStateType });
465 EXPECT_EQ(operation1, operation1);
466 EXPECT_NE(operation1, operation2);
467 EXPECT_NE(operation1, operation3);
468 EXPECT_NE(operation1, operation3);
471TEST(MemoryStateOperationTests, LambdaExitMemoryStateMergeNormalizeLoad)
477 const auto bit32Type = BitType::Create(32);
478 const auto memoryStateType = MemoryStateType::Create();
479 const auto valueType = TestType::createValueType();
486 auto allocaResults = AllocaOperation::create(valueType, &size, 4);
488 LoadNonVolatileOperation::CreateNode(*allocaResults[0], { allocaResults[1] }, valueType, 4);
490 auto & lambdaExitMergeNode1 = LambdaExitMemoryStateMergeOperation::CreateNode(
492 { loadNode.output(1), &memState1 },
495 auto & lambdaExitMergeNode2 = LambdaExitMemoryStateMergeOperation::CreateNode(
497 { &memState2, &memState1 },
500 auto & x = GraphExport::Create(*lambdaExitMergeNode1.output(0),
"x");
501 auto & y = GraphExport::Create(*lambdaExitMergeNode2.output(0),
"y");
502 GraphExport::Create(*loadNode.output(0),
"z");
508 LambdaExitMemoryStateMergeOperation::NormalizeLoadFromAlloca,
509 *jlm::util::assertedCast<SimpleNode>(&lambdaExitMergeNode1));
515 EXPECT_TRUE(success);
519 const auto [memStateMerge1Node, memStateMerge1Operation] =
520 TryGetSimpleNodeAndOptionalOp<LambdaExitMemoryStateMergeOperation>(*x.origin());
521 EXPECT_NE(memStateMerge1Node, &lambdaExitMergeNode1);
522 EXPECT_EQ(memStateMerge1Node->ninputs(), 2u);
523 EXPECT_EQ(memStateMerge1Node->input(0)->origin(), allocaResults[1]);
524 EXPECT_EQ(memStateMerge1Node->input(1)->origin(), &memState1);
525 EXPECT_EQ(memStateMerge1Operation->getMemoryNodeIds(), std::vector<MemoryNodeId>({ 1, 2 }));
528 const auto memStateMerge2Node = TryGetOwnerNode<Node>(*y.origin());
529 EXPECT_EQ(memStateMerge2Node, &lambdaExitMergeNode2);
532TEST(MemoryStateOperationTests, LambdaExitMemoryStateMergeNormalizeStore)
538 const auto bit32Type = BitType::Create(32);
539 const auto memoryStateType = MemoryStateType::Create();
540 const auto valueType = TestType::createValueType();
547 auto allocaResults = AllocaOperation::create(valueType, &size, 4);
549 StoreNonVolatileOperation::CreateNode(*allocaResults[0], size, { allocaResults[1] }, 4);
551 auto & lambdaExitMergeNode1 = LambdaExitMemoryStateMergeOperation::CreateNode(
553 { storeNode.output(0), &memState1 },
556 auto & lambdaExitMergeNode2 = LambdaExitMemoryStateMergeOperation::CreateNode(
558 { &memState2, &memState1 },
561 auto & x = GraphExport::Create(*lambdaExitMergeNode1.output(0),
"x");
562 auto & y = GraphExport::Create(*lambdaExitMergeNode2.output(0),
"y");
568 LambdaExitMemoryStateMergeOperation::NormalizeStoreToAlloca,
569 *jlm::util::assertedCast<SimpleNode>(&lambdaExitMergeNode1));
575 EXPECT_TRUE(success);
579 const auto [memStateMerge1Node, memStateMerge1Operation] =
580 TryGetSimpleNodeAndOptionalOp<LambdaExitMemoryStateMergeOperation>(*x.origin());
581 EXPECT_NE(memStateMerge1Node, &lambdaExitMergeNode1);
582 EXPECT_EQ(memStateMerge1Node->ninputs(), 2u);
583 EXPECT_EQ(memStateMerge1Node->input(0)->origin(), allocaResults[1]);
584 EXPECT_EQ(memStateMerge1Node->input(1)->origin(), &memState1);
585 EXPECT_EQ(memStateMerge1Operation->getMemoryNodeIds(), std::vector<MemoryNodeId>({ 1, 2 }));
588 const auto memStateMerge2Node = TryGetOwnerNode<Node>(*y.origin());
589 EXPECT_EQ(memStateMerge2Node, &lambdaExitMergeNode2);
592TEST(MemoryStateOperationTests, LambdaExitMemoryStateMergeNormalizeAlloca)
598 const auto bit32Type = BitType::Create(32);
599 const auto memoryStateType = MemoryStateType::Create();
600 const auto valueType = TestType::createValueType();
607 auto allocaResults = AllocaOperation::create(valueType, &size, 4);
609 auto & lambdaExitMergeNode1 = LambdaExitMemoryStateMergeOperation::CreateNode(
611 { allocaResults[1], &memState1 },
614 auto & lambdaExitMergeNode2 = LambdaExitMemoryStateMergeOperation::CreateNode(
616 { &memState2, &memState1 },
619 auto & x = GraphExport::Create(*lambdaExitMergeNode1.output(0),
"x");
620 auto & y = GraphExport::Create(*lambdaExitMergeNode2.output(0),
"y");
626 LambdaExitMemoryStateMergeOperation::NormalizeAlloca,
627 *jlm::util::assertedCast<SimpleNode>(&lambdaExitMergeNode1));
633 EXPECT_TRUE(success);
637 const auto [memStateMerge1Node, memStateMerge1Operation] =
638 TryGetSimpleNodeAndOptionalOp<LambdaExitMemoryStateMergeOperation>(*x.origin());
639 EXPECT_NE(memStateMerge1Node, &lambdaExitMergeNode1);
640 EXPECT_EQ(memStateMerge1Node->ninputs(), 2u);
641 EXPECT_EQ(memStateMerge1Operation->getMemoryNodeIds(), std::vector<MemoryNodeId>({ 1, 2 }));
642 const auto undefNode = TryGetOwnerNode<Node>(*memStateMerge1Node->input(0)->origin());
643 EXPECT_NE(undefNode,
nullptr);
644 EXPECT_EQ(memStateMerge1Node->input(1)->origin(), &memState1);
647 const auto memStateMerge2Node = TryGetOwnerNode<Node>(*y.origin());
648 EXPECT_EQ(memStateMerge2Node, &lambdaExitMergeNode2);
651TEST(MemoryStateOperationTests, CallEntryMemStateOperatorEquality)
657 auto memoryStateType = MemoryStateType::Create();
661 TestOperation operation4({ memoryStateType, memoryStateType }, { memoryStateType });
664 EXPECT_EQ(operation1, operation1);
665 EXPECT_NE(operation1, operation2);
666 EXPECT_NE(operation1, operation3);
667 EXPECT_NE(operation1, operation3);
670TEST(MemoryStateOperationTests, CallExitMemStateOperatorEquality)
676 auto memoryStateType = MemoryStateType::Create();
680 const TestOperation operation4({ memoryStateType }, { memoryStateType, memoryStateType });
683 EXPECT_EQ(operation1, operation1);
684 EXPECT_NE(operation1, operation2);
685 EXPECT_NE(operation1, operation3);
686 EXPECT_NE(operation1, operation4);