34 std::unordered_set<rvsdg::Output *> visited;
49static std::pair<rvsdg::Input *, std::vector<rvsdg::Input *>>
107 for (
size_t i = 1;
i <
sn.ninputs(); ++
i)
109 if (
i !=
si->index())
227 std::vector<rvsdg::Node *> & loadNodes,
228 std::vector<rvsdg::Node *> & storeNodes,
229 std::vector<rvsdg::Node *> & decoupleNodes,
230 std::unordered_set<rvsdg::Node *>
exclude)
273 std::unordered_set<rvsdg::Output *> & visited,
281 if (visited.count(output))
286 visited.insert(output);
315 for (
auto & arg :
sti->arguments)
338std::vector<TracedPointerNodes>
346 std::unordered_set<rvsdg::Output *> visited;
356 std::unordered_set<rvsdg::Output *> visited;
381 auto loadOp = util::assertedCast<const llvm::LoadNonVolatileOperation>(&node->GetOperation());
387 auto storeOp = util::assertedCast<const llvm::StoreNonVolatileOperation>(&node->GetOperation());
417 std::vector<rvsdg::Output *>
states;
461 std::vector<rvsdg::Output *>
states;
496 std::vector<rvsdg::SimpleNode *> loadNodes;
497 std::vector<std::shared_ptr<const rvsdg::Type>>
responseTypes;
505 util::assertedCast<const llvm::LoadNonVolatileOperation>(&
newLoadNode.GetOperation());
523 std::vector<rvsdg::SimpleNode *> storeNodes;
531 auto vt = std::make_shared<llvm::MemoryStateType>();
543 std::vector<std::shared_ptr<const rvsdg::Type>>
loadTypes;
545 for (
size_t i = 0;
i < loadNodes.size(); ++
i)
554 std::shared_ptr<const rvsdg::Type> type;
586 for (
size_t i = 0;
i < storeNodes.size(); ++
i)
615 const auto rootRegion = &graph.GetRootRegion();
618 throw std::logic_error(
"Root should have only one node now");
624 throw std::logic_error(
"Node needs to be a lambda");
711 op.callingConvention(),
715 for (
const auto &
ctxvar : lambda->GetContextVars())
720 auto args = lambda->GetFunctionArguments();
726 for (
size_t i = 0;
i <
args.size(); ++
i)
767 for (
auto result : lambda->GetFunctionResults())
777 lambda->region()->RemoveResults({ (*lambda->output()->Users().begin()).index() });
static jlm::util::StatisticsCollector statisticsCollector
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &value, size_t capacity, bool pass_through=false)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, jlm::rvsdg::Output &load_result, size_t capacity)
std::shared_ptr< const rvsdg::Type > GetLoadedType() const noexcept
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &load_result)
~MemoryConverter() noexcept override
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static std::vector< jlm::rvsdg::Output * > create(const std::vector< jlm::rvsdg::Output * > &load_operands, const std::vector< std::shared_ptr< const rvsdg::Type > > &loadTypes, const std::vector< jlm::rvsdg::Output * > &store_operands, rvsdg::Region *)
static std::vector< jlm::rvsdg::Output * > create(rvsdg::Output &result, const std::vector< std::shared_ptr< const rvsdg::Type > > &output_types, int in_width)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, const std::vector< jlm::rvsdg::Output * > &states)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &addr, jlm::rvsdg::Output &value, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &resp)
static void CreateAndRun(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector)
rvsdg::GraphExport * GetRvsdgExport() const noexcept
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 rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
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)
static GraphExport & Create(Output &origin, std::string name)
std::vector< rvsdg::Output * > GetFunctionArguments() const
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
rvsdg::Region * subregion() const noexcept
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
const FunctionType & type() const noexcept
rvsdg::Region * region() const noexcept
void divert_users(jlm::rvsdg::Output *new_origin)
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
Represents the result of a region.
Represent acyclic RVSDG subgraphs.
rvsdg::StructuralNode * node() const noexcept
void insert(const Output *original, Output *substitute)
#define JLM_UNREACHABLE(msg)
rvsdg::LambdaNode * find_containing_lambda(rvsdg::Region *region)
std::shared_ptr< const BundleType > get_mem_res_type(std::shared_ptr< const jlm::rvsdg::Type > dataType)
rvsdg::Output * route_response_rhls(rvsdg::Region *target, rvsdg::Output *response)
void gather_mem_nodes(rvsdg::Region *region, std::vector< rvsdg::Node * > &loadNodes, std::vector< rvsdg::Node * > &storeNodes, std::vector< rvsdg::Node * > &decoupleNodes, std::unordered_set< rvsdg::Node * > exclude)
std::shared_ptr< const BundleType > get_mem_req_type(std::shared_ptr< const rvsdg::Type > elementType, bool write)
void trace_function_calls(rvsdg::Output *output, std::vector< rvsdg::SimpleNode * > &calls, std::unordered_set< rvsdg::Output * > &visited)
bool is_function_argument(const rvsdg::LambdaNode::ContextVar &cv)
rvsdg::Output * route_request_rhls(rvsdg::Region *target, rvsdg::Output *request)
rvsdg::SimpleNode * ReplaceDecouple(const rvsdg::LambdaNode *lambda, rvsdg::SimpleNode *decouple_request, rvsdg::Output *resp)
static void TracePointer(rvsdg::Output *output, std::unordered_set< rvsdg::Output * > &visited, TracedPointerNodes &tracedPointerNodes)
int JlmSize(const jlm::rvsdg::Type *type)
rvsdg::SimpleNode * find_decouple_response(const rvsdg::LambdaNode *lambda, const llvm::IntegerConstantOperation *request_constant)
rvsdg::Output * route_to_region_rhls(rvsdg::Region *target, rvsdg::Output *out)
void OptimizeReqMemState(rvsdg::Output *req_mem_state)
static void ConvertMemory(rvsdg::RvsdgModule &rvsdgModule)
const llvm::IntegerConstantOperation * trace_constant(const rvsdg::Output *dst)
std::vector< TracedPointerNodes > TracePointerArguments(const rvsdg::LambdaNode *lambda)
static rvsdg::SimpleNode * ReplaceStore(rvsdg::SubstitutionMap &smap, const rvsdg::Node *originalStore, rvsdg::Output *response)
static rvsdg::Output * ConnectRequestResponseMemPorts(const rvsdg::LambdaNode *lambda, size_t argumentIndex, rvsdg::SubstitutionMap &smap, const std::vector< rvsdg::Node * > &originalLoadNodes, const std::vector< rvsdg::Node * > &originalStoreNodes, const std::vector< rvsdg::Node * > &originalDecoupledNodes)
static std::pair< rvsdg::Input *, std::vector< rvsdg::Input * > > TraceEdgeToMerge(rvsdg::Input *state_edge)
rvsdg::Input * get_mem_state_user(rvsdg::Output *state_edge)
static size_t CalculatePortWidth(const TracedPointerNodes &tracedPointerNodes)
static rvsdg::SimpleNode * ReplaceLoad(rvsdg::SubstitutionMap &smap, const rvsdg::Node *originalLoad, rvsdg::Output *response)
std::vector< rvsdg::LambdaNode::ContextVar > find_function_arguments(const rvsdg::LambdaNode *lambda, std::string name_contains)
bool is_dec_req(rvsdg::SimpleNode *node)
void OptimizeResMemState(rvsdg::Output *res_mem_state)
CallSummary ComputeCallSummary(const rvsdg::LambdaNode &lambdaNode)
static void remove(Node *node)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
detail::TopDownTraverserGeneric< false > TopDownTraverser
Traverser for visiting every node in a region in a top down order.