52 std::unordered_map<const Variable *, rvsdg::Output *>
Map_;
140 const std::string & functionName)
159 static std::unique_ptr<ControlFlowRestructuringStatistics>
162 return std::make_unique<ControlFlowRestructuringStatistics>(sourceFileName, functionName);
190 static std::unique_ptr<AggregationStatistics>
193 return std::make_unique<AggregationStatistics>(sourceFileName, functionName);
221 static std::unique_ptr<AnnotationStatistics>
224 return std::make_unique<AnnotationStatistics>(sourceFileName, functionName);
235 const std::string & functionName)
253 static std::unique_ptr<AggregationTreeToLambdaStatistics>
256 return std::make_unique<AggregationTreeToLambdaStatistics>(sourceFileName, functionName);
272 Start(
size_t numInitializationThreeAddressCodes) noexcept
284 static std::unique_ptr<DataNodeToDeltaStatistics>
287 return std::make_unique<DataNodeToDeltaStatistics>(sourceFileName, dataNodeName);
314 static std::unique_ptr<InterProceduralGraphToRvsdgStatistics>
317 return std::make_unique<InterProceduralGraphToRvsdgStatistics>(sourceFileName);
333 const std::function<
void(
ControlFlowGraph *)> & restructureControlFlowGraph,
335 std::string functionName)
342 restructureControlFlowGraph(&cfg);
346 statistics->Start(cfg);
347 restructureControlFlowGraph(&cfg);
353 std::unique_ptr<AggregationNode>
356 aggregateControlFlowGraph,
358 std::string functionName)
363 return aggregateControlFlowGraph(cfg);
365 statistics->Start(cfg);
366 auto aggregationTreeRoot = aggregateControlFlowGraph(cfg);
371 return aggregationTreeRoot;
374 std::unique_ptr<AnnotationMap>
376 const std::function<std::unique_ptr<AnnotationMap>(
const AggregationNode &)> &
377 annotateAggregationTree,
379 std::string functionName)
384 return annotateAggregationTree(aggregationTreeRoot);
386 statistics->Start(aggregationTreeRoot);
387 auto demandMap = annotateAggregationTree(aggregationTreeRoot);
397 const std::function<
void()> & convertAggregationTreeToLambda,
398 std::string functionName)
404 return convertAggregationTreeToLambda();
407 convertAggregationTreeToLambda();
415 const std::function<
rvsdg::Output *()> & convertDataNodeToDelta,
416 std::string dataNodeName,
417 size_t NumInitializationThreeAddressCodes)
422 return convertDataNodeToDelta();
424 statistics->Start(NumInitializationThreeAddressCodes);
425 auto output = convertDataNodeToDelta();
433 std::unique_ptr<LlvmRvsdgModule>
436 convertInterProceduralGraphModule,
442 return convertInterProceduralGraphModule(interProceduralGraphModule);
444 statistics->Start(interProceduralGraphModule);
445 auto rvsdgModule = convertInterProceduralGraphModule(interProceduralGraphModule);
446 statistics->End(rvsdgModule->Rvsdg());
472 auto lhs = threeAddressCode.
operand(0);
473 auto rhs = threeAddressCode.
operand(1);
490 auto ev1 = gamma->AddEntryVar(variableMap.
lookup(threeAddressCode.
operand(2)));
491 auto ev2 = gamma->AddEntryVar(variableMap.
lookup(threeAddressCode.
operand(1)));
492 auto ex = gamma->AddExitVar({ ev1.branchArgument[0], ev2.branchArgument[1] });
493 variableMap.
insert(threeAddressCode.
result(0), ex.output);
505 template<
class TNode,
class TOperation>
512 std::vector<rvsdg::Output *>
operands;
513 for (
size_t n = 0; n < threeAddressCode.
noperands(); n++)
515 auto operand = threeAddressCode.
operand(n);
519 std::unique_ptr<TOperation> operation(
520 util::assertedCast<TOperation>(threeAddressCode.
operation().
copy().release()));
521 auto results = TNode::Create(region, std::move(operation),
operands);
524 for (
size_t n = 0; n < threeAddressCode.
nresults(); n++)
526 auto result = threeAddressCode.
result(n);
527 variableMap.
insert(result, results[n]);
537 if (is<AssignmentOperation>(&threeAddressCode))
541 else if (is<SelectOperation>(&threeAddressCode))
545 else if (is<BranchOperation>(&threeAddressCode))
551 std::vector<rvsdg::Output *>
operands;
552 for (
size_t n = 0; n < threeAddressCode.
noperands(); n++)
559 for (
size_t n = 0; n < threeAddressCode.
nresults(); n++)
560 variableMap.
insert(threeAddressCode.
result(n), results[n]);
570 for (
const auto & threeAddressCode : basicBlock)
576 const AggregationNode & aggregationNode,
577 const AnnotationMap & demandMap,
579 RegionalizedVariableMap & regionalizedVariableMap);
592 auto & outerVariableMap =
601 for (
size_t n = 0; n < entryAggregationNode.
narguments(); n++)
603 auto functionNodeArgument = entryAggregationNode.
argument(n);
604 auto lambdaNodeArgument = lambdaArgs[n];
606 topVariableMap.insert(functionNodeArgument, lambdaNodeArgument);
608 .SetArgumentAttributes(n, functionNodeArgument->attributes());
614 for (
auto & v : demandSet.TopSet_.Variables())
616 if (outerVariableMap.contains(&v))
618 topVariableMap.insert(&v, lambdaNode.
AddContextVar(*outerVariableMap.lookup(&v)).
inner);
623 topVariableMap.insert(&v, value);
635 std::vector<rvsdg::Output *> results;
636 for (
const auto & result : exitAggregationNode)
654 blockAggregationNode.
tacs(),
666 for (
const auto & child : linearAggregationNode)
682 auto split = branchAggregationNode.
parent()->
child(branchAggregationNode.
index() - 1);
683 while (!is<BasicBlockAggregationNode>(split))
684 split = split->
child(split->nchildren() - 1);
686 JLM_ASSERT(is<BranchOperation>(sb.last()->operation()));
695 std::unordered_map<const Variable *, rvsdg::Input *> gammaInputMap;
696 for (
auto & v : demandSet.InputVariables().Variables())
703 std::unordered_map<const Variable *, std::vector<rvsdg::Output *>> xvmap;
705 for (
size_t n = 0; n < gamma->nsubregions(); n++)
707 regionalizedVariableMap.
PushRegion(*gamma->subregion(n));
708 for (
const auto & pair : gammaInputMap)
710 auto rolevar = gamma->MapInput(*pair.second);
711 if (
auto entryvar = std::get_if<rvsdg::GammaNode::EntryVar>(&rolevar))
718 *branchAggregationNode.
child(n),
721 regionalizedVariableMap);
723 for (
auto & v : demandSet.OutputVariables().Variables())
731 for (
auto & v : demandSet.OutputVariables().Variables())
745 auto & parentRegion = regionalizedVariableMap.
GetTopRegion();
749 regionalizedVariableMap.
PushRegion(*theta->subregion());
751 auto & outerVariableMap =
758 std::unordered_map<const Variable *, rvsdg::ThetaNode::LoopVar> thetaLoopVarMap;
759 for (
auto & v : demandSet.LoopVariables().Variables())
762 if (!outerVariableMap.contains(&v))
765 outerVariableMap.insert(&v, value);
769 value = outerVariableMap.lookup(&v);
771 auto loopvar = theta->AddLoopVar(value);
772 thetaLoopVarMap[&v] = loopvar;
773 thetaVariableMap.insert(&v, loopvar.pre);
781 *loopAggregationNode.
child(0),
784 regionalizedVariableMap);
789 for (
auto & v : demandSet.LoopVariables().Variables())
791 JLM_ASSERT(thetaLoopVarMap.find(&v) != thetaLoopVarMap.end());
792 thetaLoopVarMap[&v].post->divert_to(thetaVariableMap.lookup(&v));
798 auto lblock = loopAggregationNode.
child(0);
799 while (lblock->nchildren() != 0)
800 lblock = lblock->
child(lblock->nchildren() - 1);
801 JLM_ASSERT(is<BasicBlockAggregationNode>(lblock));
803 JLM_ASSERT(is<BranchOperation>(bb.last()->operation()));
804 auto predicate = bb.last()->operand(0);
809 theta->set_predicate(thetaVariableMap.lookup(predicate));
811 for (
auto & v : demandSet.LoopVariables().Variables())
814 outerVariableMap.insert(&v, thetaLoopVarMap[&v].output);
827 Convert(*entryNode, demandMap, lambdaNode, regionalizedVariableMap);
831 Convert(*exitNode, demandMap, lambdaNode, regionalizedVariableMap);
835 Convert(*blockNode, demandMap, lambdaNode, regionalizedVariableMap);
839 Convert(*linearNode, demandMap, lambdaNode, regionalizedVariableMap);
843 Convert(*branchNode, demandMap, lambdaNode, regionalizedVariableMap);
847 Convert(*loopNode, demandMap, lambdaNode, regionalizedVariableMap);
858 const std::string & functionName,
868 restructureControlFlowGraph,
873 static std::unique_ptr<AggregationNode>
876 const std::string & functionName,
881 auto aggregationTreeRoot =
aggregate(controlFlowGraph);
884 return aggregationTreeRoot;
888 aggregateControlFlowGraph,
892 return aggregationTreeRoot;
895 static std::unique_ptr<AnnotationMap>
898 const std::string & functionName,
912 const std::string & functionName,
913 std::shared_ptr<const rvsdg::FunctionType> functionType,
914 const Linkage & functionLinkage,
920 std::make_unique<llvm::LlvmLambdaOperation>(
921 std::move(functionType),
924 functionAttributes));
926 auto convertAggregationTreeToLambda = [&]()
932 convertAggregationTreeToLambda,
935 return lambdaNode->output();
944 auto & functionName = functionNode.
name();
945 auto & controlFlowGraph = *functionNode.
cfg();
949 purge(controlFlowGraph);
953 auto aggregationTreeRoot =
959 *aggregationTreeRoot,
961 regionalizedVariableMap,
966 statisticsCollector);
983 if (functionNode.
cfg() ==
nullptr)
1005 for (
const auto & tac : init.
tacs())
1008 return variableMap.lookup(init.
value());
1022 auto & region = regionalizedVariableMap.
GetTopRegion();
1027 if (!dataNodeInitialization)
1050 regionalizedVariableMap.
PushRegion(*deltaNode->subregion());
1055 for (
const auto & dependency : dataNode)
1057 auto dependencyVariable = interProceduralGraphModule.variable(dependency);
1058 auto ctxVar = deltaNode->AddContextVar(*outerVariableMap.lookup(dependencyVariable));
1063 *dataNodeInitialization,
1064 *deltaNode->subregion(),
1065 regionalizedVariableMap);
1066 auto deltaOutput = &deltaNode->finalize(initOutput);
1073 convertDataNodeToDeltaNode,
1075 dataNodeInitialization ? dataNodeInitialization->tacs().size() : 0);
1086 if (
auto functionNode =
dynamic_cast<const FunctionNode *
>(&ipgNode))
1089 if (
auto dataNode =
dynamic_cast<const DataNode *
>(&ipgNode))
1090 return ConvertDataNode(*dataNode, regionalizedVariableMap, statisticsCollector);
1097 const std::unordered_set<const InterProceduralGraphNode *> & stronglyConnectedComponent,
1107 if (stronglyConnectedComponent.size() == 1
1108 && !(*stronglyConnectedComponent.begin())->is_selfrecursive())
1110 auto & ipgNode = *stronglyConnectedComponent.
begin();
1115 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1128 auto & outerVariableMap =
1135 std::unordered_map<const Variable *, rvsdg::PhiNode::FixVar> recursionVariables;
1136 for (
const auto & ipgNode : stronglyConnectedComponent)
1138 auto recursionVariable = pb.
AddFixVar(ipgNode->Type());
1139 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1140 phiVariableMap.insert(ipgNodeVariable, recursionVariable.recref);
1141 JLM_ASSERT(recursionVariables.find(ipgNodeVariable) == recursionVariables.end());
1142 recursionVariables[ipgNodeVariable] = recursionVariable;
1148 for (
const auto & ipgNode : stronglyConnectedComponent)
1150 for (
const auto & ipgNodeDependency : *ipgNode)
1152 auto dependencyVariable = interProceduralGraphModule.variable(ipgNodeDependency);
1153 if (recursionVariables.find(dependencyVariable) == recursionVariables.end())
1154 phiVariableMap.insert(
1163 for (
const auto & ipgNode : stronglyConnectedComponent)
1167 recursionVariables[interProceduralGraphModule.variable(ipgNode)].result->divert_to(output);
1176 for (
const auto & ipgNode : stronglyConnectedComponent)
1178 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1179 auto recursionVariable = recursionVariables[ipgNodeVariable];
1186 static std::unique_ptr<LlvmRvsdgModule>
1195 auto graph = &rvsdgModule->Rvsdg();
1198 interProceduralGraphModule,
1199 graph->GetRootRegion());
1201 auto stronglyConnectedComponents = interProceduralGraphModule.
ipgraph().
find_sccs();
1202 for (
const auto & stronglyConnectedComponent : stronglyConnectedComponents)
1204 stronglyConnectedComponent,
1206 regionalizedVariableMap,
1207 statisticsCollector);
1212 std::unique_ptr<LlvmRvsdgModule>
1218 statisticsCollector,
1221 auto convertInterProceduralGraphModule =
1225 interProceduralGraphModule,
1226 interProceduralGraphToRvsdgStatisticsCollector);
1231 convertInterProceduralGraphModule,
1232 interProceduralGraphModule);
size_t nchildren() const noexcept
size_t index() const noexcept
static void normalize(AggregationNode &node)
AggregationNode * parent() noexcept
AggregationNode * child(size_t n) const noexcept
AggregationStatistics(const util::FilePath &sourceFileName, const std::string &functionName)
static std::unique_ptr< AggregationStatistics > Create(const util::FilePath &sourceFileName, const std::string &functionName)
void Start(const ControlFlowGraph &cfg) noexcept
~AggregationStatistics() override=default
static std::unique_ptr< AggregationTreeToLambdaStatistics > Create(const util::FilePath &sourceFileName, const std::string &functionName)
AggregationTreeToLambdaStatistics(const util::FilePath &sourceFileName, const std::string &functionName)
~AggregationTreeToLambdaStatistics() override=default
T & Lookup(const AggregationNode &aggregationNode) const noexcept
~AnnotationStatistics() override=default
void Start(const AggregationNode &node) noexcept
static std::unique_ptr< AnnotationStatistics > Create(const util::FilePath &sourceFileName, const std::string &functionName)
AnnotationStatistics(const util::FilePath &sourceFileName, const std::string &functionName)
const ThreeAddressCodeList & tacs() const noexcept
~ControlFlowRestructuringStatistics() override=default
static std::unique_ptr< ControlFlowRestructuringStatistics > Create(const util::FilePath &sourceFileName, const std::string &functionName)
void Start(const ControlFlowGraph &cfg) noexcept
ControlFlowRestructuringStatistics(const util::FilePath &sourceFileName, const std::string &functionName)
const Variable * value() const noexcept
const tacsvector_t & tacs() const noexcept
void Start(size_t numInitializationThreeAddressCodes) noexcept
~DataNodeToDeltaStatistics() override=default
DataNodeToDeltaStatistics(const util::FilePath &sourceFileName, const std::string &dataNodeName)
static std::unique_ptr< DataNodeToDeltaStatistics > Create(const util::FilePath &sourceFileName, const std::string &dataNodeName)
const std::shared_ptr< const jlm::rvsdg::Type > & GetValueType() const noexcept
const std::string & name() const noexcept override
const std::string & Section() const noexcept
const llvm::Linkage & linkage() const noexcept override
const DataNodeInit * initialization() const noexcept
bool constant() const noexcept
static std::unique_ptr< DeltaOperation > Create(std::shared_ptr< const rvsdg::Type > type, const std::string &name, const llvm::Linkage &linkage, std::string section, bool constant)
const llvm::Argument * argument(size_t index) const noexcept
size_t narguments() const noexcept
const AttributeSet & attributes() const noexcept
const std::shared_ptr< const rvsdg::FunctionType > & GetFunctionType() const noexcept
const std::string & name() const noexcept override
const llvm::Linkage & linkage() const noexcept override
llvm::ControlFlowGraph * cfg() const noexcept
const jlm::util::FilePath & source_filename() const noexcept
const std::string & target_triple() const noexcept
InterProceduralGraph & ipgraph() noexcept
const_iterator begin() const
const std::string & data_layout() const noexcept
virtual const llvm::Linkage & linkage() const noexcept=0
virtual bool hasBody() const noexcept=0
rvsdg::Output * CollectDataNodeToDeltaStatistics(const std::function< rvsdg::Output *()> &convertDataNodeToDelta, std::string dataNodeName, size_t NumInitializationThreeAddressCodes)
void CollectAggregationTreeToLambdaStatistics(const std::function< void()> &convertAggregationTreeToLambda, std::string functionName)
util::StatisticsCollector & StatisticsCollector_
std::unique_ptr< LlvmRvsdgModule > CollectInterProceduralGraphToRvsdgStatistics(const std::function< std::unique_ptr< LlvmRvsdgModule >(InterProceduralGraphModule &)> &convertInterProceduralGraphModule, InterProceduralGraphModule &interProceduralGraphModule)
std::unique_ptr< AggregationNode > CollectAggregationStatistics(const std::function< std::unique_ptr< AggregationNode >(ControlFlowGraph &)> &aggregateControlFlowGraph, ControlFlowGraph &cfg, std::string functionName)
std::unique_ptr< AnnotationMap > CollectAnnotationStatistics(const std::function< std::unique_ptr< AnnotationMap >(const AggregationNode &)> &annotateAggregationTree, const AggregationNode &aggregationTreeRoot, std::string functionName)
const util::FilePath SourceFileName_
void CollectControlFlowRestructuringStatistics(const std::function< void(ControlFlowGraph *)> &restructureControlFlowGraph, ControlFlowGraph &cfg, std::string functionName)
InterProceduralGraphToRvsdgStatisticsCollector(util::StatisticsCollector &statisticsCollector, util::FilePath sourceFileName)
~InterProceduralGraphToRvsdgStatistics() override=default
void End(const rvsdg::Graph &graph) noexcept
void Start(const InterProceduralGraphModule &interProceduralGraphModule) noexcept
InterProceduralGraphToRvsdgStatistics(const util::FilePath &sourceFileName)
static std::unique_ptr< InterProceduralGraphToRvsdgStatistics > Create(const util::FilePath &sourceFileName)
std::vector< std::unordered_set< const InterProceduralGraphNode * > > find_sccs() const
static LlvmGraphImport & Create(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, bool isConstant=false)
static std::unique_ptr< LlvmRvsdgModule > Create(const util::FilePath &sourceFileName, const std::string &targetTriple, const std::string &dataLayout)
static std::shared_ptr< const PointerType > Create()
~RegionalizedVariableMap()
llvm::VariableMap & VariableMap(size_t n) noexcept
rvsdg::Region & GetRegion(size_t n) noexcept
std::vector< rvsdg::Region * > RegionStack_
rvsdg::Region & GetTopRegion() noexcept
llvm::VariableMap & GetTopVariableMap() noexcept
std::vector< std::unique_ptr< llvm::VariableMap > > VariableMapStack_
const InterProceduralGraphModule & GetInterProceduralGraphModule() const noexcept
const InterProceduralGraphModule & InterProceduralGraphModule_
RegionalizedVariableMap(const InterProceduralGraphModule &interProceduralGraphModule, rvsdg::Region ®ion)
size_t NumRegions() const noexcept
void PushRegion(rvsdg::Region ®ion)
const ThreeAddressCodeVariable * result(size_t index) const noexcept
const Variable * operand(size_t index) const noexcept
size_t nresults() const noexcept
const rvsdg::SimpleOperation & operation() const noexcept
size_t noperands() const noexcept
static jlm::rvsdg::Output * Create(rvsdg::Region ®ion, std::shared_ptr< const jlm::rvsdg::Type > type)
bool contains(const Variable *v) const noexcept
void insert(const Variable *v, rvsdg::Output *o)
std::unordered_map< const Variable *, rvsdg::Output * > Map_
rvsdg::Output * lookup(const Variable *v) const
const jlm::rvsdg::Type & type() const noexcept
static DeltaNode * Create(rvsdg::Region *parent, std::unique_ptr< DeltaOperation > op)
static GammaNode * create(jlm::rvsdg::Output *predicate, size_t nalternatives)
static GraphExport & Create(Output &origin, std::string name)
Region & GetRootRegion() const noexcept
rvsdg::Output * finalize(const std::vector< jlm::rvsdg::Output * > &results)
std::vector< rvsdg::Output * > GetFunctionArguments() const
rvsdg::Region * subregion() const noexcept
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
LambdaOperation & GetOperation() const noexcept override
static Output * Create(Output &predicate, const std::unordered_map< uint64_t, uint64_t > &mapping, const uint64_t defaultAlternative, const size_t numAlternatives)
virtual std::unique_ptr< Operation > copy() const =0
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
rvsdg::Region * subregion() const noexcept
PhiNode::ContextVar AddContextVar(jlm::rvsdg::Output &origin)
PhiNode::FixVar AddFixVar(std::shared_ptr< const jlm::rvsdg::Type > type)
void begin(rvsdg::Region *parent)
Represent acyclic RVSDG subgraphs.
static SimpleNode & Create(Region ®ion, std::unique_ptr< Operation > operation, const std::vector< rvsdg::Output * > &operands)
static ThetaNode * create(rvsdg::Region *parent)
bool isDemanded(Statistics::Id id) const noexcept
Checks if a statistics is demanded.
const StatisticsCollectorSettings & GetSettings() const noexcept
void CollectDemandedStatistics(std::unique_ptr< Statistics > statistics)
util::Timer & GetTimer(const std::string &name)
Statistics(const Statistics::Id &statisticsId, util::FilePath sourceFile)
util::Timer & AddTimer(std::string name)
void AddMeasurement(std::string name, T value)
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
static rvsdg::Output * ConvertDataNode(const DataNode &dataNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static void ConvertStronglyConnectedComponent(const std::unordered_set< const InterProceduralGraphNode * > &stronglyConnectedComponent, rvsdg::Graph &graph, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
void destruct_ssa(ControlFlowGraph &cfg)
static ControlFlowGraphNode * aggregate(ControlFlowGraphNode *, ControlFlowGraphNode *, AggregationMap &)
static rvsdg::Output * ConvertFunctionNode(const FunctionNode &functionNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static std::unique_ptr< AnnotationMap > AnnotateAggregationTree(const AggregationNode &aggregationTreeRoot, const std::string &functionName, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static void ConvertBasicBlock(const ThreeAddressCodeList &basicBlock, rvsdg::Region ®ion, llvm::VariableMap &variableMap)
static void RestructureControlFlow(ControlFlowGraphNode &, ControlFlowGraphNode &, std::vector< TailControlledLoop > &)
static void RestructureControlFlowGraph(ControlFlowGraph &controlFlowGraph, const std::string &functionName, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
bool isDiscardableIfUnused(const Linkage linkage)
static std::unique_ptr< LlvmRvsdgModule > ConvertInterProceduralGraphModule(InterProceduralGraphModule &interProceduralGraphModule, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static void ConvertThreeAddressCode(const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region ®ion, llvm::VariableMap &variableMap)
static void Convert(const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region ®ion, llvm::VariableMap &variableMap)
static rvsdg::Output * ConvertControlFlowGraph(const FunctionNode &functionNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static void ConvertAggregationNode(const AggregationNode &aggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap)
static rvsdg::Output * ConvertInterProceduralGraphNode(const InterProceduralGraphNode &ipgNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static void ConvertSelect(const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &variableMap)
static void ConvertBranch(const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &)
void straighten(ControlFlowGraph &cfg)
static bool requiresExport(const InterProceduralGraphNode &ipgNode)
size_t ntacs(const AggregationNode &root)
std::unique_ptr< AnnotationMap > Annotate(const AggregationNode &aggregationTreeRoot)
static std::unique_ptr< AggregationNode > AggregateControlFlowGraph(ControlFlowGraph &controlFlowGraph, const std::string &functionName, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
static rvsdg::Output * ConvertDataNodeInitialization(const DataNodeInit &init, rvsdg::Region ®ion, RegionalizedVariableMap ®ionalizedVariableMap)
void purge(ControlFlowGraph &cfg)
Remove all basic blocks without instructions.
static void ConvertAssignment(const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &variableMap)
static rvsdg::Output * ConvertAggregationTreeToLambda(const AggregationNode &aggregationTreeRoot, const AnnotationMap &demandMap, RegionalizedVariableMap &scopedVariableMap, const std::string &functionName, std::shared_ptr< const rvsdg::FunctionType > functionType, const Linkage &functionLinkage, const AttributeSet &functionAttributes, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector)
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
rvsdg::Output * inner
Access to bound object in subregion.
rvsdg::Output * inner
Access to bound object in subregion.
static const char * FunctionNameLabel_
static const char * NumRvsdgNodes
static const char * NumThreeAddressCodes
static const char * Timer
static const char * NumCfgNodes