24 for (
auto & node : region.
Nodes())
47 for (
const auto constant :
constants.Items())
58 const auto region = output.
region();
75 for (
const auto output :
outputs.Items())
89 auto roleVar = gammaNode->MapBranchArgument(*output);
90 if (
const auto entryVar = std::get_if<rvsdg::GammaNode::EntryVar>(&
roleVar))
92 for (
const auto argument :
entryVar->branchArgument)
100 throw std::logic_error(
"Unhandled output type");
112 for (
auto & node : region.
Nodes())
118 for (
auto & subregion : gammaNode.
Subregions())
156 const auto loopVar = thetaNode->MapInputLoopVar(
user);
165 if (&
user != thetaNode->predicate())
167 const auto loopVar = thetaNode->MapPostLoopVar(
user);
175 if (
const auto entryVar = std::get_if<rvsdg::GammaNode::EntryVar>(&
roleVar))
177 for (
const auto argument :
entryVar->branchArgument)
186 const auto exitVar = gammaNode->MapBranchResultExitVar(
user);
201 throw std::logic_error(
"Unexpected node type");
static void distributeConstantsInRootRegion(rvsdg::Region ®ion)
static util::HashSet< rvsdg::Output * > collectOutputs(const rvsdg::SimpleNode &constantNode)
static void distributeConstantsInLambda(const rvsdg::LambdaNode &lambdaNode)
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
~ConstantDistribution() noexcept override
static util::HashSet< rvsdg::SimpleNode * > collectConstants(rvsdg::Region ®ion)
Conditional operator / pattern matching.
rvsdg::Region * region() const noexcept
void divert_users(jlm::rvsdg::Output *new_origin)
A phi node represents the fixpoint of mutually recursive definitions.
Represent acyclic RVSDG subgraphs.
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
NodeRange Nodes() noexcept
SubregionIteratorRange Subregions()
static bool is_constant(const rvsdg::Node *node)
void MatchTypeOrFail(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
static bool ThetaLoopVarIsInvariant(const ThetaNode::LoopVar &loopVar) noexcept
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
std::optional< rvsdg::Output * > GetGammaInvariantOrigin(const GammaNode &gamma, const GammaNode::ExitVar &exitvar)
Determines whether a gamma exit var is path-invariant.