51 for (
auto &
user :
op->Users())
67 throw util::Error(
"encountered a call for an alloca");
79 for (
auto & arg :
sti->arguments)
102 std::unordered_set<jlm::rvsdg::Output *>
visited;
110 util::assertedCast<const jlm::llvm::GetElementPtrOperation>(&node.GetOperation());
114 return node.input(2)->origin();
140 auto at = std::dynamic_pointer_cast<const llvm::ArrayType>(
po->allocatedType());
147 std::cout <<
"alloca converted " <<
at->debug_string() << std::endl;
151 for (
auto l :
ta.load_nodes)
156 std::vector<jlm::rvsdg::Output *>
states;
157 for (
size_t i = 1;
i <
l->ninputs(); ++
i)
159 states.push_back(
l->input(
i)->origin());
163 for (
size_t i = 0;
i <
l->noutputs(); ++
i)
172 for (
auto s :
ta.store_nodes)
175 std::vector<jlm::rvsdg::Output *>
states;
176 for (
size_t i = 2;
i <
s->ninputs(); ++
i)
178 states.push_back(
s->input(
i)->origin());
182 for (
size_t i = 0;
i <
s->noutputs(); ++
i)
200 auto &
merge_in = *node->output(1)->Users().begin();
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
~AllocaNodeConversion() noexcept override
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &index, const std::vector< jlm::rvsdg::Output * > &states, jlm::rvsdg::Output &load_result)
static std::vector< jlm::rvsdg::Output * > create(std::shared_ptr< const llvm::ArrayType > at, rvsdg::Region *region)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &mem, const std::vector< jlm::rvsdg::Output * > &load_operands, const std::vector< jlm::rvsdg::Output * > &store_operands)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &mem, size_t resp_count)
static std::vector< jlm::rvsdg::Output * > create(jlm::rvsdg::Output &index, jlm::rvsdg::Output &value, const std::vector< jlm::rvsdg::Output * > &states)
void trace(jlm::rvsdg::Output *op)
std::vector< jlm::rvsdg::SimpleNode * > store_nodes
std::unordered_set< jlm::rvsdg::Output * > visited
TraceAllocaUses(jlm::rvsdg::Output *op)
std::vector< jlm::rvsdg::SimpleNode * > load_nodes
void divert_users(jlm::rvsdg::Output *new_origin)
Represents the result of a region.
Represent acyclic RVSDG subgraphs.
#define JLM_UNREACHABLE(msg)
rvsdg::Output * route_response_rhls(rvsdg::Region *target, rvsdg::Output *response)
static jlm::rvsdg::Output * gep_to_index(jlm::rvsdg::Output *o)
rvsdg::Output * route_request_rhls(rvsdg::Region *target, rvsdg::Output *request)
static void alloca_conv(rvsdg::Region *region)
static void remove(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.