64 static std::unique_ptr<Statistics>
67 return std::make_unique<Statistics>(
sourceFile);
85 if (
s2->size() <
s1->size())
103 for (
size_t n = 0;
n <
n1->noutputs();
n++)
117 return it->second->find(
o2) !=
it->second->end();
140 std::unordered_set<std::unique_ptr<congruence_set>>
sets_;
141 std::unordered_map<const jlm::rvsdg::Output *, congruence_set *>
outputs_;
170 return it->second.find(
o2) !=
it->second.end();
174 std::unordered_map<const jlm::rvsdg::Output *, std::unordered_set<const jlm::rvsdg::Output *>>
186 if (*
o1->Type() != *
o2->Type())
201 auto output1 =
o1->region()->node()->output(
i1->index());
202 auto output2 =
o2->region()->node()->output(
i2->index());
228 if (
a1 &&
dynamic_cast<const LoopNode *
>(
a1->region()->node()) &&
a2
229 &&
dynamic_cast<const LoopNode *
>(
a2->region()->node()))
232 if (
a1->input() &&
a2->input())
245 auto r2 =
so2->results.begin();
246 for (;
r1 !=
so1->results.end();
r1++,
r2++)
263 return rolevar.input->origin();
265 g1->MapBranchArgument(*
o1));
269 return rolevar.input->origin();
271 g2->MapBranchArgument(*
o2));
277 &&
n1->GetOperation() ==
n2->GetOperation() &&
n1->ninputs() ==
n2->ninputs()
278 &&
o1->index() ==
o2->index())
280 for (
size_t n = 0;
n <
n1->ninputs();
n++)
306 auto a1 =
i1->arguments.begin();
307 auto a2 =
i2->arguments.begin();
308 for (;
a1 !=
i1->arguments.end();
a1++,
a2++)
468 for (
const auto & origin : *set)
470 for (
const auto &
user : origin->Users())
506 auto set =
ctx.set(output);
507 for (
auto &
other : *set)
508 other->divert_users(output);
534 for (
auto input :
ev.branchArgument)
627 const auto & graph =
module.Rvsdg();
630 auto statistics = Statistics::Create(module.SourceFilePath().value());
632 statistics->start_mark_stat(graph);
633 mark(&graph.GetRootRegion(),
ctx);
634 statistics->end_mark_stat();
636 statistics->start_divert_stat();
638 statistics->end_divert_stat(graph);
static jlm::util::StatisticsCollector statisticsCollector
const char * DivertTimerLabel_
~Statistics() override=default
const char * MarkTimerLabel_
Statistics(const util::FilePath &sourceFile)
static std::unique_ptr< Statistics > Create(const util::FilePath &sourceFile)
void start_mark_stat(const Graph &graph) noexcept
void end_divert_stat(const Graph &graph) noexcept
void start_divert_stat() noexcept
void end_mark_stat() noexcept
Common Node Elimination This is mainly a copy of the CNE optimization in the LLVM backend with the ad...
~CommonNodeElimination() noexcept override
std::unordered_set< std::unique_ptr< congruence_set > > sets_
void mark(const Node *n1, const Node *n2)
bool congruent(jlm::rvsdg::Output *o1, jlm::rvsdg::Output *o2) const noexcept
std::unordered_map< const jlm::rvsdg::Output *, congruence_set * > outputs_
void mark(jlm::rvsdg::Output *o1, jlm::rvsdg::Output *o2)
congruence_set * set(jlm::rvsdg::Output *output) noexcept
bool congruent(const jlm::rvsdg::Input *i1, const jlm::rvsdg::Input *i2) const noexcept
rvsdg::Region * subregion() const noexcept
std::unordered_map< const jlm::rvsdg::Output *, std::unordered_set< const jlm::rvsdg::Output * > > sets_
void insert(const jlm::rvsdg::Output *o1, const jlm::rvsdg::Output *o2)
bool visited(const jlm::rvsdg::Output *o1, const jlm::rvsdg::Output *o2) const
Conditional operator / pattern matching.
std::vector< EntryVar > GetEntryVars() const
Gets all entry variables for this gamma.
rvsdg::Region * subregion() const noexcept
NodeOutput * output(size_t index) const noexcept
rvsdg::Region * region() const noexcept
size_t ninputs() const noexcept
size_t noutputs() const noexcept
A phi node represents the fixpoint of mutually recursive definitions.
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
rvsdg::Region * subregion() const noexcept
Represents the argument of a region.
Represent acyclic RVSDG subgraphs.
RegionArgument * argument(size_t index) const noexcept
TopNodeRange TopNodes() noexcept
size_t narguments() const noexcept
const SimpleOperation & GetOperation() const noexcept override
NodeInput * input(size_t index) const noexcept
SubregionIteratorRange Subregions()
rvsdg::Region * subregion(size_t index) const noexcept
size_t nsubregions() const noexcept
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
std::vector< LoopVar > GetLoopVars() const
Returns all loop variables.
rvsdg::Region * subregion() const noexcept
LoopVar MapInputLoopVar(const rvsdg::Input &input) const
Maps variable at entry to full varibale description.
Iterator begin() noexcept
void CollectDemandedStatistics(std::unique_ptr< Statistics > statistics)
util::Timer & GetTimer(const std::string &name)
util::Timer & AddTimer(std::string name)
void AddMeasurement(std::string name, T value)
static void mark_arguments(StructuralInput *i1, StructuralInput *i2, Context &ctx)
static void divert_gamma(rvsdg::GammaNode *gamma, Context &ctx)
static void mark_theta(const rvsdg::ThetaNode *theta, Context &ctx)
static void mark_gamma(const rvsdg::GammaNode *node, Context &ctx)
static void divert(rvsdg::Region *, Context &)
static void divert_theta(rvsdg::ThetaNode *theta, Context &ctx)
static void divert_arguments(rvsdg::Region *region, Context &ctx)
std::unordered_set< jlm::rvsdg::Output * > congruence_set
static void divert_users(jlm::rvsdg::Output *output, Context &ctx)
static bool congruent(Output *o1, Output *o2, VisitorSet &vs, Context &ctx)
static void mark_phi(const rvsdg::PhiNode *phi, Context &ctx)
static void mark_lambda(const rvsdg::LambdaNode *node, Context &ctx)
static void divert_outputs(Node *node, Context &ctx)
static void divert_lambda(rvsdg::LambdaNode *node, Context &ctx)
static void divert_loop(LoopNode *node, Context &ctx)
static void mark_loop(const LoopNode *loop, Context &ctx)
static void divert_phi(rvsdg::PhiNode *phi, Context &ctx)
static void mark(jlm::rvsdg::Region *, Context &)
void MatchTypeOrFail(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
size_t ninputs(const rvsdg::Region *region) noexcept
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.