56 std::unordered_map<const Variable *, rvsdg::Output *>
Map_;
144 const std::string & functionName)
163 static std::unique_ptr<ControlFlowRestructuringStatistics>
166 return std::make_unique<ControlFlowRestructuringStatistics>(sourceFileName, functionName);
194 static std::unique_ptr<AggregationStatistics>
197 return std::make_unique<AggregationStatistics>(sourceFileName, functionName);
225 static std::unique_ptr<AnnotationStatistics>
228 return std::make_unique<AnnotationStatistics>(sourceFileName, functionName);
239 const std::string & functionName)
257 static std::unique_ptr<AggregationTreeToLambdaStatistics>
260 return std::make_unique<AggregationTreeToLambdaStatistics>(sourceFileName, functionName);
276 Start(
size_t numInitializationThreeAddressCodes) noexcept
288 static std::unique_ptr<DataNodeToDeltaStatistics>
291 return std::make_unique<DataNodeToDeltaStatistics>(sourceFileName, dataNodeName);
318 static std::unique_ptr<InterProceduralGraphToRvsdgStatistics>
321 return std::make_unique<InterProceduralGraphToRvsdgStatistics>(sourceFileName);
337 const std::function<
void(
ControlFlowGraph *)> & restructureControlFlowGraph,
339 std::string functionName)
346 restructureControlFlowGraph(&cfg);
350 statistics->Start(cfg);
351 restructureControlFlowGraph(&cfg);
357 std::unique_ptr<AggregationNode>
360 aggregateControlFlowGraph,
362 std::string functionName)
367 return aggregateControlFlowGraph(cfg);
369 statistics->Start(cfg);
370 auto aggregationTreeRoot = aggregateControlFlowGraph(cfg);
375 return aggregationTreeRoot;
378 std::unique_ptr<AnnotationMap>
380 const std::function<std::unique_ptr<AnnotationMap>(
const AggregationNode &)> &
381 annotateAggregationTree,
383 std::string functionName)
388 return annotateAggregationTree(aggregationTreeRoot);
390 statistics->Start(aggregationTreeRoot);
391 auto demandMap = annotateAggregationTree(aggregationTreeRoot);
401 const std::function<
void()> & convertAggregationTreeToLambda,
402 std::string functionName)
408 return convertAggregationTreeToLambda();
411 convertAggregationTreeToLambda();
419 const std::function<
rvsdg::Output *()> & convertDataNodeToDelta,
420 std::string dataNodeName,
421 size_t NumInitializationThreeAddressCodes)
426 return convertDataNodeToDelta();
428 statistics->Start(NumInitializationThreeAddressCodes);
429 auto output = convertDataNodeToDelta();
437 std::unique_ptr<LlvmRvsdgModule>
440 convertInterProceduralGraphModule,
446 return convertInterProceduralGraphModule(interProceduralGraphModule);
448 statistics->Start(interProceduralGraphModule);
449 auto rvsdgModule = convertInterProceduralGraphModule(interProceduralGraphModule);
450 statistics->End(rvsdgModule->Rvsdg());
476 auto lhs = threeAddressCode.
operand(0);
477 auto rhs = threeAddressCode.
operand(1);
494 auto ev1 = gamma->AddEntryVar(variableMap.
lookup(threeAddressCode.
operand(2)));
495 auto ev2 = gamma->AddEntryVar(variableMap.
lookup(threeAddressCode.
operand(1)));
496 auto ex = gamma->AddExitVar({ ev1.branchArgument[0], ev2.branchArgument[1] });
497 variableMap.
insert(threeAddressCode.
result(0), ex.output);
509 template<
class TNode,
class TOperation>
516 std::vector<rvsdg::Output *>
operands;
517 for (
size_t n = 0; n < threeAddressCode.
noperands(); n++)
519 auto operand = threeAddressCode.
operand(n);
523 std::unique_ptr<TOperation> operation(
524 util::assertedCast<TOperation>(threeAddressCode.
operation().
copy().release()));
525 auto results = TNode::Create(region, std::move(operation),
operands);
528 for (
size_t n = 0; n < threeAddressCode.
nresults(); n++)
530 auto result = threeAddressCode.
result(n);
531 variableMap.
insert(result, results[n]);
541 if (is<AssignmentOperation>(&threeAddressCode))
545 else if (is<SelectOperation>(&threeAddressCode))
549 else if (is<BranchOperation>(&threeAddressCode))
555 std::vector<rvsdg::Output *>
operands;
556 for (
size_t n = 0; n < threeAddressCode.
noperands(); n++)
563 for (
size_t n = 0; n < threeAddressCode.
nresults(); n++)
564 variableMap.
insert(threeAddressCode.
result(n), results[n]);
574 for (
const auto & threeAddressCode : basicBlock)
580 const AggregationNode & aggregationNode,
581 const AnnotationMap & demandMap,
583 RegionalizedVariableMap & regionalizedVariableMap);
596 auto & outerVariableMap =
605 for (
size_t n = 0; n < entryAggregationNode.
narguments(); n++)
607 auto functionNodeArgument = entryAggregationNode.
argument(n);
608 auto lambdaNodeArgument = lambdaArgs[n];
610 topVariableMap.insert(functionNodeArgument, lambdaNodeArgument);
612 .SetArgumentAttributes(n, functionNodeArgument->attributes());
618 for (
auto & v : demandSet.TopSet_.Variables())
620 if (outerVariableMap.contains(&v))
622 topVariableMap.insert(&v, lambdaNode.
AddContextVar(*outerVariableMap.lookup(&v)).
inner);
627 topVariableMap.insert(&v, value);
639 std::vector<rvsdg::Output *> results;
640 for (
const auto & result : exitAggregationNode)
658 blockAggregationNode.
tacs(),
670 for (
const auto & child : linearAggregationNode)
686 auto split = branchAggregationNode.
parent()->
child(branchAggregationNode.
index() - 1);
687 while (!is<BasicBlockAggregationNode>(split))
688 split = split->
child(split->nchildren() - 1);
690 JLM_ASSERT(is<BranchOperation>(sb.last()->operation()));
699 std::unordered_map<const Variable *, rvsdg::Input *> gammaInputMap;
700 for (
auto & v : demandSet.InputVariables().Variables())
707 std::unordered_map<const Variable *, std::vector<rvsdg::Output *>> xvmap;
709 for (
size_t n = 0; n < gamma->nsubregions(); n++)
711 regionalizedVariableMap.
PushRegion(*gamma->subregion(n));
712 for (
const auto & pair : gammaInputMap)
714 auto rolevar = gamma->MapInput(*pair.second);
715 if (
auto entryvar = std::get_if<rvsdg::GammaNode::EntryVar>(&rolevar))
722 *branchAggregationNode.
child(n),
725 regionalizedVariableMap);
727 for (
auto & v : demandSet.OutputVariables().Variables())
735 for (
auto & v : demandSet.OutputVariables().Variables())
749 auto & parentRegion = regionalizedVariableMap.
GetTopRegion();
753 regionalizedVariableMap.
PushRegion(*theta->subregion());
755 auto & outerVariableMap =
762 std::unordered_map<const Variable *, rvsdg::ThetaNode::LoopVar> thetaLoopVarMap;
763 for (
auto & v : demandSet.LoopVariables().Variables())
766 if (!outerVariableMap.contains(&v))
769 outerVariableMap.insert(&v, value);
773 value = outerVariableMap.lookup(&v);
775 auto loopvar = theta->AddLoopVar(value);
776 thetaLoopVarMap[&v] = loopvar;
777 thetaVariableMap.insert(&v, loopvar.pre);
785 *loopAggregationNode.
child(0),
788 regionalizedVariableMap);
793 for (
auto & v : demandSet.LoopVariables().Variables())
795 JLM_ASSERT(thetaLoopVarMap.find(&v) != thetaLoopVarMap.end());
796 thetaLoopVarMap[&v].post->divert_to(thetaVariableMap.lookup(&v));
802 auto lblock = loopAggregationNode.
child(0);
803 while (lblock->nchildren() != 0)
804 lblock = lblock->
child(lblock->nchildren() - 1);
805 JLM_ASSERT(is<BasicBlockAggregationNode>(lblock));
807 JLM_ASSERT(is<BranchOperation>(bb.last()->operation()));
808 auto predicate = bb.last()->operand(0);
813 theta->set_predicate(thetaVariableMap.lookup(predicate));
815 for (
auto & v : demandSet.LoopVariables().Variables())
818 outerVariableMap.insert(&v, thetaLoopVarMap[&v].output);
831 Convert(*entryNode, demandMap, lambdaNode, regionalizedVariableMap);
835 Convert(*exitNode, demandMap, lambdaNode, regionalizedVariableMap);
839 Convert(*blockNode, demandMap, lambdaNode, regionalizedVariableMap);
843 Convert(*linearNode, demandMap, lambdaNode, regionalizedVariableMap);
847 Convert(*branchNode, demandMap, lambdaNode, regionalizedVariableMap);
851 Convert(*loopNode, demandMap, lambdaNode, regionalizedVariableMap);
862 const std::string & functionName,
872 restructureControlFlowGraph,
877 static std::unique_ptr<AggregationNode>
880 const std::string & functionName,
885 auto aggregationTreeRoot =
aggregate(controlFlowGraph);
888 return aggregationTreeRoot;
892 aggregateControlFlowGraph,
896 return aggregationTreeRoot;
899 static std::unique_ptr<AnnotationMap>
902 const std::string & functionName,
916 const std::string & functionName,
917 std::shared_ptr<const rvsdg::FunctionType> functionType,
918 const Linkage & functionLinkage,
925 std::make_unique<llvm::LlvmLambdaOperation>(
926 std::move(functionType),
929 functionCallingConvention,
930 functionAttributes));
932 auto convertAggregationTreeToLambda = [&]()
938 convertAggregationTreeToLambda,
941 return lambdaNode->output();
950 auto & functionName = functionNode.
name();
951 auto & controlFlowGraph = *functionNode.
cfg();
955 purge(controlFlowGraph);
959 auto aggregationTreeRoot =
965 *aggregationTreeRoot,
967 regionalizedVariableMap,
990 if (functionNode.
cfg() ==
nullptr)
1010 for (
const auto & tac : init.
tacs())
1013 return variableMap.lookup(init.
value());
1027 auto & region = regionalizedVariableMap.
GetTopRegion();
1032 if (!dataNodeInitialization)
1057 regionalizedVariableMap.
PushRegion(*deltaNode->subregion());
1062 for (
const auto & dependency : dataNode)
1064 auto dependencyVariable = interProceduralGraphModule.variable(dependency);
1065 auto ctxVar = deltaNode->AddContextVar(*outerVariableMap.lookup(dependencyVariable));
1070 *dataNodeInitialization,
1071 *deltaNode->subregion(),
1072 regionalizedVariableMap);
1073 auto deltaOutput = &deltaNode->finalize(initOutput);
1080 convertDataNodeToDeltaNode,
1082 dataNodeInitialization ? dataNodeInitialization->tacs().size() : 0);
1093 if (
auto functionNode =
dynamic_cast<const FunctionNode *
>(&ipgNode))
1096 if (
auto dataNode =
dynamic_cast<const DataNode *
>(&ipgNode))
1104 const std::unordered_set<const InterProceduralGraphNode *> & stronglyConnectedComponent,
1114 if (stronglyConnectedComponent.size() == 1
1115 && !(*stronglyConnectedComponent.begin())->is_selfrecursive())
1117 auto & ipgNode = *stronglyConnectedComponent.
begin();
1122 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1135 auto & outerVariableMap =
1142 std::unordered_map<const Variable *, rvsdg::PhiNode::FixVar> recursionVariables;
1143 for (
const auto & ipgNode : stronglyConnectedComponent)
1145 auto recursionVariable = pb.
AddFixVar(ipgNode->Type());
1146 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1147 phiVariableMap.insert(ipgNodeVariable, recursionVariable.recref);
1148 JLM_ASSERT(recursionVariables.find(ipgNodeVariable) == recursionVariables.end());
1149 recursionVariables[ipgNodeVariable] = recursionVariable;
1155 for (
const auto & ipgNode : stronglyConnectedComponent)
1157 for (
const auto & ipgNodeDependency : *ipgNode)
1159 auto dependencyVariable = interProceduralGraphModule.variable(ipgNodeDependency);
1160 if (recursionVariables.find(dependencyVariable) == recursionVariables.end())
1161 phiVariableMap.insert(
1170 for (
const auto & ipgNode : stronglyConnectedComponent)
1174 recursionVariables[interProceduralGraphModule.variable(ipgNode)].result->divert_to(output);
1183 for (
const auto & ipgNode : stronglyConnectedComponent)
1185 auto ipgNodeVariable = interProceduralGraphModule.variable(ipgNode);
1186 auto recursionVariable = recursionVariables[ipgNodeVariable];
1193 static std::unique_ptr<LlvmRvsdgModule>
1202 auto graph = &rvsdgModule->Rvsdg();
1205 interProceduralGraphModule,
1206 graph->GetRootRegion());
1208 auto stronglyConnectedComponents = interProceduralGraphModule.
ipgraph().
find_sccs();
1209 for (
const auto & stronglyConnectedComponent : stronglyConnectedComponents)
1211 stronglyConnectedComponent,
1213 regionalizedVariableMap,
1219 std::unique_ptr<LlvmRvsdgModule>
1228 auto convertInterProceduralGraphModule =
1232 interProceduralGraphModule,
1233 interProceduralGraphToRvsdgStatisticsCollector);
1238 convertInterProceduralGraphModule,
1239 interProceduralGraphModule);
static jlm::util::StatisticsCollector statisticsCollector
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
size_t getAlignment() 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 Linkage &linkage, std::string section, bool constant, const size_t alignment)
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 CallingConvention & callingConvention() const noexcept
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 & createGlobalImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::Type > valueType, std::shared_ptr< const rvsdg::Type > importedType, std::string name, Linkage linkage, const bool isConstant, const size_t alignment)
static LlvmGraphImport & createFunctionImport(rvsdg::Graph &graph, std::shared_ptr< const rvsdg::FunctionType > functionType, std::string name, Linkage linkage, CallingConvention callingConvention)
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 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 CallingConvention &functionCallingConvention, const AttributeSet &functionAttributes, 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)
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