15TEST(IOStateEliminationTests, testCall)
22 auto memoryStateType = MemoryStateType::Create();
23 auto ioStateType = IOStateType::Create();
24 const auto functionType =
25 FunctionType::Create({ ioStateType, memoryStateType }, { ioStateType, memoryStateType });
28 auto & rvsdg = rvsdgModule.Rvsdg();
32 const auto lambdaNode = LambdaNode::Create(
33 rvsdg.GetRootRegion(),
34 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
36 auto ioStateArgument = lambdaNode->GetFunctionArguments()[0];
37 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[1];
38 const auto functionCv = lambdaNode->AddContextVar(i0);
40 auto & callNode = CallOperation::CreateNode(
43 { ioStateArgument, memoryStateArgument });
45 const auto lambdaOutput = lambdaNode->finalize({ callNode.output(0), callNode.output(1) });
47 GraphExport::Create(*lambdaOutput,
"f");
59 EXPECT_TRUE(callNode.output(0)->IsDead());
60 EXPECT_EQ(lambdaNode->GetFunctionResults()[0]->origin(), ioStateArgument);
63TEST(IOStateEliminationTests, testNesting)
70 auto ioStateType = IOStateType::Create();
71 auto memoryStateType = MemoryStateType::Create();
72 auto controlType = ControlType::Create(2);
73 const auto functionType = FunctionType::Create(
74 { controlType, ioStateType, memoryStateType },
75 { ioStateType, memoryStateType });
78 auto & rvsdg = rvsdgModule.Rvsdg();
80 const auto lambdaNode = LambdaNode::Create(
81 rvsdg.GetRootRegion(),
82 LlvmLambdaOperation::Create(functionType,
"f", Linkage::externalLinkage));
84 auto controlArgument = lambdaNode->GetFunctionArguments()[0];
85 auto ioStateArgument = lambdaNode->GetFunctionArguments()[1];
86 auto memoryStateArgument = lambdaNode->GetFunctionArguments()[2];
88 auto gammaNode = GammaNode::create(controlArgument, 2);
90 auto entryVar = gammaNode->AddEntryVar(ioStateArgument);
92 auto node1 = TestOperation::createNode(
93 gammaNode->subregion(0),
94 { entryVar.branchArgument[0] },
98 TestOperation::createNode(gammaNode->subregion(0), { node1->output(0) }, { ioStateType });
100 auto exitVar = gammaNode->AddExitVar({ node2->output(0), entryVar.branchArgument[1] });
102 const auto lambdaOutput = lambdaNode->finalize({ exitVar.output, memoryStateArgument });
104 GraphExport::Create(*lambdaOutput,
"f");
116 EXPECT_TRUE(node1->output(0)->IsDead());
117 EXPECT_TRUE(node2->output(0)->IsDead());
118 EXPECT_TRUE(exitVar.output->IsDead());
119 EXPECT_EQ(lambdaNode->GetFunctionResults()[0]->origin(), ioStateArgument);
121 EXPECT_EQ(gammaNode->GetEntryVars().size(), 3u);