|
Jlm
|
Global memory state passed between functions. More...
Namespaces | |
| namespace | aa |
Typedefs | |
| using | BasicBlockMap = util::BijectiveMap< const ::llvm::BasicBlock *, BasicBlock * > |
| using | IntegerValueRepresentation = rvsdg::BitValueRepresentation |
| using | MemoryNodeId = std::size_t |
| typedef std::vector< std::unique_ptr< llvm::ThreeAddressCode > > | tacsvector_t |
| using | VectorNodeHashMap = std::unordered_map< std::vector< uint64_t >, rvsdg::Node *, VectorHash > |
| using | TopNodeLeaderList = std::vector< const rvsdg::Node * > |
Enumerations | |
| enum class | CallingConvention { C , Default = C , Fast , Cold , Tail } |
| enum class | Linkage { externalLinkage , availableExternallyLinkage , linkOnceAnyLinkage , linkOnceOdrLinkage , weakAnyLinkage , weakOdrLinkage , appendingLinkage , internalLinkage , privateLinkage , externalWeakLinkage , commonLinkage } |
| enum class | ICmpPredicate { Eq , Ne , Ugt , Uge , Ult , Ule , Sgt , Sge , Slt , Sle } |
| enum class | fpcmp { TRUE , FALSE , oeq , ogt , oge , olt , ole , one , ord , ueq , ugt , uge , ult , ule , une , uno } |
| enum class | fpop { add , sub , mul , div , mod } |
| enum class | fpsize { half , flt , dbl , x86fp80 , fp128 } |
| enum class | CorrelationType { ControlConstantCorrelation , MatchConstantCorrelation , MatchCorrelation } |
| enum class | StoreNodeInfo { ValueForwarding , ClobberNoForward , NoClobber } |
| enum class | LoadNodeInfo { ValueForwarding , NoClobber } |
Functions | |
| ::llvm::APInt | convert_bitvalue_repr (const rvsdg::BitValueRepresentation &vr) |
| static bool | is_identity_mapping (const rvsdg::MatchOperation &op) |
| static const llvm::ThreeAddressCode * | get_match (const llvm::ThreeAddressCode *branch) |
| static bool | has_return_value (const ControlFlowGraph &cfg) |
| static TailControlledLoop | ExtractLoop (ControlFlowGraphNode &loopEntry, ControlFlowGraphNode &loopExit) |
| static void | ReinsertLoop (const TailControlledLoop &loop) |
| static const ThreeAddressCodeVariable * | CreateContinuationVariable (BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type) |
| static const ThreeAddressCodeVariable & | CreateLoopExitVariable (BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type) |
| static const ThreeAddressCodeVariable & | CreateLoopEntryVariable (BasicBlock &bb, std::shared_ptr< const rvsdg::ControlType > type) |
| static const ThreeAddressCodeVariable & | CreateLoopRepetitionVariable (BasicBlock &basicBlock) |
| static void | AppendBranch (BasicBlock &basicBlock, const Variable *operand) |
| static void | AppendConstantAssignment (BasicBlock &basicBlock, const ThreeAddressCodeVariable &variable, const size_t value) |
| static void | RestructureLoopEntry (const StronglyConnectedComponentStructure &sccStructure, BasicBlock *newEntryNode, const ThreeAddressCodeVariable *entryVariable) |
| static void | RestructureLoopExit (const StronglyConnectedComponentStructure &sccStructure, BasicBlock &newRepetitionNode, BasicBlock &newExitNode, ControlFlowGraphNode ®ionExit, const ThreeAddressCodeVariable &repetitionVariable, const ThreeAddressCodeVariable *exitVariable) |
| static void | RestructureLoopRepetition (const StronglyConnectedComponentStructure &sccStructure, ControlFlowGraphNode &newRepetitionNode, const ThreeAddressCodeVariable *entryVariable, const ThreeAddressCodeVariable &repetitionVariable) |
| static BasicBlock * | GetEntryVariableBlock (ControlFlowGraphNode *node) |
| static void | RestructureControlFlow (ControlFlowGraphNode &, ControlFlowGraphNode &, std::vector< TailControlledLoop > &) |
| static std::unique_ptr< rvsdg::MatchOperation > | invertMatchOperation (const rvsdg::MatchOperation &matchOperation) |
| static void | adjustLoopRepetitionEdge (const StronglyConnectedComponentStructure &sccStructure) |
| static void | RestructureLoops (ControlFlowGraphNode ®ionEntry, ControlFlowGraphNode ®ionExit, std::vector< TailControlledLoop > &loops) |
| static ControlFlowGraphNode & | ComputeHeadBranch (ControlFlowGraphNode &start, ControlFlowGraphNode &end) |
| static util::HashSet< ControlFlowGraphNode * > | ComputeDominatorGraph (const ControlFlowGraphEdge *edge) |
| static Continuation | ComputeContinuation (const ControlFlowGraphNode &headBranch) |
| static void | RestructureBranches (ControlFlowGraphNode &entry, ControlFlowGraphNode &exit) |
| void | RestructureLoops (ControlFlowGraph &cfg) |
| void | RestructureBranches (ControlFlowGraph &cfg) |
| void | RestructureControlFlow (ControlFlowGraph &cfg) |
| static bool | requiresExport (const InterProceduralGraphNode &ipgNode) |
| static void | ConvertAssignment (const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &variableMap) |
| static void | ConvertSelect (const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &variableMap) |
| static void | ConvertBranch (const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region &, llvm::VariableMap &) |
| template<class TNode , class TOperation > | |
| static void | Convert (const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region ®ion, llvm::VariableMap &variableMap) |
| static void | ConvertThreeAddressCode (const llvm::ThreeAddressCode &threeAddressCode, rvsdg::Region ®ion, llvm::VariableMap &variableMap) |
| static void | ConvertBasicBlock (const ThreeAddressCodeList &basicBlock, rvsdg::Region ®ion, llvm::VariableMap &variableMap) |
| static void | ConvertAggregationNode (const AggregationNode &aggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const EntryAggregationNode &entryAggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const ExitAggregationNode &exitAggregationNode, const AnnotationMap &, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const BasicBlockAggregationNode &blockAggregationNode, const AnnotationMap &, rvsdg::LambdaNode &, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const LinearAggregationNode &linearAggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const BranchAggregationNode &branchAggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | Convert (const LoopAggregationNode &loopAggregationNode, const AnnotationMap &demandMap, rvsdg::LambdaNode &lambdaNode, RegionalizedVariableMap ®ionalizedVariableMap) |
| static void | RestructureControlFlowGraph (ControlFlowGraph &controlFlowGraph, const std::string &functionName, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static std::unique_ptr< AggregationNode > | AggregateControlFlowGraph (ControlFlowGraph &controlFlowGraph, const std::string &functionName, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static std::unique_ptr< AnnotationMap > | AnnotateAggregationTree (const AggregationNode &aggregationTreeRoot, const std::string &functionName, 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 rvsdg::Output * | ConvertControlFlowGraph (const FunctionNode &functionNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static rvsdg::Output * | ConvertFunctionNode (const FunctionNode &functionNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static rvsdg::Output * | ConvertDataNodeInitialization (const DataNodeInit &init, rvsdg::Region ®ion, RegionalizedVariableMap ®ionalizedVariableMap) |
| static rvsdg::Output * | ConvertDataNode (const DataNode &dataNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static rvsdg::Output * | ConvertInterProceduralGraphNode (const InterProceduralGraphNode &ipgNode, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static void | ConvertStronglyConnectedComponent (const std::unordered_set< const InterProceduralGraphNode * > &stronglyConnectedComponent, rvsdg::Graph &graph, RegionalizedVariableMap ®ionalizedVariableMap, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| static std::unique_ptr< LlvmRvsdgModule > | ConvertInterProceduralGraphModule (InterProceduralGraphModule &interProceduralGraphModule, InterProceduralGraphToRvsdgStatisticsCollector &statisticsCollector) |
| std::unique_ptr< LlvmRvsdgModule > | ConvertInterProceduralGraphModule (InterProceduralGraphModule &interProceduralGraphModule, util::StatisticsCollector &statisticsCollector) |
| static const Variable * | ConvertConstant (::llvm::Constant *, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &, Context &) |
| static const Variable * | convertInstruction (::llvm::Instruction *instruction, std::vector< std::unique_ptr< ThreeAddressCode > > &threeAddressCodes, Context &context) |
| const Variable * | ConvertValueOrFunction (::llvm::Value *v, tacsvector_t &tacs, Context &ctx) |
| const Variable * | ConvertValue (::llvm::Value *v, tacsvector_t &tacs, Context &ctx) |
| static rvsdg::BitValueRepresentation | convert_apint (const ::llvm::APInt &value) |
| Attribute::kind | ConvertAttributeKind (const ::llvm::Attribute::AttrKind &kind) |
| static EnumAttribute | ConvertEnumAttribute (const ::llvm::Attribute &attribute) |
| static IntAttribute | ConvertIntAttribute (const ::llvm::Attribute &attribute) |
| static TypeAttribute | ConvertTypeAttribute (const ::llvm::Attribute &attribute, TypeConverter &typeConverter) |
| static StringAttribute | ConvertStringAttribute (const ::llvm::Attribute &attribute) |
| static AttributeSet | convert_attributes (const ::llvm::AttributeSet &as, TypeConverter &typeConverter) |
| AttributeList | convertAttributeList (const ::llvm::AttributeList &attributeList, const size_t numParameters, TypeConverter &typeConverter) |
| static const Variable * | convert_int_constant (::llvm::Constant *c, std::vector< std::unique_ptr< ThreeAddressCode > > &tacs, Context &) |
| static const Variable * | convert_undefvalue (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantExpr (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantFP (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_globalVariable (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantPointerNull (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_blockAddress (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &, Context &) |
| static const Variable * | convert_constantAggregateZero (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantArray (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantDataArray (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantDataVector (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | ConvertConstantStruct (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_constantVector (::llvm::Constant *c, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &tacs, Context &ctx) |
| static const Variable * | convert_globalAlias (::llvm::Constant *constant, std::vector< std::unique_ptr< llvm::ThreeAddressCode > > &, Context &) |
| static const Variable * | convert_function (::llvm::Constant *c, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | ConvertConstant (::llvm::PoisonValue *poisonValue, tacsvector_t &threeAddressCodeVector, Context &context) |
| template<class T > | |
| static const Variable * | ConvertConstant (::llvm::Constant *constant, tacsvector_t &threeAddressCodeVector, Context &context) |
| static std::vector< std::unique_ptr< llvm::ThreeAddressCode > > | ConvertConstant (::llvm::Constant *c, Context &ctx) |
| static const Variable * | convert_return_instruction (::llvm::Instruction *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | ConvertBranchInstruction (::llvm::Instruction *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convertSwitchInstruction (::llvm::SwitchInst *switchInstruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_unreachable_instruction (::llvm::Instruction *i, tacsvector_t &, Context &ctx) |
| static std::unique_ptr< rvsdg::BinaryOperation > | ConvertIntegerIcmpPredicate (const ::llvm::CmpInst::Predicate predicate, const std::size_t numBits) |
| static std::unique_ptr< rvsdg::BinaryOperation > | ConvertPointerIcmpPredicate (const ::llvm::CmpInst::Predicate predicate) |
| static const Variable * | convert (const ::llvm::ICmpInst *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_fcmp_instruction (::llvm::Instruction *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | AddIOBarrier (tacsvector_t &tacs, const Variable *operand, const Context &ctx) |
| static const Variable * | addMemoryHoistBarrier (tacsvector_t &tacs, const Variable *address, const Context &ctx) |
| static const Variable * | convert_load_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_store_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | ConvertPhiInstruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_getelementptr_instruction (::llvm::Instruction *inst, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convertMallocCall (const ::llvm::CallInst &instruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | convertFreeCall (const ::llvm::CallInst &instruction, tacsvector_t &threeAddressCodes, Context &context) |
| static bool | IsVolatile (const ::llvm::Value &value) |
| static const Variable * | convertMemCpyCall (const ::llvm::IntrinsicInst *instruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | convertMemSetCall (const ::llvm::IntrinsicInst &instruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | convertMemMoveCall (const ::llvm::IntrinsicInst &instruction, tacsvector_t &threeAddressCodes, Context &context) |
| static bool | isMallocCall (const ::llvm::CallInst &callInstruction) |
| static bool | isFreeCall (const ::llvm::CallInst &callInstruction) |
| static const Variable * | convertFMulAddIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convertCeilIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertRIntIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertTruncIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertFloorIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertRoundIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertFShlIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertSMaxIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertUMaxIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertSMinIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertUMinIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertCopysignIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertPtrMaskIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertFAbsIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertAbsIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertBSwapIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertCtlzIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertCttzIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertCtpopIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertIsConstantIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertIsFPClassIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertSAddWithOverflowIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertUAddWithOverflowIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertSSubWithOverflowIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertSMulWithOverflowIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convertUMulWithOverflowIntrinsic (const ::llvm::CallInst &instruction, tacsvector_t &tacs, Context &context) |
| std::vector< const Variable * > | convertCallArguments (const ::llvm::CallInst &callInstruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | createCall (const ::llvm::CallInst &callInstruction, tacsvector_t &threeAddressCodes, Context &context) |
| static bool | shouldIgnoreIntrinsic (::llvm::Intrinsic::ID intrinsicId) |
| static const Variable * | convertIntrinsicInstruction (const ::llvm::IntrinsicInst &intrinsicInstruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | convertCallInstruction (const ::llvm::CallInst &callInstruction, tacsvector_t &threeAddressCodes, Context &context) |
| static const Variable * | convert_select_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static std::unique_ptr< rvsdg::BinaryOperation > | ConvertIntegerBinaryOperation (const ::llvm::Instruction::BinaryOps binaryOperation, std::size_t numBits) |
| static std::unique_ptr< rvsdg::BinaryOperation > | ConvertFloatingPointBinaryOperation (const ::llvm::Instruction::BinaryOps binaryOperation, fpsize floatingPointSize) |
| static const Variable * | convert (const ::llvm::BinaryOperator *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_alloca_instruction (::llvm::Instruction *instruction, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_extractvalue (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convertInsertValueInstruction (const ::llvm::InsertValueInst &instruction, tacsvector_t &tacs, Context &context) |
| static const Variable * | convert_extractelement_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert (::llvm::ShuffleVectorInst *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert_insertelement_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convertFreezeInstruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| static const Variable * | convert (::llvm::UnaryOperator *unaryOperator, tacsvector_t &threeAddressCodeVector, Context &ctx) |
| template<class OP > | |
| static std::unique_ptr< rvsdg::SimpleOperation > | create_unop (std::shared_ptr< const rvsdg::Type > st, std::shared_ptr< const rvsdg::Type > dt) |
| static const Variable * | convert_cast_instruction (::llvm::Instruction *i, tacsvector_t &tacs, Context &ctx) |
| template<class INSTRUCTIONTYPE > | |
| static const Variable * | convert (::llvm::Instruction *instruction, tacsvector_t &tacs, Context &ctx) |
| static std::vector<::llvm::PHINode * > | convert_instructions (::llvm::Function &function, Context &ctx) |
| static void | PatchPhiOperands (const std::vector<::llvm::PHINode * > &phis, Context &ctx) |
| static BasicBlockMap | convert_basic_blocks (::llvm::Function &f, ControlFlowGraph &cfg) |
| static std::unique_ptr< llvm::Argument > | convert_argument (const ::llvm::Argument &argument, Context &ctx) |
| static void | EnsureSingleInEdgeToExitNode (ControlFlowGraph &cfg) |
| static std::unique_ptr< ControlFlowGraph > | create_cfg (::llvm::Function &f, Context &ctx) |
| static void | convert_function (::llvm::Function &function, Context &ctx) |
| static const llvm::Linkage & | convert_linkage (const ::llvm::GlobalValue::LinkageTypes &linkage) |
| static void | declare_globals (::llvm::Module &lm, Context &ctx) |
| static std::unique_ptr< DataNodeInit > | create_initialization (::llvm::GlobalVariable &gv, Context &ctx) |
| static void | convert_global_value (::llvm::GlobalVariable &gv, Context &ctx) |
| static void | convert_globals (::llvm::Module &lm, Context &ctx) |
| std::unique_ptr< InterProceduralGraphModule > | ConvertLlvmModule (::llvm::Module &llvmModule) |
| static bool | is_sese_basic_block (const ControlFlowGraphNode *node) noexcept |
| static bool | is_branch_split (const ControlFlowGraphNode *node) noexcept |
| static bool | is_branch_join (const ControlFlowGraphNode *node) noexcept |
| static bool | is_branch (const ControlFlowGraphNode *split) noexcept |
| static bool | is_linear (const ControlFlowGraphNode *node) noexcept |
| static ControlFlowGraphNode * | aggregate (ControlFlowGraphNode *, ControlFlowGraphNode *, AggregationMap &) |
| static void | reduceLoop (const StronglyConnectedComponentStructure &sccStruct, AggregationMap &map) |
| static ControlFlowGraphNode * | reduce_branch (ControlFlowGraphNode *split, ControlFlowGraphNode **entry, AggregationMap &map) |
| static ControlFlowGraphNode * | reduce_linear (ControlFlowGraphNode *source, ControlFlowGraphNode **entry, ControlFlowGraphNode **exit, AggregationMap &map) |
| static void | aggregate_loops (ControlFlowGraphNode *entry, ControlFlowGraphNode *exit, AggregationMap &map) |
| static void | aggregate_acyclic_sese (ControlFlowGraphNode *node, ControlFlowGraphNode **entry, ControlFlowGraphNode **exit, AggregationMap &map) |
| std::unique_ptr< AggregationNode > | aggregate (ControlFlowGraph &cfg) |
| Aggregate a properly structured CFG to a aggregation tree. | |
| size_t | ntacs (const AggregationNode &root) |
| template<class T > | |
| static bool | is (const AggregationNode *node) |
| static void | AnnotateReadWrite (const AggregationNode &, AnnotationMap &) |
| static void | AnnotateReadWrite (const EntryAggregationNode &entryAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateReadWrite (const ExitAggregationNode &exitAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateReadWrite (const BasicBlockAggregationNode &basicBlockAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateReadWrite (const LinearAggregationNode &linearAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateReadWrite (const BranchAggregationNode &branchAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateReadWrite (const LoopAggregationNode &loopAggregationNode, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const AggregationNode &, VariableSet &, AnnotationMap &) |
| static void | AnnotateDemandSet (const EntryAggregationNode &entryAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const ExitAggregationNode &exitAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const BasicBlockAggregationNode &basicBlockAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const LinearAggregationNode &linearAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const BranchAggregationNode &branchAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| static void | AnnotateDemandSet (const LoopAggregationNode &loopAggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| template<class T > | |
| static void | AnnotateDemandSet (const AggregationNode *aggregationNode, VariableSet &workingSet, AnnotationMap &demandMap) |
| std::unique_ptr< AnnotationMap > | Annotate (const AggregationNode &aggregationTreeRoot) |
| static const util::BijectiveMap<::llvm::CallingConv::ID, CallingConvention > & | getCallingConventionMap () |
| jlm::llvm::CallingConvention | convertCallingConventionToJlm (::llvm::CallingConv::ID cc) |
| ::llvm::CallingConv::ID | convertCallingConventionToLlvm (jlm::llvm::CallingConvention cc) |
| static void | AddToWorklist (std::deque< rvsdg::Input * > &worklist, rvsdg::Output &output) |
| CallSummary | ComputeCallSummary (const rvsdg::LambdaNode &lambdaNode) |
| template<class T > | |
| static bool | is (const ControlFlowGraphNode *node) noexcept |
| static void | strongconnect (ControlFlowGraphNode *node, ControlFlowGraphNode *exit, std::unordered_map< ControlFlowGraphNode *, std::pair< size_t, size_t > > &map, std::vector< ControlFlowGraphNode * > &node_stack, size_t &index, std::vector< StronglyConnectedComponent > &sccs) |
| std::vector< StronglyConnectedComponent > | find_sccs (const ControlFlowGraph &cfg) |
| std::vector< StronglyConnectedComponent > | find_sccs (ControlFlowGraphNode *entry, ControlFlowGraphNode *exit) |
| static std::unique_ptr< ControlFlowGraph > | copy_structural (const ControlFlowGraph &in) |
| static bool | is_loop (const jlm::llvm::ControlFlowGraphNode *node) noexcept |
| static bool | is_linear_reduction (const jlm::llvm::ControlFlowGraphNode *node) noexcept |
| static jlm::llvm::ControlFlowGraphNode * | find_join (const jlm::llvm::ControlFlowGraphNode *split) noexcept |
| static bool | is_branch (const jlm::llvm::ControlFlowGraphNode *split) noexcept |
| static bool | is_proper_branch (const jlm::llvm::ControlFlowGraphNode *split) noexcept |
| static bool | is_T1 (const jlm::llvm::ControlFlowGraphNode *node) noexcept |
| static bool | is_T2 (const jlm::llvm::ControlFlowGraphNode *node) noexcept |
| static void | reduce_loop (jlm::llvm::ControlFlowGraphNode *node, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static void | reduce_linear (jlm::llvm::ControlFlowGraphNode *entry, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static void | reduce_branch (jlm::llvm::ControlFlowGraphNode *split, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static void | reduce_proper_branch (jlm::llvm::ControlFlowGraphNode *split, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static void | reduce_T1 (jlm::llvm::ControlFlowGraphNode *node) |
| static void | reduce_T2 (jlm::llvm::ControlFlowGraphNode *node, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static bool | reduce_proper_structured (jlm::llvm::ControlFlowGraphNode *node, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static bool | reduce_structured (jlm::llvm::ControlFlowGraphNode *node, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static bool | reduce_reducible (jlm::llvm::ControlFlowGraphNode *node, std::unordered_set< jlm::llvm::ControlFlowGraphNode * > &to_visit) |
| static bool | has_valid_phis (const BasicBlock &bb) |
| static bool | is_valid_basic_block (const BasicBlock &bb) |
| static bool | has_valid_entry (const ControlFlowGraph &cfg) |
| static bool | has_valid_exit (const ControlFlowGraph &cfg) |
| bool | is_valid (const ControlFlowGraph &cfg) |
| bool | is_closed (const ControlFlowGraph &cfg) |
| bool | is_linear (const ControlFlowGraph &cfg) |
| static bool | reduce (const ControlFlowGraph &cfg, const std::function< bool(llvm::ControlFlowGraphNode *, std::unordered_set< llvm::ControlFlowGraphNode * > &)> &f) |
| bool | is_structured (const ControlFlowGraph &cfg) |
| bool | is_proper_structured (const ControlFlowGraph &cfg) |
| bool | is_reducible (const ControlFlowGraph &cfg) |
| void | straighten (ControlFlowGraph &cfg) |
| void | purge (ControlFlowGraph &cfg) |
| Remove all basic blocks without instructions. | |
| static std::unordered_set< const ControlFlowGraphNode * > | compute_livenodes (const ControlFlowGraph &cfg) |
| static std::unordered_set< ControlFlowGraphNode * > | compute_deadnodes (ControlFlowGraph &cfg) |
| static std::unordered_set< BasicBlock * > | compute_live_sinks (const std::unordered_set< ControlFlowGraphNode * > &deadnodes) |
| static void | update_phi_operands (llvm::ThreeAddressCode &phitac, const std::unordered_set< ControlFlowGraphNode * > &deadnodes) |
| static void | update_phi_operands (const std::unordered_set< BasicBlock * > &sinks, const std::unordered_set< ControlFlowGraphNode * > &deadnodes) |
| static void | remove_deadnodes (const std::unordered_set< ControlFlowGraphNode * > &deadnodes) |
| void | prune (ControlFlowGraph &cfg) |
| static bool | is_acyclic (const ControlFlowGraph &cfg) |
| std::vector< ControlFlowGraphNode * > | postorder (const ControlFlowGraph &cfg) |
| std::vector< ControlFlowGraphNode * > | reverse_postorder (const ControlFlowGraph &cfg) |
| std::vector< ControlFlowGraphNode * > | breadth_first (const ControlFlowGraph &cfg) |
| size_t | ntacs (const ControlFlowGraph &cfg) |
| static std::unique_ptr< DominatorTreeNode > | build_domtree (std::unordered_map< ControlFlowGraphNode *, ControlFlowGraphNode * > &doms, ControlFlowGraphNode *root) |
| static ControlFlowGraphNode * | intersect (ControlFlowGraphNode *b1, ControlFlowGraphNode *b2, const std::unordered_map< ControlFlowGraphNode *, size_t > &indices, const std::unordered_map< ControlFlowGraphNode *, ControlFlowGraphNode * > &doms) |
| std::unique_ptr< DominatorTreeNode > | domtree (ControlFlowGraph &cfg) |
| static std::unique_ptr< GlobalValue > | create_gblvalue (DataNode *node) |
| static size_t | ntacs (const InterProceduralGraphModule &im) |
| rvsdg::Output & | GetMemoryStateRegionArgument (const rvsdg::LambdaNode &lambdaNode) noexcept |
| rvsdg::Input & | GetMemoryStateRegionResult (const rvsdg::LambdaNode &lambdaNode) noexcept |
| rvsdg::SimpleNode * | tryGetMemoryStateExitMerge (const rvsdg::LambdaNode &lambdaNode) noexcept |
| rvsdg::SimpleNode * | tryGetMemoryStateEntrySplit (const rvsdg::LambdaNode &lambdaNode) noexcept |
| std::string_view | linkageToString (const Linkage linkage) |
| Linkage | linkageFromString (const std::string_view stringValue) |
| bool | isDiscardableIfUnused (const Linkage linkage) |
| bool | isPrivateOrInternal (const Linkage linkage) |
| std::optional< std::vector< rvsdg::Output * > > | foldMatchOperationWithConstant (const rvsdg::MatchOperation &matchOperation, const std::vector< rvsdg::Output * > &operands) |
| TEST (ControlOperationsTests, foldConstants) | |
| static const ::llvm::fltSemantics & | mapToLlvmFltSemantics (const fpsize size) |
| TEST (ConversionOperationsTests, SExtConstantFolding) | |
| TEST (ConversionOperationsTests, ZExtConstantFolding) | |
| TEST (ConversionOperationsTests, TruncConstantFolding) | |
| TEST (ConversionOperationsTests, fpExtConstantFolding) | |
| TEST (ConversionOperationsTests, fpTruncConstantFolding) | |
| TEST (ConversionOperationsTests, FunctionToPointerInversion) | |
| TEST (ConversionOperationsTests, PointerToFunctionInversion) | |
| bool | reduceStaticallyKnownPredicate (rvsdg::GammaNode &gammaNode) |
| TEST (GammaTests, test_predicate_reduction) | |
| TEST (GetElemenPtrOperationTests, typeChecks) | |
| TEST (GetElementPtrOperationTests, TestOperationEquality) | |
| TEST (GetElementPtrTests, TryGetAsConstantTest) | |
| TEST (GetElementPtrTests, TestGetElementPtrOperationConstant_OffestInBytes) | |
| TEST (GetElementPtrTests, normalizeIdempotentReduction) | |
| template<typename TBinOp > | |
| static IntegerValueRepresentation | foldBinaryOperation (const IntegerValueRepresentation &r1, const IntegerValueRepresentation &r2) |
| template<typename TBinOp > | |
| static std::optional< std::vector< rvsdg::Output * > > | foldBinaryOperationConstants (const std::vector< rvsdg::Output * > &operands) |
| static std::optional< std::vector< rvsdg::Output * > > | normalizeIdenticalOperands (const std::vector< rvsdg::Output * > &operands, const std::int64_t result) |
| template<typename Operation > | |
| static void | TestFoldConstants (const FoldConstantsTestInput &input) |
| template<typename Operation > | |
| static void | testNormalizeIdenticalOperands (const std::uint64_t expected) |
| TEST (IntegerEqOperationTest, foldConstants) | |
| TEST (IntegerNeOperationTest, foldConstants) | |
| TEST (IntegerSgeOperationTest, foldConstants) | |
| TEST (IntegerSgtOperationTest, foldConstants) | |
| TEST (IntegerSleOperationTest, foldConstants) | |
| TEST (IntegerSltOperationTest, foldConstants) | |
| TEST (IntegerUgeOperationTest, foldConstants) | |
| TEST (IntegerUgtOperationTest, foldConstants) | |
| TEST (IntegerUleOperationTest, foldConstants) | |
| TEST (IntegerUltOperationTest, foldConstants) | |
| TEST (IntegerOrOperationTest, foldConstants) | |
| TEST (IntegerOrOperationTest, normalizeIdempotent) | |
| TEST (IntegerAndOperationTest, foldConstants) | |
| TEST (IntegerXorOperationTest, foldConstants) | |
| TEST (IntegerAddOperationTest, foldConstants) | |
| TEST (IntegerSubOperationTest, foldConstants) | |
| TEST (IntegerMulOperationTest, foldConstants) | |
| TEST (IntegerSDivOperationTest, foldConstants) | |
| TEST (IntegerUDivOperationTest, foldConstants) | |
| TEST (IntegerSRemOperationTest, foldConstants) | |
| TEST (IntegerURemOperationTest, foldConstants) | |
| TEST (IntegerAShrOperationTest, foldConstants) | |
| TEST (IntegerShlOperationTest, foldConstants) | |
| TEST (IntegerLShrOperationTest, foldConstants) | |
| TEST (IntegerSubOperationTests, normalizeAdditiveInverse) | |
| TEST (IntegerEqOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerNeOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerSgeOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerSgtOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerSleOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerSltOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerUgeOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerUgtOperationTests, normalizeIdenticalOperands) | |
| TEST (IntegerUltOperationTests, normalizeIdenticalOperands) | |
| TEST (MemoryHoistBarrierTests, normalizeNestedMemoryHoistBarriers) | |
| static bool | is_load_alloca_reducible (const std::vector< rvsdg::Output * > &operands) |
| static bool | is_reducible_state (const rvsdg::Output *state, const rvsdg::Node *loadalloca) |
| static bool | is_load_store_state_reducible (const LoadNonVolatileOperation &op, const std::vector< rvsdg::Output * > &operands) |
| static bool | is_multiple_origin_reducible (const std::vector< rvsdg::Output * > &operands) |
| static std::vector< rvsdg::Output * > | perform_load_alloca_reduction (const LoadNonVolatileOperation &op, const std::vector< rvsdg::Output * > &operands) |
| static std::vector< rvsdg::Output * > | perform_load_store_state_reduction (const LoadNonVolatileOperation &op, const std::vector< rvsdg::Output * > &operands) |
| static std::vector< rvsdg::Output * > | perform_multiple_origin_reduction (const LoadNonVolatileOperation &op, const std::vector< rvsdg::Output * > &operands) |
| static std::optional< size_t > | getAllocationSizeInBytes (const rvsdg::Output &output) |
| template<class TMemoryStateMergeOrJoinOperation > | |
| std::vector< rvsdg::Output * > | CollectNestedMemoryStateMergeOrJoinOperands (const std::vector< rvsdg::Output * > &operands) |
| static void | CheckMemoryNodeIds (const std::vector< MemoryNodeId > &memoryNodeIds) |
| static std::string | ToString (const std::vector< MemoryNodeId > &memoryNodeIds) |
| bool | hasMemoryState (const rvsdg::Node &node) |
| static const util::BijectiveMap<::llvm::CmpInst::Predicate, ICmpPredicate > & | getICmpPredicateMap () |
| ICmpPredicate | convertICmpPredicateToJlm (::llvm::CmpInst::Predicate predicate) |
| ::llvm::CmpInst::Predicate | convertICmpPredicateToLlvm (ICmpPredicate predicate) |
| std::string_view | iCmpPredicateToString (ICmpPredicate predicate) |
| template<typename TOperation > | |
| static bool | isOutputOf (rvsdg::Output &operand) |
| static bool | isAllocationSide (rvsdg::Output &output) |
| template<ICmpPredicate Predicate> | |
| static void | testPtrCmpNormalizeIdenticalOperands (const std::uint64_t expected) |
| TEST (PtrCmpOperationTests, testNormalizeNullPointerComparison) | |
| TEST (PtrCmpOperationTests, testNormalizeIdenticalOperands) | |
| TEST (FCmpOperationTests, testFoldConstants) | |
| TEST (FBinaryOperationTests, testFoldConstants) | |
| static bool | is_store_mux_reducible (const std::vector< jlm::rvsdg::Output * > &operands) |
| static bool | is_store_alloca_reducible (const std::vector< jlm::rvsdg::Output * > &operands) |
| static bool | is_multiple_origin_reducible (const std::vector< jlm::rvsdg::Output * > &operands) |
| static std::vector< jlm::rvsdg::Output * > | perform_store_mux_reduction (const StoreNonVolatileOperation &op, const std::vector< jlm::rvsdg::Output * > &operands) |
| static std::vector< jlm::rvsdg::Output * > | perform_store_alloca_reduction (const StoreNonVolatileOperation &op, const std::vector< jlm::rvsdg::Output * > &operands) |
| static std::vector< jlm::rvsdg::Output * > | perform_multiple_origin_reduction (const StoreNonVolatileOperation &operation, const std::vector< jlm::rvsdg::Output * > &operands) |
| static std::optional< size_t > | getAllocationSizeInBytes (const rvsdg::Output &output) |
| static std::string | emit_tacs (const tacsvector_t &tacs) |
| static std::string | emit_function_node (const InterProceduralGraphNode &clg_node) |
| static std::string | emit_data_node (const InterProceduralGraphNode &clg_node) |
| std::string | to_str (const InterProceduralGraph &clg) |
| std::string | to_str (const AggregationNode &n, const AnnotationMap &dm) |
| void | print (const AggregationNode &n, const AnnotationMap &dm, FILE *out) |
| static void | print_ascii (const InterProceduralGraph &ipg, FILE *out) |
| static std::string | to_str (const InterProceduralGraphModule &im) |
| static void | print (const InterProceduralGraphModule &im, FILE *out) |
| static std::string | to_str (const AggregationNode &n) |
| static void | print (const AggregationNode &n, FILE *out) |
| void | destruct_ssa (ControlFlowGraph &cfg) |
| static void | check_operands (const rvsdg::SimpleOperation &operation, const std::vector< const Variable * > &operands) |
| static void | check_results (const rvsdg::SimpleOperation &operation, const std::vector< std::unique_ptr< ThreeAddressCodeVariable > > &results) |
| template<class T > | |
| static bool | is (const llvm::ThreeAddressCode *tac) |
| rvsdg::Output & | traceOutput (rvsdg::Output &output, bool mayEnterSubregions, const rvsdg::Region *withinRegion) |
| std::optional< int64_t > | tryGetConstantSignedInteger (const rvsdg::Output &output) |
| TracedPointerOrigin | TracePointerOriginPrecise (const rvsdg::Output &p) |
| static bool | traceAllPointerOriginsInternal (const rvsdg::Output *basePointer, std::optional< int64_t > offsetInBytes, TraceCollection &traceCollection, const size_t maxTraceCollectionSize) |
| bool | TraceAllPointerOrigins (TracedPointerOrigin p, TraceCollection &traceCollection, const size_t maxTraceCollectionSize) |
| const rvsdg::Output & | traceOutput (const rvsdg::Output &output, bool mayEnterSubregions, const rvsdg::Region *withinRegion=nullptr) |
| size_t | GetTypeStoreSize (const rvsdg::Type &type) |
| size_t | GetTypeAllocSize (const rvsdg::Type &type) |
| size_t | GetTypeAlignment (const rvsdg::Type &type) |
| template<class ELEMENTYPE > | |
| bool | IsOrContains (const jlm::rvsdg::Type &type) |
| bool | IsAggregateType (const jlm::rvsdg::Type &type) |
| template<class T > | |
| bool | isVectorOf (const rvsdg::Type &type) |
| template<class T > | |
| bool | isVectorOfSize (const rvsdg::Type &type, const size_t size) |
| template<class T > | |
| static bool | is (const llvm::Variable *variable) noexcept |
| static VectorNodeHashMap | createElementAllocaNodes (rvsdg::SimpleNode &allocaNode) |
| static bool | areOutputsCongruent (const rvsdg::Output &o1, const rvsdg::Output &o2, CommonNodeElimination::Context &context) |
| static bool | checkNodesCongruent (const rvsdg::Node &node1, const rvsdg::Node &node2, CommonNodeElimination::Context &context) |
| void | markNodeAsLeader (const rvsdg::Node &leader, CommonNodeElimination::Context &context) |
| void | markNodesAsCongruent (const rvsdg::Node &leader, const rvsdg::Node &follower, CommonNodeElimination::Context &context) |
| const rvsdg::SimpleNode * | tryGetLeaderNode (const rvsdg::SimpleNode &node, CommonNodeElimination::Context &context) |
| static void | markSimpleTopNode (const rvsdg::SimpleNode &node, TopNodeLeaderList &leaders, CommonNodeElimination::Context &context) |
| static void | markSimpleNode (const rvsdg::SimpleNode &node, CommonNodeElimination::Context &context) |
| static void | markRegion (const rvsdg::Region &, CommonNodeElimination::Context &context) |
| static void | markGraphImports (const rvsdg::Region ®ion, CommonNodeElimination::Context &context) |
| static bool | partitionArguments (const rvsdg::Region ®ion, const std::vector< CommonNodeElimination::Context::CongruenceSetIndex > &partitions, CommonNodeElimination::Context &context) |
| static bool | markSubregionsFromInputs (const rvsdg::StructuralNode &node, CommonNodeElimination::Context &context) |
| static std::optional< CommonNodeElimination::Context::CongruenceSetIndex > | tryGetGammaExitVarCongruenceSet (rvsdg::GammaNode::ExitVar &exitVar, CommonNodeElimination::Context &context) |
| static size_t | getGammaExitVariableHash (const rvsdg::GammaNode::ExitVar &exitVar, CommonNodeElimination::Context &context) |
| static bool | areGammaExitVariablesCongruent (const rvsdg::GammaNode::ExitVar &first, const rvsdg::GammaNode::ExitVar &second, CommonNodeElimination::Context &context) |
| static void | insertGammaExitVarInHashmap (rvsdg::GammaNode::ExitVar &exitVar, CommonNodeElimination::Context::CongruenceSetIndex congruenceSet, std::unordered_map< size_t, CommonNodeElimination::Context::CongruenceSetIndex > &leaderHashes, CommonNodeElimination::Context &context) |
| static void | lookupOrInsertGammaExitVarInHashmap (const rvsdg::GammaNode::ExitVar &exitVar, const rvsdg::GammaNode &gamma, std::unordered_map< size_t, CommonNodeElimination::Context::CongruenceSetIndex > &leaderHashes, CommonNodeElimination::Context &context) |
| static void | markGamma (const rvsdg::GammaNode &gamma, CommonNodeElimination::Context &context) |
| static void | markTheta (const rvsdg::ThetaNode &theta, CommonNodeElimination::Context &context) |
| static void | markStructuralNode (const rvsdg::StructuralNode &node, CommonNodeElimination::Context &context) |
| static void | divertOutput (rvsdg::Output &output, CommonNodeElimination::Context &context) |
| static void | divertInRegion (rvsdg::Region &, CommonNodeElimination::Context &) |
| static void | divertInStructuralNode (rvsdg::StructuralNode &node, CommonNodeElimination::Context &context) |
| TEST (CommonNodeEliminationTests, test_simple) | |
| TEST (CommonNodeEliminationTests, test_gamma) | |
| TEST (CommonNodeEliminationTests, test_gamma_congruent_exit_vars) | |
| TEST (CommonNodeEliminationTests, test_theta) | |
| TEST (CommonNodeEliminationTests, test_theta2) | |
| TEST (CommonNodeEliminationTests, test_theta3) | |
| TEST (CommonNodeEliminationTests, test_theta4) | |
| TEST (CommonNodeEliminationTests, test_theta5) | |
| TEST (CommonNodeEliminationTests, MultipleThetas) | |
| TEST (CommonNodeEliminationTests, MultipleThetasPassthrough) | |
| TEST (CommonNodeEliminationTests, test_lambda) | |
| TEST (CommonNodeEliminationTests, test_phi) | |
| TEST (CommonNodeEliminationTests, EmptyTheta) | |
| TEST (CommonNodeEliminationTests, GammaInTheta) | |
| TEST (CommonNodeEliminationTests, InvariantThetaInTheta) | |
| TEST (CommonNodeEliminationTests, InvariantLoopOutputs) | |
| static bool | isLoadNonVolatileMemoryStateOutput (const rvsdg::Output &output) |
| static std::vector< rvsdg::Output * > | routeContextVariablesToRegion (rvsdg::Region ®ion, const rvsdg::LambdaNode &callee) |
| static void | tryRerouteMemoryStateMergeAndSplit (rvsdg::SimpleNode &callEntryMerge, rvsdg::SimpleNode &callExitSplit) |
| static void | hoistInlinedAllocas (const rvsdg::LambdaNode &callee, rvsdg::LambdaNode &caller, rvsdg::SubstitutionMap &smap) |
| static rvsdg::Node * | getConstant (const rvsdg::Output &output) |
| static void | RunInvariantValueRedirection (jlm::llvm::LlvmRvsdgModule &rvsdgModule) |
| TEST (InvariantValueRedirectionTests, TestGamma) | |
| TEST (InvariantValueRedirectionTests, testGammaControlConstantRedirection_Success) | |
| TEST (InvariantValueRedirectionTests, testGammaControlConstantRedirection_Failure) | |
| TEST (InvariantValueRedirectionTests, testGammaIntegerConstantRedirection_Success) | |
| TEST (InvariantValueRedirectionTests, testGammaIntegerConstantRedirection_Failure) | |
| TEST (InvariantValueRedirectionTests, TestTheta) | |
| TEST (InvariantValueRedirectionTests, testThetaConstantRedirection) | |
| TEST (InvariantValueRedirectionTests, TestCall) | |
| TEST (InvariantValueRedirectionTests, TestCallWithMemoryStateNodes) | |
| TEST (InvariantValueRedirectionTests, TestCallWithMissingMemoryStateNodes) | |
| TEST (InvariantValueRedirectionTests, TestCallWithDifferentExternalCompression) | |
| TEST (InvariantValueRedirectionTests, TestLambdaCallArgumentMismatch) | |
| TEST (InvariantValueRedirectionTests, testThetaGammaRedirection) | |
| TEST (InvariantValueRedirectionTests, testLoadWithDeadLoadedValue) | |
| static std::vector< rvsdg::SimpleNode * > | collectMemoryHoistBarrierNodes (rvsdg::Output &output) |
| static std::optional< rvsdg::SimpleNode * > | selectMemoryHoistBarrierNode (const std::vector< rvsdg::SimpleNode * > &hoistBarrierNodes, const std::variant< rvsdg::Node *, rvsdg::Region * > ioStateOwner) |
| static void | divertUsersToMemoryHoistBarrierNode (rvsdg::Output &output, rvsdg::SimpleNode &memoryHoistBarrierNode) |
| static std::optional< rvsdg::GammaNode::EntryVar > | getIOStateEntryVar (const rvsdg::GammaNode &gammaNode) |
| static void | runIOBarrierElimination (LlvmRvsdgModule &rvsdgModule) |
| TEST (IOBarrierEliminationTests, testLambdaArgument) | |
| TEST (IOBarrierEliminationTests, testSizeIsRespected) | |
| TEST (IOBarrierEliminationTests, testSuccess) | |
| TEST (IOBarrierEliminationTests, testInvidiualIOBarrierUserRerouting) | |
| TEST (IOBarrierEliminationTests, testGamma) | |
| TEST (IOBarrierEliminationTests, testOnlyLoadsInGamma) | |
| TEST (IOBarrierEliminationTests, testOnlyLoadsInGammaFailure) | |
| TEST (IOBarrierEliminationTests, testLoadsInGammaNoReturn) | |
| TEST (IOBarrierEliminationTest, testNormalizeation) | |
| TEST (IOBarrierElimination, testStoreMarking) | |
| TEST (IOBarrierEliminationTests, testNormalizationFromLoadedAddress) | |
| static bool | hasOnlyValueInputs (const rvsdg::Node &node) |
| static rvsdg::Region & | limitTargetRegion (const rvsdg::Node &node, rvsdg::Region &targetRegion) |
| static rvsdg::Input * | mapStateOutputToInput (rvsdg::Output &output) |
| TEST (NodeHoistingTests, simpleGamma) | |
| TEST (NodeHoistingTests, nestedGamma) | |
| TEST (NodeHoistingTests, simpleTheta) | |
| TEST (NodeHoistingTests, invariantMemoryOperation) | |
| TEST (NodeHoistingTests, statefulOperations) | |
| TEST (NodeHoistingTests, controlConstants) | |
| TEST (NodeHoistingTests, hoistLoadNodesOutOfGamma) | |
| TEST (NodeHoistingTests, hoistLoadNodesOutofNestedGamma) | |
| TEST (NodeHoistingTests, hoistLoadNodeOutOfGammaInTheta) | |
| static std::vector< rvsdg::NodeNormalization< rvsdg::MatchOperation > > | matchOperationNormalizations ({ foldMatchOperationWithConstant }) |
| static std::vector< rvsdg::NodeNormalization< SExtOperation > > | sextOperationNormalizations ({ SExtOperation::foldConstant }) |
| static std::vector< rvsdg::NodeNormalization< ZExtOperation > > | zextOperationNormalizations ({ ZExtOperation::foldConstant }) |
| static std::vector< rvsdg::NodeNormalization< TruncOperation > > | truncOperationNormalizations ({ TruncOperation::foldConstant }) |
| static std::vector< rvsdg::NodeNormalization< FPExtOperation > > | fpExtOperationNormalizations ({ FPExtOperation::foldConstant }) |
| static std::vector< rvsdg::NodeNormalization< FPTruncOperation > > | fpTruncOperationNormalizations ({ FPTruncOperation::foldConstant }) |
| static std::vector< rvsdg::NodeNormalization< IntegerEqOperation > > | integerEqNormalizations ({ IntegerEqOperation::foldConstants, IntegerEqOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerNeOperation > > | integerNeNormalizations ({ IntegerNeOperation::foldConstants, IntegerNeOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSgeOperation > > | integerSgeNormalizations ({ IntegerSgeOperation::foldConstants, IntegerSgeOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSgtOperation > > | integerSgtNormalizations ({ IntegerSgtOperation::foldConstants, IntegerSgtOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSleOperation > > | integerSleNormalizations ({ IntegerSleOperation::foldConstants, IntegerSleOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSltOperation > > | integerSltNormalizations ({ IntegerSltOperation::foldConstants, IntegerSltOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerUgeOperation > > | integerUgeNormalizations ({ IntegerUgeOperation::foldConstants, IntegerUgeOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerUgtOperation > > | integerUgtNormalizations ({ IntegerUgtOperation::foldConstants, IntegerUgtOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerUleOperation > > | integerUleNormalizations ({ IntegerUleOperation::foldConstants, IntegerUleOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerUltOperation > > | integerUltNormalizations ({ IntegerUltOperation::foldConstants, IntegerUltOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< IntegerAddOperation > > | integerAddNormalizations ({ IntegerAddOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSubOperation > > | integerSubNormalizations ({ IntegerSubOperation::normalizeAdditiveInverse, IntegerSubOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerMulOperation > > | integerMulNormalizations ({ IntegerMulOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSDivOperation > > | integerSDivNormalizations ({ IntegerSDivOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerUDivOperation > > | integerUDivNormalizations ({ IntegerUDivOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerSRemOperation > > | integerSRemNormalizations ({ IntegerSRemOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerURemOperation > > | integerURemNormalizations ({ IntegerURemOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerAShrOperation > > | integerAShrNormalizations ({ IntegerAShrOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerShlOperation > > | integerShlNormalizations ({ IntegerShlOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerLShrOperation > > | integerLShrNormalizations ({ IntegerLShrOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerAndOperation > > | integerAndNormalizations ({ IntegerAndOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< IntegerOrOperation > > | integerOrNormalizations ({ IntegerOrOperation::foldConstants, IntegerOrOperation::normalizeIdempotent }) |
| static std::vector< rvsdg::NodeNormalization< IntegerXorOperation > > | integerXorNormalizations ({ IntegerXorOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< FBinaryOperation > > | fpBinaryOpNormalizations ({ FBinaryOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< LoadNonVolatileOperation > > | loadNonVolatileNormalizations ({ LoadNonVolatileOperation::NormalizeLoadStore, LoadNonVolatileOperation::NormalizeLoadAlloca, LoadNonVolatileOperation::NormalizeDuplicateStates, LoadNonVolatileOperation::NormalizeLoadStoreState, LoadNonVolatileOperation::normalizeMemoryHoistBarrierAddress }) |
| static std::vector< rvsdg::NodeNormalization< StoreNonVolatileOperation > > | storeNonVolatileNormalizations ({ StoreNonVolatileOperation::NormalizeStoreMux, StoreNonVolatileOperation::normalizeStoreStore, StoreNonVolatileOperation::NormalizeStoreAlloca, StoreNonVolatileOperation::NormalizeDuplicateStates, StoreNonVolatileOperation::normalizeMemoryHoistBarrierAddress, StoreNonVolatileOperation::normalizeStoreAllocaSingleUser }) |
| static std::vector< rvsdg::NodeNormalization< MemoryStateMergeOperation > > | memoryStateMergeNormalizations ({ MemoryStateMergeOperation::NormalizeSingleOperand, MemoryStateMergeOperation::NormalizeDuplicateOperands, MemoryStateMergeOperation::NormalizeNestedMerges, MemoryStateMergeOperation::NormalizeMergeSplit }) |
| static std::vector< rvsdg::NodeNormalization< MemoryStateJoinOperation > > | memoryStateJoinNormalizations ({ MemoryStateJoinOperation::NormalizeSingleOperand, MemoryStateJoinOperation::NormalizeDuplicateOperands }) |
| static std::vector< rvsdg::NodeNormalization< MemoryStateSplitOperation > > | memoryStateSplitNormalizations ({ MemoryStateSplitOperation::NormalizeSingleResult, MemoryStateSplitOperation::NormalizeNestedSplits, MemoryStateSplitOperation::NormalizeSplitMerge }) |
| static std::vector< rvsdg::NodeNormalization< LambdaExitMemoryStateMergeOperation > > | lambdaExitMemoryStateMergeNormalizations ({ LambdaExitMemoryStateMergeOperation::NormalizeLoadFromAlloca, LambdaExitMemoryStateMergeOperation::NormalizeStoreToAlloca, LambdaExitMemoryStateMergeOperation::NormalizeAlloca }) |
| static std::vector< rvsdg::NodeNormalization< PtrCmpOperation > > | ptrCmpNormalizations ({ PtrCmpOperation::normalizeNullPointerComparison, PtrCmpOperation::normalizeIdenticalOperands }) |
| static std::vector< rvsdg::NodeNormalization< GetElementPtrOperation > > | getElementPtrNormalizations ({ GetElementPtrOperation::normalizeIdempotent }) |
| static std::vector< rvsdg::NodeNormalization< FCmpOperation > > | fCmpNormalizations ({ FCmpOperation::foldConstants }) |
| static std::vector< rvsdg::NodeNormalization< MemoryHoistBarrierOperation > > | memoryHoistBarrierNormalizations ({ MemoryHoistBarrierOperation::normalizeNestedMemoryHoistBarriers }) |
| static std::vector< rvsdg::NodeNormalization< rvsdg::BinaryOperation > > | binaryOperationNormalizations ({ rvsdg::NormalizeBinaryOperation }) |
| template<typename TOperation > | |
| static rvsdg::NodeNormalization< TOperation > | createNormalizer (const std::vector< rvsdg::NodeNormalization< TOperation > > &nodeNormalizations) |
| template<class TOperation > | |
| static bool | reduceSimpleNode (rvsdg::SimpleNode &simpleNode, const std::vector< rvsdg::NodeNormalization< TOperation > > &normalizations, size_t &counter) |
| TEST (NodeReductionTests, MultipleReductionsPerRegion) | |
| static std::optional< std::vector< uint64_t > > | extractConstantAlternatives (const rvsdg::Output &gammaOutput) |
| static std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > | computeControlConstantCorrelation (rvsdg::ThetaNode &thetaNode) |
| static std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > | computeMatchConstantCorrelation (rvsdg::ThetaNode &thetaNode) |
| static std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > | computeMatchCorrelation (rvsdg::ThetaNode &thetaNode) |
| std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > | computeThetaGammaPredicateCorrelation (rvsdg::ThetaNode &thetaNode) |
| static std::optional< std::unique_ptr< GammaGammaPredicateCorrelation > > | computeMatchCorrelation (rvsdg::GammaNode &gammaNode1) |
| std::optional< std::unique_ptr< GammaGammaPredicateCorrelation > > | computeGammaGammaPredicateCorrelation (rvsdg::GammaNode &gammaNode) |
| std::optional< GammaSubregionRoles > | determineGammaSubregionRoles (const ThetaGammaPredicateCorrelation &correlation) |
| static bool | empty (const rvsdg::GammaNode *gamma) |
| static bool | isSingleSuccessor (const rvsdg::Node &node, const rvsdg::Node &singleSuccessor) |
| static void | pullin_node (rvsdg::GammaNode *gamma, rvsdg::Node *node) |
| static void | cleanup (rvsdg::GammaNode *gamma, rvsdg::Node *node) |
| void | pullin_top (rvsdg::GammaNode *gamma) |
| static size_t | is_used_in_nsubregions (const rvsdg::GammaNode *gamma, const rvsdg::Node *node) |
| void | pull (rvsdg::GammaNode *gamma) |
| void | pull (rvsdg::Region *region) |
| static void | pull (rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) |
| static RegionSlice | computeRegionSlice (rvsdg::Output &output) |
| static void | copyRegionSlice (rvsdg::Region &targetRegion, const RegionSlice ®ionSlice, rvsdg::SubstitutionMap &substitutionMap) |
| static rvsdg::Output & | copyDeltaRegionSlice (rvsdg::Output &output, rvsdg::Region &targetRegion) |
| static rvsdg::Output & | copyDeltaElement (const uint64_t elementOffsetInBytes, rvsdg::Output &output, rvsdg::Region &targetRegion, const std::shared_ptr< const rvsdg::Type > &loadedType) |
| static std::unique_ptr< aa::AliasAnalysis > | createAliasAnalysis (rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) |
| static bool | is_eqcmp (const rvsdg::Operation &op) |
| static bool | is_theta_invariant (const jlm::rvsdg::Output *output) |
| static rvsdg::Output * | push_from_theta (jlm::rvsdg::Output *output) |
| static bool | is_idv (jlm::rvsdg::Input *input) |
| static void | unroll_body (const rvsdg::ThetaNode *theta, rvsdg::Region *target, rvsdg::SubstitutionMap &smap, size_t factor) |
| static void | copy_body_and_unroll (const rvsdg::ThetaNode *theta, size_t factor) |
| static void | unroll_theta (const LoopUnrollInfo &ui, rvsdg::SubstitutionMap &smap, size_t factor) |
| static void | add_remainder (const LoopUnrollInfo &ui, rvsdg::SubstitutionMap &smap, size_t factor) |
| static void | unroll_known_theta (const LoopUnrollInfo &ui, size_t factor) |
| static jlm::rvsdg::Output * | create_unrolled_gamma_predicate (const LoopUnrollInfo &ui, size_t factor) |
| static jlm::rvsdg::Output * | create_unrolled_theta_predicate (rvsdg::Region *, const rvsdg::SubstitutionMap &smap, const LoopUnrollInfo &ui, size_t factor) |
| static jlm::rvsdg::Output * | create_residual_gamma_predicate (const rvsdg::SubstitutionMap &smap, const LoopUnrollInfo &ui) |
| static void | unroll_unknown_theta (const LoopUnrollInfo &ui, size_t factor) |
| void | unroll (rvsdg::ThetaNode *otheta, size_t factor) |
| static bool | unroll (rvsdg::Region *region, size_t factor) |
Variables | |
| static util::StatisticsCollector | statisticsCollector |
| static const bool | USE_TRIVIAL_LOCALAA = std::getenv("JLM_SVF_USE_TRIVIAL_LOCALAA") |
| static const bool | ENABLE_PTGAA = std::getenv("JLM_ENABLE_SVF_PTGAA") |
| static const bool | ENABLE_REGION_PREDICATE_CHECK |
| static const bool | DISABLE_LOAD_LOAD_FORWARDING = std::getenv("JLM_DISABLE_LOAD_LOAD_FORWARDING") |
Global memory state passed between functions.
This file contains various helpers to manage the memory state as it is passed between llvm functions represented as lambda operations, and the chosen memory model for this mapping.
| using jlm::llvm::BasicBlockMap = typedef util::BijectiveMap<const ::llvm::BasicBlock *, BasicBlock *> |
Definition at line 41 of file LlvmModuleConversion.cpp.
| using jlm::llvm::IntegerValueRepresentation = typedef rvsdg::BitValueRepresentation |
Definition at line 19 of file IntegerOperations.hpp.
| using jlm::llvm::MemoryNodeId = typedef std::size_t |
Definition at line 17 of file MemoryStateOperations.hpp.
| typedef std::vector<std::unique_ptr<llvm::ThreeAddressCode> > jlm::llvm::tacsvector_t |
| using jlm::llvm::TopNodeLeaderList = typedef std::vector<const rvsdg::Node *> |
Definition at line 417 of file CommonNodeElimination.cpp.
| using jlm::llvm::VectorNodeHashMap = typedef std::unordered_map<std::vector<uint64_t>, rvsdg::Node *, VectorHash> |
Definition at line 496 of file AggregateAllocaSplitting.cpp.
|
strong |
Types of calling conventions. Based on LLVM's "::llvm::CallingConv" namespace. LLVM allows arbitrary numbers to be used as calling convention identifiers, but jlm limits the set of possible values to this enum.
| Enumerator | |
|---|---|
| C | |
| Default | |
| Fast | |
| Cold | |
| Tail | |
Definition at line 20 of file CallingConvention.hpp.
|
strong |
The different types of predicate correlations that are supported.
Definition at line 38 of file PredicateCorrelation.hpp.
|
strong |
| Enumerator | |
|---|---|
| TRUE | |
| FALSE | |
| oeq | |
| ogt | |
| oge | |
| olt | |
| ole | |
| one | |
| ord | |
| ueq | |
| ugt | |
| uge | |
| ult | |
| ule | |
| une | |
| uno | |
Definition at line 599 of file operators.hpp.
|
strong |
| Enumerator | |
|---|---|
| add | |
| sub | |
| mul | |
| div | |
| mod | |
Definition at line 879 of file operators.hpp.
|
strong |
|
strong |
The set of possible types of predicates for integer and pointer comparisons. Based on the integer comparison predicates defined in "::llvm::CmpInst".
| Enumerator | |
|---|---|
| Eq | |
| Ne | |
| Ugt | |
| Uge | |
| Ult | |
| Ule | |
| Sgt | |
| Sge | |
| Slt | |
| Sle | |
Definition at line 375 of file operators.hpp.
|
strong |
Types of linkage for global variables, constants and functions. Based on LLVM's "::llvm::GlobalValue::LinkageTypes"
Definition at line 18 of file Linkage.hpp.
|
strong |
| Enumerator | |
|---|---|
| ValueForwarding | |
| NoClobber | |
Definition at line 319 of file StoreValueForwarding.cpp.
|
strong |
| Enumerator | |
|---|---|
| ValueForwarding | |
| ClobberNoForward | |
| NoClobber | |
Definition at line 309 of file StoreValueForwarding.cpp.
|
static |
Definition at line 268 of file unroll.cpp.
|
static |
Definition at line 975 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 984 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 21 of file CallSummary.cpp.
|
static |
The RVSDG theta node expects that the repetition of its body always happens on control value 1. Thus, we need to ensure that the repetition edge of the tail-controlled loop has index 1 in order to avoid miscompilations.
| sccStructure | The StronglyConnectedComponentStructure that represents the tail-controlled loop. |
Definition at line 276 of file ControlFlowRestructuring.cpp.
| std::unique_ptr< AggregationNode > jlm::llvm::aggregate | ( | ControlFlowGraph & | cfg | ) |
Aggregate a properly structured CFG to a aggregation tree.
This function reduces a properly structured CFG to an aggregation tree. The CFG is only allowed to consist of the following subgraphs:
These subgraphs can be arbitrarily nested. Please refer to Reissmann et al. - RVSDG: An Intermediate Representation for Optimizing Compilers [https://doi.org/10.1145/3391902] for more information.
Definition at line 491 of file aggregation.cpp.
|
static |
This function takes the entry and the exit of a single-entry/single-exit (SESE) subgraph, i.e. entry must always dominate exit, and reduces the subgraph to an aggregation subtree. The subgraph is then replaced by a single basic block in the CFG and this CFG is associated with the aggregation subtree in the aggregation map.
The function consists of two recursively nested phases:
The first phase finds all tail-controlled loops and recursively invokes the aggregation procedure on a loops' body to reduce it to a single node. Once all loops in the subgraph have been reduced, the Acyclic SESE aggregation reduces the rest of the acyclic graph into a tree.
Definition at line 481 of file aggregation.cpp.
|
static |
Definition at line 393 of file aggregation.cpp.
|
static |
Find all tail-controlled loops in an SESE subgraph and reduce each loop to a single node.
Definition at line 375 of file aggregation.cpp.
|
static |
Definition at line 878 of file InterProceduralGraphConversion.cpp.
| std::unique_ptr< AnnotationMap > jlm::llvm::Annotate | ( | const AggregationNode & | aggregationTreeRoot | ) |
Definition at line 492 of file Annotation.cpp.
|
static |
Definition at line 900 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 472 of file Annotation.cpp.
|
static |
Definition at line 462 of file Annotation.cpp.
|
static |
Definition at line 397 of file Annotation.cpp.
|
static |
Definition at line 423 of file Annotation.cpp.
|
static |
Definition at line 374 of file Annotation.cpp.
|
static |
Definition at line 387 of file Annotation.cpp.
|
static |
Definition at line 408 of file Annotation.cpp.
|
static |
Definition at line 448 of file Annotation.cpp.
|
static |
Definition at line 335 of file Annotation.cpp.
|
static |
Definition at line 227 of file Annotation.cpp.
|
static |
Definition at line 295 of file Annotation.cpp.
|
static |
Definition at line 200 of file Annotation.cpp.
|
static |
Definition at line 216 of file Annotation.cpp.
|
static |
Definition at line 272 of file Annotation.cpp.
|
static |
Definition at line 322 of file Annotation.cpp.
|
static |
Definition at line 107 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 115 of file ControlFlowRestructuring.cpp.
|
static |
Checks if the two given exit variables are congruent, by comparing the origins of their branch results in each subregion. Unlike comparing hashes, this function never yields false positives.
| first | the first exit variable |
| second | the second exit variable |
| context | the context of the common node elimination pass |
Definition at line 774 of file CommonNodeElimination.cpp.
|
static |
Checks if the given outputs are congruent by using the existing context. The outputs must belong to the same region. Both outputs must already belong to a congruence set.
| o1 | the first output |
| o2 | the second output |
| context | the common node elimination context |
Definition at line 291 of file CommonNodeElimination.cpp.
|
static |
| std::vector< ControlFlowGraphNode * > jlm::llvm::breadth_first | ( | const ControlFlowGraph & | cfg | ) |
|
static |
Definition at line 30 of file domtree.cpp.
|
static |
|
static |
|
static |
Definition at line 286 of file MemoryStateOperations.cpp.
|
static |
Checks if the given nodes appear congruent by comparing their operations and using the context to compare the origins of their inputs. All inputs of both nodes must have origins that already have congruence sets.
This function can only detect congruence between simple nodes.
| node1 | the first node |
| node2 | the second node |
| context | the current context of the mark phase |
Definition at line 318 of file CommonNodeElimination.cpp.
|
static |
|
static |
Definition at line 190 of file IOBarrierElimination.cpp.
| std::vector< rvsdg::Output * > jlm::llvm::CollectNestedMemoryStateMergeOrJoinOperands | ( | const std::vector< rvsdg::Output * > & | operands | ) |
Definition at line 64 of file MemoryStateOperations.cpp.
|
static |
Definition at line 729 of file cfg-structure.cpp.
|
static |
Definition at line 750 of file cfg-structure.cpp.
|
static |
Definition at line 704 of file cfg-structure.cpp.
| CallSummary jlm::llvm::ComputeCallSummary | ( | const rvsdg::LambdaNode & | lambdaNode | ) |
Definition at line 30 of file CallSummary.cpp.
|
static |
Definition at line 448 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 78 of file PredicateCorrelation.cpp.
|
static |
Definition at line 404 of file ControlFlowRestructuring.cpp.
| std::optional< std::unique_ptr< GammaGammaPredicateCorrelation > > jlm::llvm::computeGammaGammaPredicateCorrelation | ( | rvsdg::GammaNode & | gammaNode | ) |
Definition at line 201 of file PredicateCorrelation.cpp.
|
static |
Definition at line 389 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 101 of file PredicateCorrelation.cpp.
|
static |
Definition at line 176 of file PredicateCorrelation.cpp.
|
static |
Definition at line 131 of file PredicateCorrelation.cpp.
|
static |
Definition at line 1087 of file StoreValueForwarding.cpp.
| std::optional< std::unique_ptr< ThetaGammaPredicateCorrelation > > jlm::llvm::computeThetaGammaPredicateCorrelation | ( | rvsdg::ThetaNode & | thetaNode | ) |
Computes a theta-gamma predicate correlation for thetaNode if there is any.
| thetaNode | The theta node for which to compute the predicate correlation. |
Definition at line 155 of file PredicateCorrelation.cpp.
|
static |
Definition at line 2177 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2050 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2089 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1934 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 886 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 651 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 675 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 586 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 633 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 664 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 511 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 743 of file InterProceduralGraphConversion.cpp.
|
inlinestatic |
Definition at line 1990 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 230 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2362 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 399 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2351 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 174 of file IpGraphToLlvmConverter.cpp.
|
static |
Definition at line 547 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2122 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 558 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 572 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 594 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 612 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 482 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 507 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 532 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 648 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 2038 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2011 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 930 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 677 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2516 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1099 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2619 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 666 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2629 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 522 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2065 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2278 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 452 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2529 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 993 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 749 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 1856 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 1042 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 468 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 840 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1460 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 823 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 912 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 469 of file InterProceduralGraphConversion.cpp.
| Attribute::kind jlm::llvm::ConvertAttributeKind | ( | const ::llvm::Attribute::AttrKind & | kind | ) |
Definition at line 249 of file LlvmModuleConversion.cpp.
| AttributeList jlm::llvm::convertAttributeList | ( | const ::llvm::AttributeList & | attributeList, |
| const size_t | numParameters, | ||
| TypeConverter & | typeConverter | ||
| ) |
Definition at line 430 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 569 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 501 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 766 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1470 of file LlvmModuleConversion.cpp.
| std::vector< const Variable * > jlm::llvm::convertCallArguments | ( | const ::llvm::CallInst & | callInstruction, |
| tacsvector_t & | threeAddressCodes, | ||
| Context & | context | ||
| ) |
Definition at line 1598 of file LlvmModuleConversion.cpp.
| jlm::llvm::CallingConvention jlm::llvm::convertCallingConventionToJlm | ( | ::llvm::CallingConv::ID | cc | ) |
Converts the given calling convention from LLVM to jlm.
| cc | the calling convention |
| jlm::util::Error | if the calling convention is unknown |
Definition at line 28 of file CallingConvention.cpp.
| llvm::CallingConv::ID jlm::llvm::convertCallingConventionToLlvm | ( | jlm::llvm::CallingConvention | cc | ) |
Converts the given calling convention from jlm to LLVM.
| cc | the calling convention |
| jlm::util::Error | if the calling convention is unknown |
Definition at line 36 of file CallingConvention.cpp.
|
static |
Definition at line 1838 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1329 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 707 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 741 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 697 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 684 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 630 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 945 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1425 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1479 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1499 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1489 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1017 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1004 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 356 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1451 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1912 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1356 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1318 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1144 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2078 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1374 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 979 of file InterProceduralGraphConversion.cpp.
| ICmpPredicate jlm::llvm::convertICmpPredicateToJlm | ( | ::llvm::CmpInst::Predicate | predicate | ) |
Converts the given comparison predicate from an LLVM to the corresponding Jlm enum.
| if | the predicate is not an integer comparison predicate |
Definition at line 197 of file operators.cpp.
| llvm::CmpInst::Predicate jlm::llvm::convertICmpPredicateToLlvm | ( | ICmpPredicate | predicate | ) |
Converts the given comparison predicate from an LLVM to the corresponding Jlm enum.
| if | the predicate is not a valid enum value |
Definition at line 204 of file operators.cpp.
|
static |
Definition at line 2023 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 2184 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 364 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1874 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 849 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1194 of file InterProceduralGraphConversion.cpp.
| std::unique_ptr< LlvmRvsdgModule > jlm::llvm::ConvertInterProceduralGraphModule | ( | InterProceduralGraphModule & | interProceduralGraphModule, |
| util::StatisticsCollector & | statisticsCollector | ||
| ) |
Definition at line 1220 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1088 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1733 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1508 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1520 of file LlvmModuleConversion.cpp.
| std::unique_ptr< InterProceduralGraphModule > jlm::llvm::ConvertLlvmModule | ( | ::llvm::Module & | llvmModule | ) |
Definition at line 2639 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1118 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1185 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1269 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1232 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1087 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 879 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1438 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1338 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1365 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1533 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 482 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1385 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1405 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1572 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1559 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 392 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1103 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 794 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 536 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 1347 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 372 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1546 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1395 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1415 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 1585 of file LlvmModuleConversion.cpp.
| const Variable * jlm::llvm::ConvertValue | ( | ::llvm::Value * | v, |
| tacsvector_t & | tacs, | ||
| Context & | ctx | ||
| ) |
Definition at line 215 of file LlvmModuleConversion.cpp.
| const Variable * jlm::llvm::ConvertValueOrFunction | ( | ::llvm::Value * | v, |
| tacsvector_t & | tacs, | ||
| Context & | ctx | ||
| ) |
Definition at line 192 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 202 of file unroll.cpp.
|
static |
Definition at line 147 of file cfg-structure.cpp.
|
static |
Definition at line 1154 of file StoreValueForwarding.cpp.
|
static |
Definition at line 1135 of file StoreValueForwarding.cpp.
|
static |
Definition at line 1122 of file StoreValueForwarding.cpp.
|
static |
Definition at line 2440 of file LlvmModuleConversion.cpp.
|
inlinestatic |
Definition at line 49 of file ipgraph-module.hpp.
|
static |
Definition at line 2605 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 388 of file unroll.cpp.
|
static |
Definition at line 2116 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 337 of file unroll.cpp.
|
static |
Definition at line 356 of file unroll.cpp.
|
static |
Definition at line 1589 of file StoreValueForwarding.cpp.
|
static |
Definition at line 1627 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 69 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 499 of file AggregateAllocaSplitting.cpp.
|
static |
Definition at line 87 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 77 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 97 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 296 of file NodeReduction.cpp.
|
static |
Definition at line 2550 of file LlvmModuleConversion.cpp.
| void jlm::llvm::destruct_ssa | ( | ControlFlowGraph & | cfg | ) |
| std::optional< GammaSubregionRoles > jlm::llvm::determineGammaSubregionRoles | ( | const ThetaGammaPredicateCorrelation & | correlation | ) |
Tries to assign the respective roles (exit or repetition) to the subregions of a gamma node that statically correlates with the predicate of a theta node.
| correlation | The predicate correlation between a theta and gamma node. |
Definition at line 212 of file PredicateCorrelation.cpp.
|
static |
Definition at line 1187 of file CommonNodeElimination.cpp.
|
static |
Definition at line 1150 of file CommonNodeElimination.cpp.
|
static |
Definition at line 1135 of file CommonNodeElimination.cpp.
|
static |
Definition at line 221 of file IOBarrierElimination.cpp.
| std::unique_ptr< DominatorTreeNode > jlm::llvm::domtree | ( | ControlFlowGraph & | cfg | ) |
Definition at line 91 of file domtree.cpp.
|
static |
|
static |
|
static |
|
static |
|
static |
Definition at line 2375 of file LlvmModuleConversion.cpp.
|
static |
Takes the output of a gamma node and if the output's respective branch results in every subregion originate from a constant, then it returns a vector of the constant alternatives.
| gammaOutput | The output of a gamma node. |
Definition at line 31 of file PredicateCorrelation.cpp.
|
static |
Definition at line 30 of file ControlFlowRestructuring.cpp.
|
static |
|
inlinestaticnoexcept |
Definition at line 194 of file cfg-structure.cpp.
| std::vector< StronglyConnectedComponent > jlm::llvm::find_sccs | ( | const ControlFlowGraph & | cfg | ) |
Compute a Control Flow Graph's Strongly Connected Components.
Definition at line 127 of file cfg-structure.cpp.
| std::vector< StronglyConnectedComponent > jlm::llvm::find_sccs | ( | ControlFlowGraphNode * | entry, |
| ControlFlowGraphNode * | exit | ||
| ) |
Compute all Strongly Connected Components of a single-entry/single-exit region. The entry parameter must dominate the exit parameter.
Definition at line 135 of file cfg-structure.cpp.
|
static |
Definition at line 14 of file IntegerOperations.cpp.
|
static |
Performs constant folding on integer binary operations.
| TBinOp | An integer binary operation |
| operands | The operands of the integer binary operation. |
Definition at line 77 of file IntegerOperations.cpp.
| std::optional< std::vector< rvsdg::Output * > > jlm::llvm::foldMatchOperationWithConstant | ( | const rvsdg::MatchOperation & | matchOperation, |
| const std::vector< rvsdg::Output * > & | operands | ||
| ) |
Definition at line 14 of file ControlOperations.cpp.
|
static |
|
static |
|
static |
|
static |
Definition at line 1779 of file IpGraphToLlvmConverter.cpp.
|
static |
|
static |
|
static |
Definition at line 16 of file CallingConvention.cpp.
|
static |
Definition at line 309 of file InvariantValueRedirection.cpp.
|
static |
|
static |
Definition at line 226 of file ControlFlowRestructuring.cpp.
|
static |
Calculates a hash for the given exit variable, based on the congruence sets of all its branch arguments.
| exitVar | the exit variable |
| context | the context of the common node elimination pass |
Definition at line 748 of file CommonNodeElimination.cpp.
|
static |
Definition at line 179 of file operators.cpp.
|
static |
Definition at line 236 of file IOBarrierElimination.cpp.
|
noexcept |
Determines the formal argument representing global memory state
| lambdaNode | The lambda node to query the memory state for. |
lambdaNode must conform to the modelling assumptions behind llvm function representation as lambdas and memory state encoding. Definition at line 13 of file LambdaMemoryState.cpp.
|
noexcept |
Determines the formal return value representing global memory state
| lambdaNode | The lambda node to query the memory state for. |
lambdaNode must conform to the modelling assumptions behind llvm function representation as lambdas and memory state encoding. Definition at line 22 of file LambdaMemoryState.cpp.
| size_t jlm::llvm::GetTypeAlignment | ( | const rvsdg::Type & | type | ) |
Returns the natural alignment of the given type, in bytes. Types are not guaranteed to be stored at their natural alignment, so instead check the alignment of the store and load operations. A non-packed struct will add padding to maintain alignment.
| type | the ValueType |
| size_t jlm::llvm::GetTypeAllocSize | ( | const rvsdg::Type & | type | ) |
Returns the size of the given type's representation, in bytes. It corresponds to the sizeof() operator in C, so the size is a multiple of the type's alignment. This is the offset between consecutive elements in an array, and also the size of the stack allocation created by an alloca operation with the given type.
| type | the ValueType |
| size_t jlm::llvm::GetTypeStoreSize | ( | const rvsdg::Type & | type | ) |
Returns the size of the given type's representation, in bytes. More specifically, the size is the number of bytes affected when storing value of the given type to memory. Unlike C's sizeof() operator, the size is not rounded up to a multiple of alignment.
| type | the ValueType |
|
static |
Definition at line 1787 of file IpGraphToLlvmConverter.cpp.
|
static |
Definition at line 529 of file cfg-structure.cpp.
|
static |
Definition at line 541 of file cfg-structure.cpp.
|
static |
Definition at line 481 of file cfg-structure.cpp.
| bool jlm::llvm::hasMemoryState | ( | const rvsdg::Node & | node | ) |
Checks if the given node takes any inputs, or produces any outputs, that are of the memory state type.
| node | the node in question |
Definition at line 670 of file MemoryStateOperations.cpp.
|
static |
Definition at line 189 of file NodeHoisting.cpp.
|
static |
Finds alloca nodes from the callee that have been copied into the caller. Moves the alloca nodes to the top level of the caller, and routes their outputs to their users. This avoids having allocas inside theta nodes, which could otherwise cause the stack to overflow.
| callee | the function that has been inlined into the caller |
| caller | the function that now has a copy of callee copied inside it |
| smap | the substitution map used during copying |
Definition at line 240 of file inlining.cpp.
| std::string_view jlm::llvm::iCmpPredicateToString | ( | ICmpPredicate | predicate | ) |
Converts the given comparison predicate to a string
| if | the predicate is not a valid enum value |
Definition at line 211 of file operators.cpp.
|
static |
Inserts the given exitVar as a leader in the hashmap containing exit variable leaders.
| exitVar | the exit variable to insert as a leader |
| congruenceSet | the index of the congruence set the exit variable is leading |
| leaderHashes | the hashmap to add the exit variable as a leader to |
| context | the context of the current common node elimination pass |
exitVar is the leader of the given congruenceSet Definition at line 803 of file CommonNodeElimination.cpp.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Definition at line 70 of file domtree.cpp.
|
static |
Inverts the control values of a rvsdg::MatchOperation with 2 alternatives.
| matchOperation | The rvsdg::MatchOperation for which to invert the control values. |
Definition at line 250 of file ControlFlowRestructuring.cpp.
|
inlinestatic |
Definition at line 163 of file aggregation.hpp.
|
inlinestaticnoexcept |
Definition at line 214 of file cfg-node.hpp.
|
inlinestatic |
|
inlinestaticnoexcept |
Definition at line 74 of file variable.hpp.
|
inlinestatic |
Definition at line 183 of file cfg-structure.hpp.
|
staticnoexcept |
Definition at line 192 of file aggregation.cpp.
|
inlinestaticnoexcept |
Definition at line 214 of file cfg-structure.cpp.
|
staticnoexcept |
Definition at line 186 of file aggregation.cpp.
|
staticnoexcept |
Definition at line 180 of file aggregation.cpp.
| bool jlm::llvm::is_closed | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 566 of file cfg-structure.cpp.
|
static |
Definition at line 50 of file unroll.cpp.
|
static |
Definition at line 309 of file IpGraphToLlvmConverter.cpp.
|
static |
Definition at line 95 of file unroll.cpp.
| bool jlm::llvm::is_linear | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 580 of file cfg-structure.cpp.
|
staticnoexcept |
Definition at line 215 of file aggregation.cpp.
|
inlinestaticnoexcept |
Definition at line 182 of file cfg-structure.cpp.
|
static |
|
static |
|
inlinestaticnoexcept |
Definition at line 176 of file cfg-structure.cpp.
|
static |
|
static |
|
inlinestaticnoexcept |
Definition at line 239 of file cfg-structure.cpp.
| bool jlm::llvm::is_proper_structured | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 623 of file cfg-structure.cpp.
| bool jlm::llvm::is_reducible | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 629 of file cfg-structure.cpp.
|
static |
|
staticnoexcept |
Definition at line 174 of file aggregation.cpp.
|
static |
|
static |
| bool jlm::llvm::is_structured | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 617 of file cfg-structure.cpp.
|
inlinestaticnoexcept |
Definition at line 262 of file cfg-structure.cpp.
|
inlinestaticnoexcept |
Definition at line 274 of file cfg-structure.cpp.
|
static |
Definition at line 59 of file unroll.cpp.
|
static |
| bool jlm::llvm::is_valid | ( | const ControlFlowGraph & | cfg | ) |
Definition at line 547 of file cfg-structure.cpp.
|
static |
Definition at line 517 of file cfg-structure.cpp.
|
inline |
|
static |
Definition at line 286 of file operators.cpp.
|
inline |
Determines if a function / global variable with the given linkage can be removed, if it is not used within the current module.
| linkage | the linkage type |
Definition at line 44 of file Linkage.hpp.
|
static |
Definition at line 1311 of file LlvmModuleConversion.cpp.
|
static |
Definition at line 177 of file DeadNodeElimination.cpp.
|
static |
Definition at line 1304 of file LlvmModuleConversion.cpp.
|
inline |
|
static |
Definition at line 279 of file operators.cpp.
|
inline |
Checks if the given linkage is private or internal.
| linkage | the linkage |
Definition at line 65 of file Linkage.hpp.
|
static |
Determines whether singleSuccessor is the only successor of node. The method returns false iff:
singleSuccessor is connected to node.node.| node | The node for which to check the successors |
| singleSuccessor | The single successor for which to check for |
singleSuccessor is the only successor of node, otherwise false. | bool jlm::llvm::isVectorOf | ( | const rvsdg::Type & | type | ) |
| bool jlm::llvm::isVectorOfSize | ( | const rvsdg::Type & | type, |
| const size_t | size | ||
| ) |
|
static |
In LLVM, the memcpy/memset intrinsic is modeled as a call instruction. It expects four arguments, with the fourth argument being a ConstantInt of bit width 1 to encode the volatile flag for the memcpy/memset instruction. This function takes this argument and converts it to a boolean flag.
| value | The volatile argument of the memcpy/memset intrinsic. |
Definition at line 1173 of file LlvmModuleConversion.cpp.
|
static |
|
static |
Definition at line 201 of file NodeHoisting.cpp.
| Linkage jlm::llvm::linkageFromString | ( | const std::string_view | stringValue | ) |
Definition at line 42 of file Linkage.cpp.
| std::string_view jlm::llvm::linkageToString | ( | const Linkage | linkage | ) |
Definition at line 17 of file Linkage.cpp.
|
static |
|
static |
Tries to find an existing exit variable in the hashmap of exit variable leaders, that is congruent with the given exitVar. If one is found, the exitVar is registered as a follower of the existing leader.
If no existing match is found, the exitVar becomes the leader of its own congruence set, and is added to the hashmap of leaders.
| exitVar | the exit variable to lookup matches for |
| gamma | the gamma node the exit variable belongs to |
| leaderHashes | the hashmap containing existing leaders, and possibly add a new leader to |
| context | the context of the current common node elimination pass |
Definition at line 837 of file CommonNodeElimination.cpp.
|
static |
Definition at line 359 of file NodeHoisting.cpp.
|
static |
Definition at line 213 of file ConversionOperations.cpp.
|
static |
Marks the arguments of the gamma subregions, and the nodes within the subregions. Uses the origins of the branch results of exit variables to assign congruence sets to each exit variable's output. Exit variables can either be congruent with gamma inputs if the output is gamma-invariant, or be congruent with another exit variable.
| gamma | the gamma node to mark. |
| context | the current context of the marking phase. |
Definition at line 877 of file CommonNodeElimination.cpp.
|
static |
Makes all arguments as the leader of their own congruence set.
| region | the region whose arguments should be marked. |
| context | the current context of the marking phase. |
Definition at line 561 of file CommonNodeElimination.cpp.
| void jlm::llvm::markNodeAsLeader | ( | const rvsdg::Node & | leader, |
| CommonNodeElimination::Context & | context | ||
| ) |
Makes each output of the given node be the leader of its own congruence set.
| leader | the node whose outputs should all be leaders. |
| context | the current context of the mark phase. |
Definition at line 353 of file CommonNodeElimination.cpp.
| void jlm::llvm::markNodesAsCongruent | ( | const rvsdg::Node & | leader, |
| const rvsdg::Node & | follower, | ||
| CommonNodeElimination::Context & | context | ||
| ) |
Marks every output of the follower node as a follower of the leader node's respective output. The two nodes must have the same number of outputs, and be from the same region. The leader must come before the follower in the TopDown traverser. The leader must already have congruence sets associated with its outputs.
| leader | the node whose outputs' congruence sets are used, |
| follower | the node whose outputs will follow the other congruence sets, |
| context | the current context of the mark phase. |
Definition at line 372 of file CommonNodeElimination.cpp.
|
static |
Traverses every node in the region and places their outputs in congruence sets. Also recurses into the subregions of structural nodes. Expects the arguments of region to already belong to congruence sets.
| region | the region to perform marking in. |
| context | the current context of the marking phase. |
Definition at line 1105 of file CommonNodeElimination.cpp.
|
static |
Places the given node in a congruence set, based on its operation and inputs. If the node already has a congruence set, it gets double-checked against the leader. The node must not be a top node.
| node | the node to find a congruence set for. |
| context | the current context of the marking phase |
Definition at line 479 of file CommonNodeElimination.cpp.
|
static |
Function for marking the given top node node, marking it congruent with a previously marked top node if their operations are identical. Otherwise it becomes a leader. Maintains a separate list of leader top nodes in the region.
| node | the top node to mark. |
| leaders | the list of all leader top nodes in the region. |
| context | the current context of the marking phase. |
Definition at line 428 of file CommonNodeElimination.cpp.
|
static |
Definition at line 1058 of file CommonNodeElimination.cpp.
|
static |
Marks all arguments in all subregions of the given structural node.
Arguments that correspond to structural inputs can only be congruent if the structural inputs have congruent origins.
This function can be called several times on the same node, and will progressively partition the argument congruence sets. It will never combine arguments from distinct congruence sets back together.
Whenever this method causes changes in the congruence sets of a subregion's arguments, it also marks the subregion.
| node | the structural node |
| context | the current context of the marking phase |
Definition at line 651 of file CommonNodeElimination.cpp.
|
static |
Marks the loop variables and subregion of the given theta node. The loop variables are initially partitioned based on the origins of their inputs. After marking the subregion, the partitioning of the loop variable post results are used to further partition loop variables. The subregion is re-marked until the loop variable partitioning reaches a fixed point. The outputs of the theta node are partitioned based on the loop variables, except for loop invariants, which are made congruent with their origin.
| theta | the theta node to mark. |
| context | the current context of the mark phase. |
Definition at line 953 of file CommonNodeElimination.cpp.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
Definition at line 109 of file IntegerOperations.cpp.
| size_t jlm::llvm::ntacs | ( | const AggregationNode & | root | ) |
Definition at line 502 of file aggregation.cpp.
| size_t jlm::llvm::ntacs | ( | const ControlFlowGraph & | cfg | ) |
|
inlinestatic |
Definition at line 181 of file ipgraph-module.hpp.
|
static |
Uses the provided list of partition indices to partition the arguments of the given region. Each argument has a corresponding value in the partitions list. The exact partition value is not important, but only arguments with identical partition value are allowed to remain in the same congruence set. If a pair of arguments are already in different congruence sets, they will remain separate.
| region | the region whose arguments should be partitioned. |
| partitions | integers used to partition arguments. Must have length equal to the number of arguments in region. |
| context | the current context of the marking phase. |
Definition at line 585 of file CommonNodeElimination.cpp.
|
static |
During conversion of LLVM instructions, phi instructions were created without operands. Once all instructions have been converted, this function goes over all phi instructions and assigns proper operands.
Definition at line 2313 of file LlvmModuleConversion.cpp.
|
static |
|
static |
|
static |
|
static |
|
static |
|
static |
| std::vector< ControlFlowGraphNode * > jlm::llvm::postorder | ( | const ControlFlowGraph & | cfg | ) |
| void jlm::llvm::print | ( | const AggregationNode & | n, |
| const AnnotationMap & | dm, | ||
| FILE * | out | ||
| ) |
|
inlinestatic |
|
inlinestatic |
|
inlinestatic |
| void jlm::llvm::prune | ( | ControlFlowGraph & | cfg | ) |
Removes unreachable nodes from the control flow graph.
| cfg | the control flow graph of a function |
Definition at line 816 of file cfg-structure.cpp.
|
static |
| void jlm::llvm::pull | ( | rvsdg::GammaNode * | gamma | ) |
| void jlm::llvm::pull | ( | rvsdg::Region * | region | ) |
|
static |
|
static |
| void jlm::llvm::pullin_top | ( | rvsdg::GammaNode * | gamma | ) |
| void jlm::llvm::purge | ( | ControlFlowGraph & | cfg | ) |
Remove all basic blocks without instructions.
Definition at line 664 of file cfg-structure.cpp.
|
static |
Definition at line 76 of file unroll.cpp.
|
inlinestatic |
Definition at line 594 of file cfg-structure.cpp.
|
static |
Reduces a branch subgraph to a single node and creates an aggregation subtree for the subgraph. A branch subgraph of the following form:
is reduced to the following aggregation subtree:
Only the split node and the individual branch nodes are reduced. The join node is not reduced.
Definition at line 280 of file aggregation.cpp.
|
inlinestatic |
Definition at line 336 of file cfg-structure.cpp.
|
static |
Reduce a linear subgraph to a single node and create an aggregation subtree for the subgraph. A linear subgraph of the following form:
is reduced to the following aggregation subtree:
Definition at line 340 of file aggregation.cpp.
|
inlinestatic |
Definition at line 316 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 290 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 362 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 409 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 461 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 435 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 381 of file cfg-structure.cpp.
|
inlinestatic |
Definition at line 396 of file cfg-structure.cpp.
|
static |
Reduces a tail-controlled loop subgraph to a single node and creates an aggregation subtree for the subgraph.
Definition at line 235 of file aggregation.cpp.
|
static |
Definition at line 306 of file NodeReduction.cpp.
| bool jlm::llvm::reduceStaticallyKnownPredicate | ( | rvsdg::GammaNode & | gammaNode | ) |
Reduces a gamma node with a statically known predicate to the respective subregion determined by the value of the predicate.
c = gamma 0 [] x = 45 [c <= x] [] y = 37 [c <= y] ... = add c + 5 => c = 45 ... = add c + 5
| gammaNode | A gamma node that is supposed to be reduced. |
|
static |
Definition at line 55 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 805 of file cfg-structure.cpp.
|
static |
Definition at line 463 of file InterProceduralGraphConversion.cpp.
| void jlm::llvm::RestructureBranches | ( | ControlFlowGraph & | cfg | ) |
Definition at line 580 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 484 of file ControlFlowRestructuring.cpp.
| void jlm::llvm::RestructureControlFlow | ( | ControlFlowGraph & | cfg | ) |
Definition at line 598 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 588 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 860 of file InterProceduralGraphConversion.cpp.
|
static |
Definition at line 130 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 156 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 203 of file ControlFlowRestructuring.cpp.
| void jlm::llvm::RestructureLoops | ( | ControlFlowGraph & | cfg | ) |
Definition at line 568 of file ControlFlowRestructuring.cpp.
|
static |
Definition at line 316 of file ControlFlowRestructuring.cpp.
| std::vector< ControlFlowGraphNode * > jlm::llvm::reverse_postorder | ( | const ControlFlowGraph & | cfg | ) |
|
static |
A function body has access to the function's context variables, so inlining requires these context variables to be routed into the call's region.
| region | the region to make the context variables available in |
| callee | the function being called |
region, for each context variable in callee Definition at line 105 of file inlining.cpp.
|
static |
Definition at line 32 of file InvariantValueRedirectionTests.cpp.
|
static |
Definition at line 26 of file IOBarrierEliminationTests.cpp.
|
static |
Definition at line 207 of file IOBarrierElimination.cpp.
|
static |
|
static |
Checks if the intrinsic with the given ID should be ignored in the frontend. Calls to ignored intrinsics become no-ops, and declarations of ignored intrisincs are skipped.
| intrinsicId | the id of the llvm intrinsic |
Definition at line 1707 of file LlvmModuleConversion.cpp.
| static |
| void jlm::llvm::straighten | ( | ControlFlowGraph & | cfg | ) |
Finds all pairs of basic blocks A, B where the edge A -> B is A's only out-edge, and B's only in-edge.
B may not have any Phi operations.
For each such pair, A and B are merged into a single basic block.
| cfg | the control flow graph for a function |
Definition at line 635 of file cfg-structure.cpp.
|
static |
Tarjan's SCC algorithm
Definition at line 79 of file cfg-structure.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| EmptyTheta | |||
| ) |
Definition at line 672 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| GammaInTheta | |||
| ) |
Creates a graph with a gamma node inside a theta node, that looks like:
10
/\
V V
+-----------------—+ | CTRL(0) | | | | V V V | | +----—+----—+ | | | \ | / | | | | V | V | | | +----—+----—+ | | V | | USER1 | | \ | | CTRL(0) | 7 | | V V V | +-----------------—+
After performing CNE, the USER1 should still take its value from the gamma node, and not be re-routed to one of the loop variables, despite the loop variables appearing congruent in the first iteration.
Definition at line 716 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| InvariantLoopOutputs | |||
| ) |
Creates RVSDG that looks like
undef 0 undef
| | |
v v v
+-theta------------------—+ | v v v | | CTR(0) |-----—\ | | v v | | | +-gamma—+-----—+ | | | | v | v | | | | | | | | | | | | | v | v | | | | +------—+-----—+ | | | v | | | /| /-—/ | | /-/ | | | | CTR(0) / | | | | v v v v | +------------------------—+ v v v export(x) | export(z) v export(y)
After running CNE, the exports "x", "y" and "z" should all take their value directly from the constant 0.
Definition at line 887 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| InvariantThetaInTheta | |||
| ) |
Creates an RVSDG graph corresponding to the C code:
The RVSDG looks like this:
zero := IntegerConstant(0) xOut0, yOut0 = theta zero, zero [xPre0, yPre0] { five = IntegerConstant(5); zOut1, yOut1 = theta five, yPre0 [zPre1, yPre1] { predicate1 = CTRL(0) } [predicate1, zPre1, yPre1]
one = IntegerConstant(1) xPlus1 = IntegerAdd xPre0, one
two = IntegerConstant(2) yPlus2 = IntegerAdd yOut1, two
ten = IntegerConstant(10) slt = signedLessThan xPlus1, ten predicate0 = MATCH[1->1, 0] slt }[predicate0, xPlus1, yPlus2]
The test performs common node elimination on the code, which should route value of y around the inner theta, without mixing up x and y in the outer theta.
Definition at line 781 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| MultipleThetas | |||
| ) |
Definition at line 485 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| MultipleThetasPassthrough | |||
| ) |
Definition at line 535 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_gamma | |||
| ) |
Definition at line 74 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_gamma_congruent_exit_vars | |||
| ) |
Creates an RVSDG graph that looks like c := GraphImport("c") // ControlType(2) a := GraphImport("a") // ValueType b := GraphImport("b") // ValueType a2, b2, x, y, z := gamma c, a, b [_, a0 <- a, b0 <- b] { } [a0 -> a2, b0 -> b2, a0 -> x, a0 -> y, b0 -> z] [_, a1 <- a, b1 <- b] { } [a1 -> a2, b1 -> b2, b1 -> x, b1 -> y, a1 -> z] GraphExport(a2) GraphExport(b2) GraphExport(x) GraphExport(y) GraphExport(z)
and checks the result of running CommonNodeElimination.
The exports of a2 and b2 should be redirected directly to the respective imports, while x and y should be merged into a single output. The z graph export should be left alone, as it is unique and non-invariant.
Definition at line 136 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_lambda | |||
| ) |
Definition at line 580 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_phi | |||
| ) |
Definition at line 618 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_simple | |||
| ) |
Definition at line 29 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_theta | |||
| ) |
Definition at line 213 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_theta2 | |||
| ) |
Definition at line 263 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_theta3 | |||
| ) |
Definition at line 308 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_theta4 | |||
| ) |
Definition at line 381 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | CommonNodeEliminationTests | , |
| test_theta5 | |||
| ) |
Definition at line 436 of file CommonNodeEliminationTests.cpp.
| jlm::llvm::TEST | ( | ControlOperationsTests | , |
| foldConstants | |||
| ) |
Definition at line 17 of file ControlOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| fpExtConstantFolding | |||
| ) |
Definition at line 153 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| fpTruncConstantFolding | |||
| ) |
Definition at line 198 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| FunctionToPointerInversion | |||
| ) |
Definition at line 231 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| PointerToFunctionInversion | |||
| ) |
Definition at line 283 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| SExtConstantFolding | |||
| ) |
Definition at line 19 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| TruncConstantFolding | |||
| ) |
Definition at line 107 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | ConversionOperationsTests | , |
| ZExtConstantFolding | |||
| ) |
Definition at line 63 of file ConversionOperationsTests.cpp.
| jlm::llvm::TEST | ( | FBinaryOperationTests | , |
| testFoldConstants | |||
| ) |
Definition at line 369 of file OperatorsTests.cpp.
| jlm::llvm::TEST | ( | FCmpOperationTests | , |
| testFoldConstants | |||
| ) |
Definition at line 253 of file OperatorsTests.cpp.
| jlm::llvm::TEST | ( | GammaTests | , |
| test_predicate_reduction | |||
| ) |
Definition at line 16 of file GammaTests.cpp.
| jlm::llvm::TEST | ( | GetElemenPtrOperationTests | , |
| typeChecks | |||
| ) |
Definition at line 16 of file GetElementPtrTests.cpp.
| jlm::llvm::TEST | ( | GetElementPtrOperationTests | , |
| TestOperationEquality | |||
| ) |
Definition at line 88 of file GetElementPtrTests.cpp.
| jlm::llvm::TEST | ( | GetElementPtrTests | , |
| normalizeIdempotentReduction | |||
| ) |
Definition at line 208 of file GetElementPtrTests.cpp.
| jlm::llvm::TEST | ( | GetElementPtrTests | , |
| TestGetElementPtrOperationConstant_OffestInBytes | |||
| ) |
Definition at line 176 of file GetElementPtrTests.cpp.
| jlm::llvm::TEST | ( | GetElementPtrTests | , |
| TryGetAsConstantTest | |||
| ) |
Definition at line 130 of file GetElementPtrTests.cpp.
| jlm::llvm::TEST | ( | IntegerAddOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 238 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerAndOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 226 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerAShrOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 280 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerEqOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 110 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerEqOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 338 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerLShrOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 292 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerMulOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 250 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerNeOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 116 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerNeOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 343 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerOrOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 170 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerOrOperationTest | , |
| normalizeIdempotent | |||
| ) |
Definition at line 177 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSDivOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 256 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSgeOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 122 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSgeOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 348 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSgtOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 128 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSgtOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 353 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerShlOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 286 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSleOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 134 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSleOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 358 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSltOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 140 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSltOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 363 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSRemOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 268 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSubOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 244 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerSubOperationTests | , |
| normalizeAdditiveInverse | |||
| ) |
Definition at line 298 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUDivOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 262 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUgeOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 146 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUgeOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 368 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUgtOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 152 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUgtOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 373 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUleOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 158 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUltOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 164 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerUltOperationTests | , |
| normalizeIdenticalOperands | |||
| ) |
Definition at line 378 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerURemOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 274 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | IntegerXorOperationTest | , |
| foldConstants | |||
| ) |
Definition at line 232 of file IntegerOperationsTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestCall | |||
| ) |
Definition at line 506 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestCallWithDifferentExternalCompression | |||
| ) |
This test creates a situation where a caller and callee have compressed some memory nodes into the memory state belonging to the external memory. The caller has compressed memory node 3 into external, while the callees have compressed 2 into external.
// callee0 does something to mem0 callee0 = lambda [io, mem] { mem0, mem1, mem3 = LambdaEntrySplit{0, 1, 3} mem mem00 = TestOperation mem0 memMerged = LambdaExitMerge{0, 1, 3} mem00, mem1, mem3 } [io, memMerged]
// callee3 does something to mem3 callee3 = lambda [io, mem] { mem0, mem1, mem3 = LambdaEntrySplit{0, 1, 3} mem mem03 = TestOperation mem3 memMerged = LambdaExitMerge{0, 1, 3} mem0, mem1, mem03 } [io, memMerged]
caller = lambda [io, mem] { mem0, mem1, mem2 = LambdaEntrySplit{0, 1, 2} mem
// calling callee0 callMergedA = CallEntryMerge{0, 1, 2} mem0, mem1, mem2 io, returnMemA = call callee0 io callMergedA mem00, mem01, mem02 = CallExitSplit{0, 1, 2} returnMemA
// calling callee3 callMergedB = CallEntryMerge{0, 1, 2} mem00, mem01, mem02 io, returnMemB = call callee3 io callMergedB mem10, mem11, mem12 = CallExitSplit{0, 1, 2} returnMemB
memMerged = LambdaExitMerge{0, 1, 2} mem10, mem11, mem12 } [io, memMerged]
After InvariantValueRedirection, memory node 1 should be routed around both calls. Memory node 2 should only be routed around the call to callee3. Memory node 0 should not be routed around anything.
Definition at line 860 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestCallWithMemoryStateNodes | |||
| ) |
Creates an RVSDG that looks like
test1 = lambda [c:CTRL(2), x:ValueType, io, mem] { mem1, mem2 = LambdaEntrySplit{1, 2} mem // A gamma that routes the values through in both regions x2, mem3, mem4 = gamma c x mem1, mem2 [_, x, mem1, mem2] { }[x, mem1, mem2] [_, x, mem1, mem2] { }[x, mem1, mem2] memMerged = LambdaExitMerge{1, 2} mem3, mem4 } [x2, io, memMerged]
test2 = lambda [test1 <- test1, x:ValueType, io, mem] { mem1, mem2 = LambdaEntrySplit{1, 2} mem callMerged = CallEntryMerge{1, 2} mem1, mem2 c = CTRL(0) x2, io, returnMem = call test1 c x io callMerged mem3, mem4 = CallExitSplit{2, 1} returnMem memMerged = LambdaExitMerge{2, 1} mem3, mem4 } [x2, io, memMerged]
After InvariantValueRedirection, the LambdaExitMerge in test2 should be directly connected to the LambdaEntrySplit in test2, with the correct memory node indices matching up.
The test uses memory node indices 1 and 2, since 0 is reserved for the external node.
Definition at line 593 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestCallWithMissingMemoryStateNodes | |||
| ) |
Definition at line 739 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestGamma | |||
| ) |
Definition at line 44 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testGammaControlConstantRedirection_Failure | |||
| ) |
Definition at line 163 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testGammaControlConstantRedirection_Success | |||
| ) |
Definition at line 92 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testGammaIntegerConstantRedirection_Failure | |||
| ) |
Definition at line 305 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testGammaIntegerConstantRedirection_Success | |||
| ) |
Definition at line 231 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestLambdaCallArgumentMismatch | |||
| ) |
Definition at line 1050 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testLoadWithDeadLoadedValue | |||
| ) |
Definition at line 1148 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| TestTheta | |||
| ) |
Definition at line 376 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testThetaConstantRedirection | |||
| ) |
Definition at line 427 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | InvariantValueRedirectionTests | , |
| testThetaGammaRedirection | |||
| ) |
Definition at line 1069 of file InvariantValueRedirectionTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierElimination | , |
| testStoreMarking | |||
| ) |
Definition at line 623 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTest | , |
| testNormalizeation | |||
| ) |
Definition at line 550 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testGamma | |||
| ) |
Definition at line 221 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testInvidiualIOBarrierUserRerouting | |||
| ) |
Definition at line 161 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testLambdaArgument | |||
| ) |
Definition at line 34 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testLoadsInGammaNoReturn | |||
| ) |
Definition at line 442 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testNormalizationFromLoadedAddress | |||
| ) |
Definition at line 692 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testOnlyLoadsInGamma | |||
| ) |
Definition at line 291 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testOnlyLoadsInGammaFailure | |||
| ) |
Definition at line 381 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testSizeIsRespected | |||
| ) |
Definition at line 71 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | IOBarrierEliminationTests | , |
| testSuccess | |||
| ) |
Definition at line 116 of file IOBarrierEliminationTests.cpp.
| jlm::llvm::TEST | ( | MemoryHoistBarrierTests | , |
| normalizeNestedMemoryHoistBarriers | |||
| ) |
Definition at line 18 of file IOBarrierTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| controlConstants | |||
| ) |
Creates an RVSDG that looks like
+-lambda--------------------—x-x-+ | undef | | | | v | | | | +-theta--—x-----—+ | | | | | | | | | | | Ctrl(0) Ctrl(1) | | | | | | v v | | | | | +—x----—x-----—+ | | | | v | | | | +-gamma1-—+--------—+ | | | | | | | | | | | | Ctrl(1) | Ctrl(0) | | | | | | v | v | | | | | +-—x---—+--—x--—+ | | | | v | | | | +-gamma2-—+--------—+ | | | | | | | | | | | | Int32(3) | Int32(7) | | | | | | v | v | | | | | +-—x---—+--—x--—+ | | | | v v v | +---—x--------------------—x-x-+
and checks that none of the control constants are moved by the node hoisting pass.
Definition at line 375 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| hoistLoadNodeOutOfGammaInTheta | |||
| ) |
Definition at line 700 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| hoistLoadNodesOutOfGamma | |||
| ) |
Definition at line 496 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| hoistLoadNodesOutofNestedGamma | |||
| ) |
Definition at line 576 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| invariantMemoryOperation | |||
| ) |
Definition at line 240 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| nestedGamma | |||
| ) |
Definition at line 92 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| simpleGamma | |||
| ) |
Definition at line 28 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| simpleTheta | |||
| ) |
Definition at line 172 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeHoistingTests | , |
| statefulOperations | |||
| ) |
Definition at line 298 of file NodeHoistingTests.cpp.
| jlm::llvm::TEST | ( | NodeReductionTests | , |
| MultipleReductionsPerRegion | |||
| ) |
Definition at line 25 of file NodeReductionTests.cpp.
| jlm::llvm::TEST | ( | PtrCmpOperationTests | , |
| testNormalizeIdenticalOperands | |||
| ) |
Definition at line 238 of file OperatorsTests.cpp.
| jlm::llvm::TEST | ( | PtrCmpOperationTests | , |
| testNormalizeNullPointerComparison | |||
| ) |
Definition at line 68 of file OperatorsTests.cpp.
|
static |
Definition at line 33 of file IntegerOperationsTests.cpp.
|
static |
Definition at line 71 of file IntegerOperationsTests.cpp.
|
static |
Definition at line 24 of file OperatorsTests.cpp.
|
inlinestatic |
| std::string jlm::llvm::to_str | ( | const AggregationNode & | n, |
| const AnnotationMap & | dm | ||
| ) |
| std::string jlm::llvm::to_str | ( | const InterProceduralGraph & | clg | ) |
|
inlinestatic |
|
static |
Definition at line 296 of file MemoryStateOperations.cpp.
| bool jlm::llvm::TraceAllPointerOrigins | ( | TracedPointerOrigin | p, |
| TraceCollection & | traceCollection, | ||
| size_t | maxTraceCollectionSize | ||
| ) |
Traces to find all possible origins of the given pointer. Traces through GetElementPtrOperation, including those with offsets that are not known at compile time. Also traces through gamma and theta nodes, building a set of multiple possibilities. Tracing stops at "top origins", for example an AllocaOperation, a LoadNonVolatileOperation, the return value of a CallOperation etc.
| p | the pointer to trace from |
| traceCollection | the collection of trace points being created |
| maxTraceCollectionSize | the number of outputs a pointer can be traced to before giving up |
|
static |
|
inline |
| rvsdg::Output & jlm::llvm::traceOutput | ( | rvsdg::Output & | output, |
| bool | mayEnterSubregions, | ||
| const rvsdg::Region * | withinRegion = nullptr |
||
| ) |
Traces the origin of the given output to find the origin of the value. The optional parameter withinRegion prevents values from being traced out of the region. If it is a nullptr, tracing will continue until the output no longer changes. Traces through everything handled by jlm::rvsdg::traceOutput, with the addition of LLVM-specific operations.
| output | the output to start tracing from |
| mayEnterSubregions | if true, the result can be in a sub/sibling region |
| withinRegion | the region to stop at (if any). |
| TracedPointerOrigin jlm::llvm::TracePointerOriginPrecise | ( | const rvsdg::Output & | p | ) |
Returns the result of tracing the origin of p as far as possible, without tracing through operations that add an unknown offsets, or add multiple possible origins. Since the pointer has exactly one possible origin with a statically known offset, it may be possible to give MustAlias responses. If not, more extensive tracing can be performed using TraceAllPointerOrigins.
| p | the pointer value to trace |
|
static |
| std::optional< int64_t > jlm::llvm::tryGetConstantSignedInteger | ( | const rvsdg::Output & | output | ) |
Attempts to find the constant integer value of a given output, by normalizing it back to its source operation. If it is a constant integer operation, the constant is returned as a signed 64-bit integer.
| output | an output that may be a constant integer. |
|
static |
Checks if the given gamma exitVar is always a copy of some other origin in the region the gamma is in. This happens if each branch result of the exit var is a copy of an entry variable, and all copied entry variables take their value from congruent origins outside the gamma. If this is the case, the congruence set of that origin is returned.
| exitVar | the exit variable in question |
| context | the current context of the marking phase. |
Definition at line 707 of file CommonNodeElimination.cpp.
| const rvsdg::SimpleNode * jlm::llvm::tryGetLeaderNode | ( | const rvsdg::SimpleNode & | node, |
| CommonNodeElimination::Context & | context | ||
| ) |
Checks if the given simple node has been visited already during the mark phase. If so, it returns the leader it is congruent with. All outputs of node are congruent with the respective output of the leader.
| node | the simple node in question. |
| context | the current context of the mark phase. |
Definition at line 398 of file CommonNodeElimination.cpp.
|
noexcept |
Determines the memory state split node at entry.
| lambdaNode | The lambda node to query the memory state entry split node for. |
lambdaNode must conform to the modelling assumptions behind llvm function representation as lambdas and memory state encoding.Definition at line 40 of file LambdaMemoryState.cpp.
|
noexcept |
Determines the memory state merge node at exit.
| lambdaNode | The lambda node to query the memory state exit mux node for. |
lambdaNode must conform to the modelling assumptions behind llvm function representation as lambdas and memory state encoding.Definition at line 31 of file LambdaMemoryState.cpp.
|
static |
After the body of a function has been copied to the region of a call node, and inputs and outputs of the call have been routed to the copied body, we may have a graph that looks like:
| | | V V V [4] [7] [9]
CallEntryMemoryStateMerge | V LambdaEntryMemoryStateSplit [4] [9] | | V V
[ rest of function ] [ body goes here ]
| | V V [4] [9] LambdaExitMemoryStateMerge | V CallExitMemoryStateSplit [4] [7] [9] | | | V V V
In these cases, we want to remove all the merge and split nodes, and route the relevant memory states into the function body directly. Memory state IDs that are unused within the function, such as [9] in the example above, are instead routed around from the call merge. Memory states IDs that only exist inside the function body are given undef nodes.
| callEntryMerge | the call entry merge node in the diagram above |
| callExitSplit | the call exit split node in the diagram above |
Definition at line 160 of file inlining.cpp.
|
static |
Definition at line 498 of file unroll.cpp.
| void jlm::llvm::unroll | ( | rvsdg::ThetaNode * | node, |
| size_t | factor | ||
| ) |
Try to unroll the given theta.
| node | The theta to attempt the unrolling on. |
| factor | The number of times to unroll the loop, e.g., if the factor is two then the loop body is duplicated in the unrolled loop. |
Definition at line 482 of file unroll.cpp.
|
static |
Definition at line 179 of file unroll.cpp.
|
static |
Definition at line 304 of file unroll.cpp.
|
static |
Definition at line 218 of file unroll.cpp.
|
static |
Definition at line 402 of file unroll.cpp.
|
static |
Definition at line 788 of file cfg-structure.cpp.
|
static |
Definition at line 767 of file cfg-structure.cpp.
|
static |
|
static |
Definition at line 58 of file StoreValueForwarding.cpp.
|
static |
Definition at line 49 of file StoreValueForwarding.cpp.
|
static |
Definition at line 52 of file StoreValueForwarding.cpp.
|
static |
Definition at line 27 of file CommonNodeEliminationTests.cpp.
|
static |
Definition at line 45 of file StoreValueForwarding.cpp.