Jlm
Loading...
Searching...
No Matches
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
12#include <jlm/rvsdg/view.hpp>
13
14TEST(PhiTests, TestPhiCreation)
15{
16 using namespace jlm::llvm;
17
19
21 auto iOStateType = IOStateType::Create();
22 auto memoryStateType = MemoryStateType::Create();
24 { vtype, IOStateType::Create(), MemoryStateType::Create() },
25 { IOStateType::Create(), MemoryStateType::Create() });
27 { vtype, IOStateType::Create(), MemoryStateType::Create() },
28 { vtype, IOStateType::Create(), MemoryStateType::Create() });
29
30 auto SetupEmptyLambda = [&](jlm::rvsdg::Region * region, const std::string & name)
31 {
33 *region,
34 LlvmLambdaOperation::Create(f0type, name, Linkage::externalLinkage));
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 {
44 *region,
45 LlvmLambdaOperation::Create(f1type, "f2", Linkage::externalLinkage));
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::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
Region & GetRootRegion() const noexcept
Definition graph.hpp:99
void PruneNodes()
Definition graph.hpp:116
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition lambda.cpp:141
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
rvsdg::Region * subregion() const noexcept
Definition Phi.hpp:349
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.