74 static std::unique_ptr<Context>
77 return std::make_unique<Context>();
128 static std::unique_ptr<Statistics>
131 return std::make_unique<Statistics>(sourceFile);
160 auto & rvsdg = module.
Rvsdg();
162 statistics->startMarkStatistics(rvsdg);
164 statistics->stopMarkStatistics();
166 statistics->startSweepStatistics();
168 statistics->stopSweepStatistics(rvsdg);
179 const auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(output);
180 return simpleNode && is<LoadNonVolatileOperation>(simpleNode)
181 && is<MemoryStateType>(output.
Type());
187 for (
const auto result : region.
Results())
196 if (
auto simpleNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(output))
218 for (
auto & input : simpleNode->Inputs())
232 if (is<rvsdg::GraphImport>(&output))
237 if (
const auto gamma = rvsdg::TryGetOwnerNode<rvsdg::GammaNode>(output))
240 for (
const auto & result : gamma->MapOutputExitVar(output).branchResult)
247 if (
const auto gamma = rvsdg::TryGetRegionParentNode<rvsdg::GammaNode>(output))
249 markOutput(*gamma->mapBranchArgumentToInput(output).origin());
253 if (
const auto theta = rvsdg::TryGetOwnerNode<rvsdg::ThetaNode>(output))
255 const auto loopVar = theta->MapOutputLoopVar(output);
262 if (
const auto theta = rvsdg::TryGetRegionParentNode<rvsdg::ThetaNode>(output))
264 const auto loopVar = theta->MapPreLoopVar(output);
270 if (
const auto lambda = rvsdg::TryGetOwnerNode<rvsdg::LambdaNode>(output))
272 for (
const auto result : lambda->GetFunctionResults())
279 if (
const auto lambda = rvsdg::TryGetRegionParentNode<rvsdg::LambdaNode>(output))
281 if (
const auto ctxVar = lambda->MapBinderContextVar(output))
292 if (
const auto phi = rvsdg::TryGetOwnerNode<rvsdg::PhiNode>(output))
294 markOutput(*phi->MapOutputFixVar(output).result->origin());
298 if (
const auto phi = rvsdg::TryGetRegionParentNode<rvsdg::PhiNode>(output))
300 const auto var = phi->MapArgument(output);
301 if (
const auto fixVar = std::get_if<rvsdg::PhiNode::FixVar>(&var))
308 if (
const auto ctxVar = std::get_if<rvsdg::PhiNode::ContextVar>(&var))
315 throw std::logic_error(
"Phi argument must be either fixpoint or context variable");
318 if (
const auto deltaNode = rvsdg::TryGetOwnerNode<rvsdg::DeltaNode>(output))
320 const auto result = deltaNode->subregion()->result(0);
325 if (rvsdg::TryGetRegionParentNode<rvsdg::DeltaNode>(output))
327 const auto argument = util::assertedCast<const rvsdg::RegionArgument>(&output);
332 throw std::logic_error(
"We should have never reached this statement.");
346 indices.
insert(argument->index());
360 return Context_->isAlive(*simpleNode);
363 for (
auto & output : node.Outputs())
432 for (
auto & subregion : gammaNode.
Subregions())
438 std::vector<rvsdg::GammaNode::EntryVar> deadEntryVars;
441 const bool isAlive = std::any_of(
442 entryVar.branchArgument.begin(),
443 entryVar.branchArgument.end(),
446 return Context_->isAlive(*arg);
450 deadEntryVars.push_back(entryVar);
460 std::vector<rvsdg::ThetaNode::LoopVar> loopVars;
461 for (
const auto & loopVar : thetaNode.
GetLoopVars())
463 if (!
Context_->isAlive(*loopVar.pre) && !
Context_->isAlive(*loopVar.output))
465 loopVar.post->divert_to(loopVar.pre);
466 loopVars.push_back(loopVar);
493 std::vector<rvsdg::PhiNode::FixVar> deadFixVars;
494 std::vector<rvsdg::PhiNode::ContextVar> deadCtxVars;
496 for (
const auto & fixVar : phiNode.
GetFixVars())
498 if (!
Context_->isAlive(*fixVar.output) && !
Context_->isAlive(*fixVar.recref))
500 deadFixVars.push_back(fixVar);
503 fixVar.result->divert_to(fixVar.recref);
511 if (ctxvar.inner->IsDead())
513 deadCtxVars.push_back(ctxvar);
static jlm::util::StatisticsCollector statisticsCollector
Dead Node Elimination context class.
util::HashSet< const rvsdg::SimpleNode * > SimpleNodes_
util::HashSet< const rvsdg::Output * > Outputs_
bool markAlive(const rvsdg::Output &output)
bool markAlive(const rvsdg::SimpleNode &simpleNode)
static std::unique_ptr< Context > create()
bool isAlive(const rvsdg::Output &output) const noexcept
bool isAlive(const rvsdg::SimpleNode &simpleNode) const noexcept
Dead Node Elimination statistics class.
const char * SweepTimerLabel_
const char * MarkTimerLabel_
~Statistics() override=default
static std::unique_ptr< Statistics > create(const util::FilePath &sourceFile)
void stopSweepStatistics(const rvsdg::Graph &graph) noexcept
Statistics(const util::FilePath &sourceFile)
void startSweepStatistics() noexcept
void startMarkStatistics(const rvsdg::Graph &graph) noexcept
void stopMarkStatistics() noexcept
Dead Node Elimination Optimization.
void sweepStructuralNode(rvsdg::StructuralNode &node) const
static void sweepDelta(rvsdg::DeltaNode &deltaNode)
void sweepGamma(rvsdg::GammaNode &gammaNode) const
void sweepLambda(rvsdg::LambdaNode &lambdaNode) const
void run(rvsdg::Region ®ion)
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
std::unique_ptr< Context > Context_
void markRegion(const rvsdg::Region ®ion)
void sweepPhi(rvsdg::PhiNode &phiNode) const
void sweepRvsdg(rvsdg::Graph &rvsdg) const
~DeadNodeElimination() noexcept override
static void removeNode(rvsdg::Node &node)
void markOutput(const rvsdg::Output &output)
void sweepRegion(rvsdg::Region ®ion) const
void sweepTheta(rvsdg::ThetaNode &thetaNode) const
static rvsdg::Output & LoadedValueOutput(const rvsdg::Node &node)
static rvsdg::Node::OutputIteratorRange MemoryStateOutputs(const rvsdg::Node &node) noexcept
static rvsdg::Input & MapMemoryStateOutputToInput(const rvsdg::Output &output)
rvsdg::Region * subregion() const noexcept
size_t PruneDeltaInputs()
Conditional operator / pattern matching.
void RemoveEntryVars(const std::vector< EntryVar > &entryVars)
Removes the given entry variables.
std::vector< Output * > GetOutputsWhere(const F &match)
Gets all gamma outputs that match the condition defined by match.
std::vector< EntryVar > GetEntryVars() const
Gets all entry variables for this gamma.
void RemoveExitVars(const std::vector< Output * > &gammaOutputs)
Removes the exit variables corresponding to the given gammaOutputs.
Region & GetRootRegion() const noexcept
rvsdg::Region * subregion() const noexcept
size_t PruneLambdaInputs()
virtual const Operation & GetOperation() const noexcept=0
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
void divert_users(jlm::rvsdg::Output *new_origin)
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.
RegionArgumentRange Arguments() noexcept
void prune(bool recursive)
size_t numBottomNodes() const noexcept
size_t RemoveArguments(const util::HashSet< size_t > &indices)
RegionResultRange Results() noexcept
const std::optional< util::FilePath > & SourceFilePath() const noexcept
std::string DebugString() const override
SubregionIteratorRange Subregions()
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
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)
Global memory state passed between functions.
static bool isLoadNonVolatileMemoryStateOutput(const rvsdg::Output &output)
void MatchTypeWithDefault(T &obj, const Fns &... fns)
Pattern match over subclass type of given object with default handler.
static void remove(Node *node)
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
size_t ninputs(const rvsdg::Region *region) noexcept
static std::string strfmt(Args... args)
static const char * NumRvsdgNodesBefore
static const char * NumRvsdgNodesAfter
static const char * NumRvsdgInputsAfter
static const char * NumRvsdgInputsBefore