42 if (
auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(output))
54 if (
auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(output))
70 for (
size_t n = 0; n < node.noutputs(); n++)
81 static std::unique_ptr<Context>
84 return std::make_unique<Context>();
135 static std::unique_ptr<Statistics>
138 return std::make_unique<Statistics>(sourceFile);
167 auto & rvsdg = module.
Rvsdg();
169 statistics->StartMarkStatistics(rvsdg);
171 statistics->StopMarkStatistics();
173 statistics->StartSweepStatistics();
175 statistics->StopSweepStatistics(rvsdg);
186 for (
size_t n = 0; n < region.
nresults(); n++)
202 if (is<rvsdg::GraphImport>(&output))
207 if (
auto gamma = rvsdg::TryGetOwnerNode<rvsdg::GammaNode>(output))
210 for (
const auto & result : gamma->MapOutputExitVar(output).branchResult)
217 if (
auto gamma = rvsdg::TryGetRegionParentNode<rvsdg::GammaNode>(output))
219 auto external_origin = std::visit(
222 return rolevar.input->origin();
224 gamma->MapBranchArgument(output));
229 if (
auto theta = rvsdg::TryGetOwnerNode<rvsdg::ThetaNode>(output))
231 auto loopvar = theta->MapOutputLoopVar(output);
238 if (
auto theta = rvsdg::TryGetRegionParentNode<rvsdg::ThetaNode>(output))
240 auto loopvar = theta->MapPreLoopVar(output);
246 if (
auto lambda = rvsdg::TryGetOwnerNode<rvsdg::LambdaNode>(output))
248 for (
auto & result : lambda->GetFunctionResults())
255 if (
auto lambda = rvsdg::TryGetRegionParentNode<rvsdg::LambdaNode>(output))
257 if (
auto ctxvar = lambda->MapBinderContextVar(output))
270 if (
auto phi = rvsdg::TryGetOwnerNode<rvsdg::PhiNode>(output))
272 MarkOutput(*phi->MapOutputFixVar(output).result->origin());
276 if (
auto phi = rvsdg::TryGetRegionParentNode<rvsdg::PhiNode>(output))
278 auto var = phi->MapArgument(output);
279 if (
auto fix = std::get_if<rvsdg::PhiNode::FixVar>(&var))
285 else if (
auto ctx = std::get_if<rvsdg::PhiNode::ContextVar>(&var))
293 JLM_UNREACHABLE(
"Phi argument must be either fixpoint or context variable");
297 if (
const auto deltaNode = rvsdg::TryGetOwnerNode<rvsdg::DeltaNode>(output))
299 const auto result = deltaNode->subregion()->result(0);
304 if (rvsdg::TryGetRegionParentNode<rvsdg::DeltaNode>(output))
306 const auto argument = util::assertedCast<const rvsdg::RegionArgument>(&output);
311 if (
const auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(output))
313 for (
size_t n = 0; n < simpleNode->ninputs(); n++)
334 indices.
insert(argument->index());
392 std::vector<rvsdg::GammaNode::ExitVar> deadExitVars;
393 for (
const auto & exitvar : gammaNode.
GetExitVars())
395 if (!
Context_->IsAlive(*exitvar.output))
397 deadExitVars.push_back(exitvar);
403 for (
size_t r = 0; r < gammaNode.
nsubregions(); r++)
409 std::vector<rvsdg::GammaNode::EntryVar> deadEntryVars;
412 bool alive = std::any_of(
413 entryvar.branchArgument.begin(),
414 entryvar.branchArgument.end(),
417 return Context_->IsAlive(*arg);
421 deadEntryVars.push_back(entryvar);
431 std::vector<rvsdg::ThetaNode::LoopVar> loopvars;
432 for (
const auto & loopvar : thetaNode.
GetLoopVars())
434 if (!
Context_->IsAlive(*loopvar.pre) && !
Context_->IsAlive(*loopvar.output))
436 loopvar.post->divert_to(loopvar.pre);
437 loopvars.push_back(loopvar);
464 std::vector<rvsdg::PhiNode::FixVar> deadFixvars;
465 std::vector<rvsdg::PhiNode::ContextVar> deadCtxvars;
467 for (
const auto & fixvar : phiNode.
GetFixVars())
469 bool isDead = !
Context_->IsAlive(*fixvar.output) && !
Context_->IsAlive(*fixvar.recref);
472 deadFixvars.push_back(fixvar);
475 fixvar.result->divert_to(fixvar.recref);
483 if (ctxvar.inner->IsDead())
485 deadCtxvars.push_back(ctxvar);
Dead Node Elimination context class.
void MarkAlive(const jlm::rvsdg::Output &output)
static std::unique_ptr< Context > Create()
util::HashSet< const jlm::rvsdg::Output * > Outputs_
bool IsAlive(const rvsdg::Node &node) const noexcept
util::HashSet< const jlm::rvsdg::SimpleNode * > SimpleNodes_
bool IsAlive(const jlm::rvsdg::Output &output) const noexcept
Dead Node Elimination statistics class.
void StopMarkStatistics() noexcept
const char * SweepTimerLabel_
const char * MarkTimerLabel_
void StartMarkStatistics(const rvsdg::Graph &graph) noexcept
static std::unique_ptr< Statistics > Create(const util::FilePath &sourceFile)
~Statistics() override=default
void StartSweepStatistics() noexcept
Statistics(const util::FilePath &sourceFile)
void StopSweepStatistics(const rvsdg::Graph &graph) noexcept
Dead Node Elimination Optimization.
void SweepRegion(rvsdg::Region ®ion) const
void SweepGamma(rvsdg::GammaNode &gammaNode) const
void SweepStructuralNode(rvsdg::StructuralNode &node) const
static void SweepDelta(rvsdg::DeltaNode &deltaNode)
void run(rvsdg::Region ®ion)
void MarkOutput(const jlm::rvsdg::Output &output)
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
std::unique_ptr< Context > Context_
void SweepRvsdg(rvsdg::Graph &rvsdg) const
void SweepLambda(rvsdg::LambdaNode &lambdaNode) const
void SweepTheta(rvsdg::ThetaNode &thetaNode) const
~DeadNodeElimination() noexcept override
void MarkRegion(const rvsdg::Region ®ion)
void SweepPhi(rvsdg::PhiNode &phiNode) const
rvsdg::Region * subregion() const noexcept
size_t PruneDeltaInputs()
Conditional operator / pattern matching.
void RemoveEntryVars(const std::vector< EntryVar > &entryVars)
Removes the given entry variables.
void RemoveExitVars(const std::vector< ExitVar > &exitVars)
Removes the given exit variables.
std::vector< ExitVar > GetExitVars() const
Gets all exit variables for this gamma.
std::vector< EntryVar > GetEntryVars() const
Gets all entry variables for this gamma.
Region & GetRootRegion() const noexcept
rvsdg::Region * subregion() const noexcept
size_t PruneLambdaInputs()
A phi node represents the fixpoint of mutually recursive definitions.
rvsdg::Region * subregion() const noexcept
std::vector< FixVar > GetFixVars() const noexcept
Gets all fixpoint variables.
void RemoveContextVars(std::vector< ContextVar > vars)
Removes context variables from phi node.
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
void RemoveFixVars(std::vector< FixVar > vars)
Removes fixpoint variables from the phi node.
Represent acyclic RVSDG subgraphs.
RegionResult * result(size_t index) const noexcept
RegionArgumentRange Arguments() noexcept
size_t nresults() const noexcept
void prune(bool recursive)
size_t numBottomNodes() const noexcept
size_t RemoveArguments(const util::HashSet< size_t > &indices)
const std::optional< util::FilePath > & SourceFilePath() const noexcept
size_t nsubregions() const noexcept
rvsdg::Region * subregion(size_t index) const noexcept
void RemoveLoopVars(std::vector< LoopVar > loopVars)
Removes loop variables.
std::vector< LoopVar > GetLoopVars() const
Returns all loop variables.
rvsdg::Region * subregion() const noexcept
bool insert(ItemType item)
std::size_t Size() const noexcept
bool Contains(const ItemType &item) const 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)
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
void MatchTypeOrFail(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
static void remove(Node *node)
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
size_t ninputs(const rvsdg::Region *region) noexcept
static const char * NumRvsdgNodesBefore
static const char * NumRvsdgNodesAfter
static const char * NumRvsdgInputsAfter
static const char * NumRvsdgInputsBefore