PandA-2024.02
|
Class performing some optimizations exploiting the reduction of BB with n inputs and m outputs. More...
#include <multiple_entry_if_reduction.hpp>
Public Member Functions | |
MultipleEntryIfReduction (const ParameterConstRef _Param, const application_managerRef _AppM, unsigned int function_id, const DesignFlowManagerConstRef design_flow_manager) | |
Constructor. More... | |
~MultipleEntryIfReduction () override | |
Destructor. More... | |
DesignFlowStep_Status | InternalExec () override |
Extract patterns from the IR. More... | |
void | Initialize () override |
Initialize the step (i.e., like a constructor, but executed just before exec. More... | |
bool | HasToBeExecuted () const override |
Check if this step has actually to be executed. More... | |
Public Member Functions inherited from FunctionFrontendFlowStep | |
FunctionFrontendFlowStep (const application_managerRef AppM, const unsigned int function_id, const FrontendFlowStepType frontend_flow_step_type, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
~FunctionFrontendFlowStep () override | |
Destructor. More... | |
void | ComputeRelationships (DesignFlowStepSet &relationship, const DesignFlowStep::RelationshipType relationship_type) override |
Compute the relationships of a step with other steps. More... | |
std::string | GetSignature () const override |
Return the signature of this step. More... | |
std::string | GetName () const override |
Return the name of this design step. More... | |
DesignFlowStep_Status | Exec () final |
Execute the step. More... | |
unsigned int | CGetBBVersion () const |
unsigned int | GetBitValueVersion () const |
void | PrintInitialIR () const override |
Dump the initial intermediate representation. More... | |
void | PrintFinalIR () const override |
Dump the final intermediate representation. More... | |
Public Member Functions inherited from FrontendFlowStep | |
FrontendFlowStep (const application_managerRef AppM, const FrontendFlowStepType frontend_flow_step_type, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
~FrontendFlowStep () override | |
Destructor. More... | |
virtual std::string | GetKindText () const |
Return the name of the type of this frontend flow step. More... | |
DesignFlowStepFactoryConstRef | CGetDesignFlowStepFactory () const override |
Return the factory to create this type of steps. More... | |
void | PrintTreeManager (const bool before) const |
Dump the tree manager. More... | |
Public Member Functions inherited from DesignFlowStep | |
DesignFlowStep (const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters) | |
Constructor. More... | |
virtual | ~DesignFlowStep () |
Destructor. More... | |
DesignFlowStep_Status | GetStatus () const |
Return the status of this design step. More... | |
virtual void | WriteDot (std::ostream &out) const |
Write the label for a dot graph. More... | |
bool | IsComposed () const |
Returns if this step is composed. More... | |
int | CGetDebugLevel () const |
Return the debug level of the step. More... | |
Private Member Functions | |
double | GetAreaCost (const std::list< tree_nodeRef > &list_of_stmt) const |
Estimate the area cost of the statements of a basic block. More... | |
const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship > > | ComputeFrontendRelationships (const DesignFlowStep::RelationshipType relationship_type) const override |
Return the set of analyses in relationship with this design step. More... | |
Private Attributes | |
tree_managerRef | TM |
The tree manager. More... | |
tree_manipulationRef | tree_man |
The tree manipulation. More... | |
statement_list * | sl {nullptr} |
The statement list. More... | |
bool | bb_modified {false} |
Modified file. More... | |
ScheduleRef | schedule |
The scheduling solution. More... | |
AllocationInformationConstRef | allocation_information |
The allocation information. More... | |
Additional Inherited Members | |
Public Types inherited from FrontendFlowStep | |
using | FunctionRelationship = enum { ALL_FUNCTIONS, CALLED_FUNCTIONS, CALLING_FUNCTIONS, SAME_FUNCTION, WHOLE_APPLICATION } |
The different relationship type between function analysis. More... | |
Public Types inherited from DesignFlowStep | |
enum | RelationshipType { DEPENDENCE_RELATIONSHIP, INVALIDATION_RELATIONSHIP, PRECEDENCE_RELATIONSHIP } |
The relationship type. More... | |
Static Public Member Functions inherited from FunctionFrontendFlowStep | |
static const std::string | ComputeSignature (const FrontendFlowStepType frontend_flow_step_type, const unsigned int function_id) |
Compute the signature of a function frontend flow step. More... | |
Static Public Member Functions inherited from FrontendFlowStep | |
static void | CreateSteps (const DesignFlowManagerConstRef design_flow_manager, const CustomUnorderedSet< std::pair< FrontendFlowStepType, FunctionRelationship >> &frontend_relationships, const application_managerConstRef application_manager, DesignFlowStepSet &relationships) |
Create the relationship steps of a step with other steps starting from already specified dependencies between frontend flow steps. More... | |
static const std::string | EnumToKindText (const FrontendFlowStepType frontend_flow_step_type) |
Given a frontend flow step type, return the name of the type. More... | |
Protected Member Functions inherited from FunctionFrontendFlowStep | |
void | WriteBBGraphDot (const std::string &filename) const |
Write the current version of statement list in dot format. More... | |
Protected Attributes inherited from FunctionFrontendFlowStep | |
const FunctionBehaviorRef | function_behavior |
The function behavior of the function to be analyzed. More... | |
const unsigned int | function_id |
The index of the function to be analyzed. More... | |
unsigned int | bb_version |
The version of the basic block intermediate representation on which this step has been applied. More... | |
unsigned int | bitvalue_version |
The version of the bitvalue information on which this step has been applied. More... | |
Protected Attributes inherited from FrontendFlowStep | |
const application_managerRef | AppM |
The application manager. More... | |
const FrontendFlowStepType | frontend_flow_step_type |
The type of this step. More... | |
unsigned int | print_counter |
Print counter. More... | |
Protected Attributes inherited from DesignFlowStep | |
bool | composed |
True if this step represents a composition of design flow steps (e.g., a flow); must be set by specialized constructors. More... | |
const Wrefcount< const DesignFlowManager > | design_flow_manager |
The design flow manager. More... | |
const ParameterConstRef | parameters |
Set of input parameters. More... | |
int | debug_level |
The debug level. More... | |
const int | output_level |
The output level. More... | |
Class performing some optimizations exploiting the reduction of BB with n inputs and m outputs.
The block have to contain only phi or conditional statements (such as if and multi way if)
Definition at line 101 of file multiple_entry_if_reduction.hpp.
MultipleEntryIfReduction::MultipleEntryIfReduction | ( | const ParameterConstRef | _Param, |
const application_managerRef | _AppM, | ||
unsigned int | function_id, | ||
const DesignFlowManagerConstRef | design_flow_manager | ||
) |
Constructor.
_Param | is the set of the parameters |
_AppM | is the application manager |
function_id | is the identifier of the function |
design_flow_manager | is the design flow manager |
Definition at line 118 of file multiple_entry_if_reduction.cpp.
References DesignFlowStep::debug_level, DEBUG_LEVEL_NONE, GET_CLASS, DesignFlowStep::parameters, and ~MultipleEntryIfReduction().
|
overridedefault |
|
overrideprivatevirtual |
Return the set of analyses in relationship with this design step.
relationship_type | is the type of relationship to be considered |
Implements FrontendFlowStep.
Definition at line 129 of file multiple_entry_if_reduction.cpp.
References ABORTED, DesignFlowStep::DEPENDENCE_RELATIONSHIP, EMPTY, DesignFlowStep::GetStatus(), DesignFlowStep::INVALIDATION_RELATIONSHIP, NONEXISTENT, DesignFlowStep::PRECEDENCE_RELATIONSHIP, SAME_FUNCTION, SKIPPED, SUCCESS, THROW_UNREACHABLE, UNCHANGED, UNEXECUTED, and UNNECESSARY.
|
private |
Estimate the area cost of the statements of a basic block.
Definition at line 1058 of file multiple_entry_if_reduction.cpp.
References allocation_information, DesignFlowStep::debug_level, DEBUG_LEVEL_VERY_PEDANTIC, AllocationInformation::GetStatementArea(), INDENT_DBG_MEX, and STR.
Referenced by InternalExec().
|
overridevirtual |
Check if this step has actually to be executed.
Reimplemented from FunctionFrontendFlowStep.
Definition at line 178 of file multiple_entry_if_reduction.cpp.
References FunctionFrontendFlowStep::ComputeSignature(), DesignFlowStep::design_flow_manager, FunctionFrontendFlowStep::function_id, Wrefcount< T >::lock(), and DesignFlowStep::parameters.
|
overridevirtual |
Initialize the step (i.e., like a constructor, but executed just before exec.
Reimplemented from DesignFlowStep.
Definition at line 195 of file multiple_entry_if_reduction.cpp.
References allocation_information, FrontendFlowStep::AppM, bb_modified, tree_manager::CGetTreeNode(), FunctionFrontendFlowStep::function_id, GET_NODE, DesignFlowStep::parameters, sl, TM, and tree_man.
|
overridevirtual |
Extract patterns from the IR.
if the operation had been done
list to save the block to eliminate after the reduction
The basic block graphs
Analyze if a basic block is a possible candidate
We skip basic block containing gimple_call since it would require modification of the call graph
Skip headers
The index of the loop to be considered (the most internal loops which contains the definition and all the uses
The depth of the loop to be considered
Create the copies
Fixing phi: duplicating def_edge of ssa name which are not defined in the current bb
Build list of phis + gimple_nodes
The ssa defined by the statement (left part of gimple assignment and vdef)
The set of basic block uses
The set of statement uses
The set of reaching definition
Cache of created phi - first key is the used ssa - second key is the basic block where is created
Duplicating statement
Defined in a different basic block
The old ssa
Management of vuses for overwrite
Use is in the considered loop
Use is in a more nested loop
Use is in a less nested loop
Set of basic blocks belonging to the loop
Check if there a use of the ssa in the header; if not basic blocks after uses can be removed
Remove all basic blocks from which no use can be reached
Set of basic blocks to be analyzed
True if different definitions reach this bb from all the bbs
If this is the basic block contains a use
If the basic block is the source of a feedback edge, fix the phi in the header
endfor-list_of_bloc
eliminate the blocks (remove them from the tree)
Implements FunctionFrontendFlowStep.
Definition at line 209 of file multiple_entry_if_reduction.cpp.
References FrontendFlowStep::AppM, FunctionBehavior::BB, BB_EXIT, block::block(), tree_manager::CGetTreeNode(), tree_manager::CGetTreeReindex(), tree_helper::CGetType(), tree_helper::ComputeSsaUses(), tree_manipulation::create_phi_node(), tree_manipulation::create_ssa_name(), DesignFlowStep::debug_level, DEBUG_LEVEL_VERY_PEDANTIC, FB_CFG_SELECTOR, FunctionBehavior::FBB, FunctionFrontendFlowStep::function_behavior, FunctionFrontendFlowStep::function_id, GET_CONST_NODE, GET_NODE, GetAreaCost(), FunctionFrontendFlowStep::GetName(), tree_manager::GetTreeNode(), tree_manager::GetTreeReindex(), INDENT_DBG_MEX, index, tree_node::index, statement_list::list_of_bloc, max, DesignFlowStep::parameters, phi, tree_manager::ReplaceTreeNode(), sl, STR, SUCCESS, lenet_tvm::target, THROW_ASSERT, THROW_UNREACHABLE, TM, tree_man, and UNCHANGED.
|
private |
The allocation information.
Definition at line 120 of file multiple_entry_if_reduction.hpp.
Referenced by GetAreaCost(), and Initialize().
Modified file.
Definition at line 114 of file multiple_entry_if_reduction.hpp.
Referenced by Initialize().
|
private |
The scheduling solution.
Definition at line 117 of file multiple_entry_if_reduction.hpp.
|
private |
The statement list.
Definition at line 111 of file multiple_entry_if_reduction.hpp.
Referenced by Initialize(), and InternalExec().
|
private |
The tree manager.
Definition at line 105 of file multiple_entry_if_reduction.hpp.
Referenced by Initialize(), and InternalExec().
|
private |
The tree manipulation.
Definition at line 108 of file multiple_entry_if_reduction.hpp.
Referenced by Initialize(), and InternalExec().