6 #include <gtest/gtest.h>
13 TEST(LambdaTests, TestArgumentIterators)
27 lambda->finalize({ lambda->GetFunctionArguments()[0] });
29 std::vector<const jlm::rvsdg::Output *> functionArguments;
30 for (
auto argument : lambda->GetFunctionArguments())
31 functionArguments.push_back(argument);
33 EXPECT_EQ(functionArguments.size(), 1u);
34 EXPECT_EQ(functionArguments[0], lambda->GetFunctionArguments()[0]);
44 auto nullaryNode = TestOperation::createNode(lambda->subregion(), {}, { vt })->output(0);
46 lambda->finalize({ nullaryNode });
48 EXPECT_TRUE(lambda->GetFunctionArguments().empty());
60 auto cv = lambda->AddContextVar(*rvsdgImport).inner;
62 lambda->finalize({ lambda->GetFunctionArguments()[0], cv });
64 std::vector<const jlm::rvsdg::Output *> functionArguments;
65 for (
auto argument : lambda->GetFunctionArguments())
66 functionArguments.push_back(argument);
68 EXPECT_EQ(functionArguments.size(), 3u);
69 EXPECT_EQ(functionArguments[0], lambda->GetFunctionArguments()[0]);
70 EXPECT_EQ(functionArguments[1], lambda->GetFunctionArguments()[1]);
71 EXPECT_EQ(functionArguments[2], lambda->GetFunctionArguments()[2]);
75 TEST(LambdaTests, TestInvalidOperandRegion)
84 auto rvsdg = &rvsdgModule->Rvsdg();
87 rvsdg->GetRootRegion(),
89 auto result = TestOperation::createNode(&rvsdg->GetRootRegion(), {}, { vt })->output(0);
97 TEST(LambdaTests, TestRemoveLambdaInputsWhere)
103 auto valueType = TestType::createValueType();
107 auto & rvsdg = rvsdgModule->Rvsdg();
112 rvsdg.GetRootRegion(),
115 auto lambdaBinder0 = lambdaNode->AddContextVar(*x);
116 auto lambdaBinder1 = lambdaNode->AddContextVar(*x);
117 lambdaNode->AddContextVar(*x);
119 auto result = jlm::rvsdg::CreateOpNode<TestOperation>(
120 { lambdaBinder1.inner },
121 std::vector<std::shared_ptr<const Type>>{ valueType },
122 std::vector<std::shared_ptr<const Type>>{ valueType })
125 lambdaNode->finalize({ result });
129 auto numRemovedInputs = lambdaNode->RemoveLambdaInputsWhere(
132 return input.
index() == lambdaBinder1.input->index();
134 EXPECT_EQ(numRemovedInputs, 0u);
135 EXPECT_EQ(lambdaNode->ninputs(), 3u);
136 EXPECT_EQ(lambdaNode->GetContextVars().size(), 3u);
139 numRemovedInputs = lambdaNode->RemoveLambdaInputsWhere(
142 return input.
index() == 2;
144 EXPECT_EQ(numRemovedInputs, 1u);
145 EXPECT_EQ(lambdaNode->ninputs(), 2u);
146 EXPECT_EQ(lambdaNode->GetContextVars().size(), 2u);
147 EXPECT_EQ(lambdaNode->input(0), lambdaBinder0.input);
148 EXPECT_EQ(lambdaNode->input(1), lambdaBinder1.input);
151 numRemovedInputs = lambdaNode->RemoveLambdaInputsWhere(
154 return input.
index() == 0;
156 EXPECT_EQ(numRemovedInputs, 1u);
157 EXPECT_EQ(lambdaNode->ninputs(), 1u);
158 EXPECT_EQ(lambdaNode->GetContextVars().size(), 1u);
159 EXPECT_EQ(lambdaNode->input(0), lambdaBinder1.input);
160 EXPECT_EQ(lambdaBinder1.input->index(), 0u);
161 EXPECT_EQ(lambdaBinder1.inner->index(), 0u);
167 TEST(LambdaTests, TestPruneLambdaInputs)
173 auto valueType = TestType::createValueType();
177 auto & rvsdg = rvsdgModule->Rvsdg();
182 rvsdg.GetRootRegion(),
185 lambdaNode->AddContextVar(*x);
186 auto lambdaInput1 = lambdaNode->AddContextVar(*x);
187 lambdaNode->AddContextVar(*x);
189 auto result = jlm::rvsdg::CreateOpNode<TestOperation>(
190 { lambdaInput1.inner },
191 std::vector<std::shared_ptr<const Type>>{ valueType },
192 std::vector<std::shared_ptr<const Type>>{ valueType })
195 lambdaNode->finalize({ result });
198 auto numRemovedInputs = lambdaNode->PruneLambdaInputs();
201 EXPECT_EQ(numRemovedInputs, 2u);
202 EXPECT_EQ(lambdaNode->ninputs(), 1u);
203 EXPECT_EQ(lambdaNode->GetContextVars().size(), 1u);
204 EXPECT_EQ(lambdaNode->input(0), lambdaInput1.input);
205 EXPECT_EQ(lambdaNode->GetContextVars()[0].inner, lambdaInput1.inner);
206 EXPECT_EQ(lambdaInput1.input->index(), 0u);
207 EXPECT_EQ(lambdaInput1.inner->index(), 0u);
TEST(LambdaTests, TestArgumentIterators)
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::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
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 GraphImport & Create(Graph &graph, std::shared_ptr< const rvsdg::Type > type, std::string name)
Region & GetRootRegion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
static std::shared_ptr< const TestType > createValueType()
Global memory state passed between functions.