31 auto origin = cv.input->origin();
32 auto newcv = lambda->AddContextVar(*origin);
33 subregionmap.
insert(cv.inner, newcv.inner);
37 auto newArgs = lambda->GetFunctionArguments();
39 for (std::size_t n = 0; n < args.size(); ++n)
41 subregionmap.
insert(args[n], newArgs[n]);
48 std::vector<jlm::rvsdg::Output *> results;
50 results.push_back(&subregionmap.
lookup(*result->origin()));
53 lambda->finalize(results);
64 auto & graph = rm.
Rvsdg();
70 auto functionType = newLambda->GetOperation().type();
71 auto numArguments = functionType.NumArguments();
72 if (numArguments == 0)
78 auto memStateArgumentIndex = numArguments - 1;
79 if (!rvsdg::is<llvm::MemoryStateType>(functionType.ArgumentType(memStateArgumentIndex)))
85 auto ioStateArgumentIndex = numArguments - 2;
86 JLM_ASSERT(rvsdg::is<llvm::IOStateType>(functionType.ArgumentType(ioStateArgumentIndex)));
123 newLambda->subregion()->argument(ioStateArgumentIndex),
137 const std::shared_ptr<const jlm::rvsdg::FunctionType> & loadFunctionType,
139 const std::shared_ptr<const jlm::rvsdg::FunctionType> & storeFunctionType,
141 const std::shared_ptr<const jlm::rvsdg::FunctionType> & allocaFunctionType)
151 for (
size_t n = 0; n < structnode->nsubregions(); n++)
153 auto subregion = structnode->subregion(n);
170 auto addr = node->input(0)->origin();
171 JLM_ASSERT(rvsdg::is<jlm::llvm::PointerType>(addr->Type()));
173 int log2Bytes = log2(bitWidth / 8);
177 if (*addr->Type() != *void_ptr)
181 auto memstate = node->input(1)->origin();
185 { addr, widthNode.output(0), ioState, memstate });
187 node->input(1)->divert_to(callOp[1]);
193 auto constant_output =
dynamic_cast<rvsdg::NodeOutput *
>(node->input(0)->origin());
196 &constant_output->node()->GetOperation());
198 JLM_ASSERT(constant_operation->Representation().to_uint() == 1);
208 if (*addr->
Type() != *void_ptr)
212 std::vector<jlm::rvsdg::Input *> old_users;
213 for (
auto & user : node->output(1)->Users())
214 old_users.push_back(&user);
215 auto memstate = node->output(1);
219 { addr, sizeNode.output(0), ioState, memstate });
220 for (
auto ou : old_users)
223 ou->divert_to(callOp[1]);
230 auto addr = node->input(0)->origin();
231 JLM_ASSERT(rvsdg::is<jlm::llvm::PointerType>(addr->Type()));
232 auto bitWidth =
JlmSize(&so->GetStoredType());
233 int log2Bytes = log2(bitWidth / 8);
237 if (*addr->Type() != *void_ptr)
241 auto memstate = node->output(0);
242 std::vector<jlm::rvsdg::Input *> oldUsers;
243 for (
auto & user : memstate->Users())
244 oldUsers.push_back(&user);
248 { addr, widthNode.output(0), ioState, memstate });
250 for (
auto user : oldUsers)
252 user->divert_to(callOp[1]);
static int JlmSize(const jlm::rvsdg::Type *type)
static std::unique_ptr< llvm::ThreeAddressCode > create(const Variable *operand, std::shared_ptr< const jlm::rvsdg::Type > type)
static std::vector< rvsdg::Output * > Create(rvsdg::Output *function, std::shared_ptr< const rvsdg::FunctionType > functionType, const std::vector< rvsdg::Output * > &arguments)
static std::shared_ptr< const IOStateType > Create()
static rvsdg::Node & Create(rvsdg::Region ®ion, IntegerValueRepresentation representation)
static LlvmGraphImport & Create(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, bool isConstant=false)
static std::unique_ptr< LlvmLambdaOperation > Create(std::shared_ptr< const jlm::rvsdg::FunctionType > type, std::string name, const jlm::llvm::Linkage &linkage, jlm::llvm::AttributeSet attributes)
static std::shared_ptr< const MemoryStateType > Create()
static std::shared_ptr< const PointerType > Create()
static std::shared_ptr< const BitType > Create(std::size_t nbits)
Creates bit type of specified width.
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)
Region & GetRootRegion() const noexcept
std::vector< rvsdg::Output * > GetFunctionArguments() const
rvsdg::Region * subregion() const noexcept
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
std::vector< rvsdg::Input * > GetFunctionResults() const
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
LambdaOperation & GetOperation() const noexcept override
rvsdg::Region * region() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
Represent acyclic RVSDG subgraphs.
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
void insert(const Output *original, Output *substitute)
Output & lookup(const Output &original) const
int JlmSize(const jlm::rvsdg::Type *type)
static void divert_users(jlm::rvsdg::Output *output, Context &ctx)
void instrument_ref(llvm::LlvmRvsdgModule &rm)
rvsdg::LambdaNode * change_function_name(rvsdg::LambdaNode *ln, const std::string &name)
static void remove(Node *node)
Output & RouteToRegion(Output &output, Region ®ion)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)