40 if (!rvsdg::is<llvm::PointerType>(op->
Type()))
51 for (
auto & user : op->
Users())
53 if (
auto simplenode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(user))
60 &simplenode->GetOperation()))
67 throw util::Error(
"encountered a call for an alloca");
71 for (
size_t i = 0; i < simplenode->noutputs(); ++i)
73 trace(simplenode->output(i));
79 for (
auto & arg : sti->arguments)
88 trace(ber->argument());
102 std::unordered_set<jlm::rvsdg::Output *>
visited;
109 auto & node = rvsdg::AssertGetOwnerNode<rvsdg::SimpleNode>(*o);
110 util::assertedCast<const jlm::llvm::GetElementPtrOperation>(&node.GetOperation());
114 return node.input(2)->origin();
124 for (
size_t n = 0; n < structnode->nsubregions(); n++)
133 auto constant_output =
dynamic_cast<rvsdg::NodeOutput *
>(node->input(0)->origin());
136 &constant_output->node()->GetOperation());
138 JLM_ASSERT(constant_operation->Representation().to_uint() == 1);
140 auto at = std::dynamic_pointer_cast<const llvm::ArrayType>(po->ValueType());
147 std::cout <<
"alloca converted " << at->debug_string() << std::endl;
150 std::vector<jlm::rvsdg::Output *> load_addrs;
155 resp_outs.erase(resp_outs.begin());
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)
169 load_addrs.push_back(addr);
171 std::vector<jlm::rvsdg::Output *> store_operands;
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)
189 store_operands.push_back(addr);
190 store_operands.push_back(data);
200 auto & merge_in = *node->output(1)->Users().begin();
201 auto merge_node = rvsdg::TryGetOwnerNode<rvsdg::Node>(merge_in);
206 auto other_index = merge_in.index() ? 0 : 1;
207 merge_node->output(0)->divert_users(merge_node->input(other_index)->origin());
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
Region & GetRootRegion() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
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)
rvsdg::Output * route_request_rhls(rvsdg::Region *target, rvsdg::Output *request)
static void alloca_conv(rvsdg::Region *region)
static jlm::rvsdg::Output * gep_to_index(jlm::rvsdg::Output *o)
static void remove(Node *node)