32 op.callingConvention(),
39 auto origin = cv.input->origin();
40 auto newcv = lambda->AddContextVar(*origin);
41 subregionmap.
insert(cv.inner, newcv.inner);
45 auto newArgs = lambda->GetFunctionArguments();
47 for (std::size_t n = 0; n < args.size(); ++n)
49 subregionmap.
insert(args[n], newArgs[n]);
56 std::vector<jlm::rvsdg::Output *> results;
58 results.push_back(&subregionmap.
lookup(*result->origin()));
61 lambda->finalize(results);
72 auto & graph = rm.
Rvsdg();
78 auto functionType = newLambda->GetOperation().type();
79 auto numArguments = functionType.NumArguments();
80 if (numArguments == 0)
86 auto memStateArgumentIndex = numArguments - 1;
87 if (!rvsdg::is<llvm::MemoryStateType>(functionType.ArgumentType(memStateArgumentIndex)))
93 auto ioStateArgumentIndex = numArguments - 2;
94 JLM_ASSERT(rvsdg::is<llvm::IOStateType>(functionType.ArgumentType(ioStateArgumentIndex)));
131 newLambda->subregion()->argument(ioStateArgumentIndex),
145 const std::shared_ptr<const jlm::rvsdg::FunctionType> & loadFunctionType,
147 const std::shared_ptr<const jlm::rvsdg::FunctionType> & storeFunctionType,
149 const std::shared_ptr<const jlm::rvsdg::FunctionType> & allocaFunctionType)
159 for (
size_t n = 0; n < structnode->nsubregions(); n++)
161 auto subregion = structnode->subregion(n);
178 auto addr = node->input(0)->origin();
179 JLM_ASSERT(rvsdg::is<jlm::llvm::PointerType>(addr->Type()));
181 int log2Bytes = log2(bitWidth / 8);
185 if (*addr->Type() != *void_ptr)
189 auto memstate = node->input(1)->origin();
193 { addr, widthNode.output(0), ioState, memstate });
195 node->input(1)->divert_to(callOp[1]);
201 auto constant_output =
dynamic_cast<rvsdg::NodeOutput *
>(node->input(0)->origin());
204 &constant_output->node()->GetOperation());
206 JLM_ASSERT(constant_operation->Representation().to_uint() == 1);
210 auto at =
dynamic_cast<const llvm::ArrayType *
>(ao->allocatedType().get());
216 if (*addr->
Type() != *void_ptr)
220 std::vector<jlm::rvsdg::Input *> old_users;
221 for (
auto & user : node->output(1)->Users())
222 old_users.push_back(&user);
223 auto memstate = node->output(1);
227 { addr, sizeNode.output(0), ioState, memstate });
228 for (
auto ou : old_users)
231 ou->divert_to(callOp[1]);
238 auto addr = node->input(0)->origin();
239 JLM_ASSERT(rvsdg::is<jlm::llvm::PointerType>(addr->Type()));
240 auto bitWidth =
JlmSize(&so->GetStoredType());
241 int log2Bytes = log2(bitWidth / 8);
245 if (*addr->Type() != *void_ptr)
249 auto memstate = node->output(0);
250 std::vector<jlm::rvsdg::Input *> oldUsers;
251 for (
auto & user : memstate->Users())
252 oldUsers.push_back(&user);
256 { addr, widthNode.output(0), ioState, memstate });
258 for (
auto user : oldUsers)
260 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 & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
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::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)