Jlm
PhiTests.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2012 2013 2014 2015 2016 Nico Reißmann <nico.reissmann@gmail.com>
3  * Copyright 2012 2013 2014 Helge Bahmann <hcb@chaoticmind.net>
4  * See COPYING for terms of redistribution.
5  */
6 
7 #include <gtest/gtest.h>
8 
11 #include <jlm/rvsdg/TestType.hpp>
12 #include <jlm/rvsdg/view.hpp>
13 
14 TEST(PhiTests, TestPhiCreation)
15 {
16  using namespace jlm::llvm;
17 
18  jlm::rvsdg::Graph graph;
19 
21  auto iOStateType = IOStateType::Create();
22  auto memoryStateType = MemoryStateType::Create();
29 
30  auto SetupEmptyLambda = [&](jlm::rvsdg::Region * region, const std::string & name)
31  {
32  auto lambda = jlm::rvsdg::LambdaNode::Create(
33  *region,
35  auto iOStateArgument = lambda->GetFunctionArguments()[1];
36  auto memoryStateArgument = lambda->GetFunctionArguments()[2];
37 
38  return lambda->finalize({ iOStateArgument, memoryStateArgument });
39  };
40 
41  auto SetupF2 = [&](jlm::rvsdg::Region * region, jlm::rvsdg::Output * f2)
42  {
43  auto lambda = jlm::rvsdg::LambdaNode::Create(
44  *region,
46  auto ctxVarF2 = lambda->AddContextVar(*f2).inner;
47  auto valueArgument = lambda->GetFunctionArguments()[0];
48  auto iOStateArgument = lambda->GetFunctionArguments()[1];
49  auto memoryStateArgument = lambda->GetFunctionArguments()[2];
50 
51  auto callResults = CallOperation::Create(
52  ctxVarF2,
53  f1type,
54  { valueArgument, iOStateArgument, memoryStateArgument });
55 
56  return lambda->finalize(callResults);
57  };
58 
60  pb.begin(&graph.GetRootRegion());
61  auto rv1 = pb.AddFixVar(f0type);
62  auto rv2 = pb.AddFixVar(f0type);
63  auto rv3 = pb.AddFixVar(f1type);
64 
65  auto lambdaOutput0 = SetupEmptyLambda(pb.subregion(), "f0");
66  auto lambdaOutput1 = SetupEmptyLambda(pb.subregion(), "f1");
67  auto lambdaOutput2 = SetupF2(pb.subregion(), rv3.recref);
68 
69  rv1.result->divert_to(lambdaOutput0);
70  rv2.result->divert_to(lambdaOutput1);
71  rv3.result->divert_to(lambdaOutput2);
72 
73  auto phi = pb.end();
74  jlm::rvsdg::GraphExport::Create(*phi->output(0), "dummy");
75 
76  graph.PruneNodes();
77 
78  view(&graph.GetRootRegion(), stderr);
79 }
TEST(PhiTests, TestPhiCreation)
Definition: PhiTests.cpp:14
static std::vector< rvsdg::Output * > Create(rvsdg::Output *function, std::shared_ptr< const rvsdg::FunctionType > functionType, const std::vector< rvsdg::Output * > &arguments)
Definition: call.hpp:464
static std::shared_ptr< const IOStateType > Create()
Definition: types.cpp:343
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)
Definition: lambda.hpp:84
static std::shared_ptr< const MemoryStateType > Create()
Definition: types.cpp:379
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 GraphExport & Create(Output &origin, std::string name)
Definition: graph.cpp:62
void PruneNodes()
Definition: graph.hpp:116
Region & GetRootRegion() const noexcept
Definition: graph.hpp:99
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition: lambda.cpp:140
rvsdg::Region * subregion() const noexcept
Definition: Phi.hpp:349
PhiNode * end()
Definition: Phi.cpp:270
PhiNode::FixVar AddFixVar(std::shared_ptr< const jlm::rvsdg::Type > type)
Definition: Phi.cpp:257
void begin(rvsdg::Region *parent)
Definition: Phi.hpp:355
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
static std::shared_ptr< const TestType > createValueType()
Definition: TestType.cpp:67
Global memory state passed between functions.
std::string view(const rvsdg::Region *region)
Definition: view.cpp:142