PandA-2024.02
data_dependence_computation.cpp
Go to the documentation of this file.
1 /*
2  *
3  * _/_/_/ _/_/ _/ _/ _/_/_/ _/_/
4  * _/ _/ _/ _/ _/_/ _/ _/ _/ _/ _/
5  * _/_/_/ _/_/_/_/ _/ _/_/ _/ _/ _/_/_/_/
6  * _/ _/ _/ _/ _/ _/ _/ _/ _/
7  * _/ _/ _/ _/ _/ _/_/_/ _/ _/
8  *
9  * ***********************************************
10  * PandA Project
11  * URL: http://panda.dei.polimi.it
12  * Politecnico di Milano - DEIB
13  * System Architectures Group
14  * ***********************************************
15  * Copyright (C) 2004-2024 Politecnico di Milano
16  *
17  * This file is part of the PandA framework.
18  *
19  * The PandA framework is free software; you can redistribute it and/or modify
20  * it under the terms of the GNU General Public License as published by
21  * the Free Software Foundation; either version 3 of the License, or
22  * (at your option) any later version.
23  *
24  * This program is distributed in the hope that it will be useful,
25  * but WITHOUT ANY WARRANTY; without even the implied warranty of
26  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27  * GNU General Public License for more details.
28  *
29  * You should have received a copy of the GNU General Public License
30  * along with this program. If not, see <http://www.gnu.org/licenses/>.
31  *
32  */
41 
43 #include "Parameter.hpp"
44 
46 #include "application_manager.hpp"
47 #include "basic_block.hpp"
48 #include "function_behavior.hpp"
49 #include "op_graph.hpp"
51 
53 #include "behavioral_helper.hpp"
54 #include "dbgPrintHelper.hpp" // for DEBUG_LEVEL_
55 #include "string_manipulation.hpp" // for GET_CLASS
56 #include "tree_manager.hpp"
57 #include "tree_node.hpp"
58 
59 #include "custom_map.hpp"
60 #include "custom_set.hpp"
61 
63  const FrontendFlowStepType _frontend_flow_step_type,
64  const DesignFlowManagerConstRef _design_flow_manager,
65  const ParameterConstRef _parameters)
66  : FunctionFrontendFlowStep(_AppM, _function_id, _frontend_flow_step_type, _design_flow_manager, _parameters)
67 {
68 }
69 
71 
73 {
74  if(frontend_flow_step_type == SCALAR_SSA_DATA_FLOW_ANALYSIS)
75  {
76  return Computedependencies<unsigned int>(DFG_SCA_SELECTOR, FB_DFG_SCA_SELECTOR, ADG_SCA_SELECTOR,
78  }
79  else if(frontend_flow_step_type == VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS)
80  {
81  auto res = Computedependencies<unsigned int>(DFG_AGG_SELECTOR, FB_DFG_AGG_SELECTOR, ADG_AGG_SELECTOR,
84  return res;
85  }
86  else
87  {
88  THROW_UNREACHABLE("Unexpected data flow analysis type");
89  }
91 }
92 
93 static void ordered_dfs(unsigned u, const OpGraphConstRef avg, CustomUnorderedMap<vertex, unsigned>& pos,
94  std::vector<vertex>& rev_pos, std::vector<bool>& vis,
95  CustomUnorderedSet<std::pair<unsigned, unsigned>>& keep)
96 {
97  vis[u] = true;
99  OutEdgeIterator ei, ei_end;
100  auto statement = rev_pos.at(u);
101  for(boost::tie(ei, ei_end) = boost::out_edges(statement, *avg); ei != ei_end; ei++)
102  {
103  auto vi = boost::target(*ei, *avg);
104  if(pos.find(vi) != pos.end())
105  {
106  to.insert(pos.find(vi)->second);
107  }
108  }
109  for(auto dest : to)
110  {
111  if(!vis[dest])
112  {
113  keep.insert(std::make_pair(u, dest));
114  ordered_dfs(dest, avg, pos, rev_pos, vis, keep);
115  }
116  }
117 }
118 
120 {
121  const BBGraphRef bb_fcfg = function_behavior->GetBBGraph(FunctionBehavior::BB);
123  if(parameters->getOption<bool>(OPT_print_dot))
124  {
125  std::string file_name;
126  file_name = "AGG_VIRTUALG.dot";
127  function_behavior->CGetOpGraph(FunctionBehavior::AGG_VIRTUALG)->WriteDot(file_name, 1);
128  }
129  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---do_dependence_reduction");
130  VertexIterator basic_block, basic_block_end;
131  for(boost::tie(basic_block, basic_block_end) = boost::vertices(*bb_fcfg); basic_block != basic_block_end;
132  basic_block++)
133  {
134  const auto bb_node_info = bb_fcfg->CGetBBNodeInfo(*basic_block);
136  std::vector<vertex> rev_pos;
137  unsigned posIndex = 0;
138  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Analyzing BB" + STR(bb_node_info->get_bb_index()));
139  for(const auto statement : bb_node_info->statements_list)
140  {
141  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---Analyzing operation " + GET_NAME(avg, statement));
142  pos[statement] = posIndex;
143  ++posIndex;
144  rev_pos.push_back(statement);
145  }
146  std::vector<bool> vis(posIndex, false);
147  const auto n_stmts = bb_node_info->statements_list.size();
149  for(posIndex = 0; posIndex < n_stmts; ++posIndex)
150  {
151  if(!vis.at(posIndex))
152  {
153  ordered_dfs(posIndex, avg, pos, rev_pos, vis, keep);
154  for(unsigned posIndex0 = posIndex + 1; posIndex0 < n_stmts; ++posIndex0)
155  {
156  if(vis.at(posIndex0))
157  {
158  vis[posIndex0] = false;
159  }
160  }
161  }
162  }
163  for(const auto statement : bb_node_info->statements_list)
164  {
165  vertex vi;
166  OutEdgeIterator ei, ei_end;
167  std::list<EdgeDescriptor> to_be_removed;
168  for(boost::tie(ei, ei_end) = boost::out_edges(statement, *avg); ei != ei_end; ei++)
169  {
170  vi = boost::target(*ei, *avg);
171  if(pos.find(vi) != pos.end())
172  {
173  auto key = std::make_pair(pos.at(statement), pos.at(vi));
174  if(keep.find(key) == keep.end())
175  {
176  to_be_removed.push_back(*ei);
177  }
178  }
179  }
180  for(auto e0 : to_be_removed)
181  {
182  function_behavior->ogc->RemoveSelector(e0, DFG_AGG_SELECTOR);
183  function_behavior->ogc->RemoveSelector(e0, ADG_AGG_SELECTOR);
184  }
185  }
186  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Analyzed " + STR(bb_node_info->get_bb_index()));
187  }
188  function_behavior->ogc->CompressEdges();
189  if(parameters->getOption<bool>(OPT_print_dot))
190  {
191  std::string file_name;
192  file_name = "AGG_VIRTUALG-post.dot";
193  function_behavior->CGetOpGraph(FunctionBehavior::AGG_VIRTUALG)->WriteDot(file_name, 1);
194  file_name = "OP_FFLSAODG2.dot";
195  function_behavior->CGetOpGraph(FunctionBehavior::FFLSAODG)->WriteDot(file_name, 1);
196  }
197 }
198 
199 template <typename type>
200 DesignFlowStep_Status DataDependenceComputation::Computedependencies(const int dfg_selector, const int fb_dfg_selector,
201  const int adg_selector, const int fb_adg_selector)
202 {
203  const auto TM = AppM->get_tree_manager();
204  const OpGraphConstRef cfg = function_behavior->CGetOpGraph(FunctionBehavior::CFG);
205  const BehavioralHelperConstRef behavioral_helper = function_behavior->CGetBehavioralHelper();
206 #ifndef NDEBUG
207  const std::string function_name = behavioral_helper->get_function_name();
208 #endif
209  // Maps between a variable and its definitions
210  std::map<type, CustomOrderedSet<vertex>> defs, overs;
211  VertexIterator vi, vi_end;
212  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Computing definitions");
213  for(boost::tie(vi, vi_end) = boost::vertices(*cfg); vi != vi_end; vi++)
214  {
215  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Definitions in " + GET_NAME(cfg, *vi));
216  const auto& local_defs = GetVariables<type>(*vi, FunctionBehavior_VariableAccessType::DEFINITION);
217  for(auto local_def : local_defs)
218  {
219  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "---" + TM->get_tree_node_const(local_def)->ToString());
220  defs[local_def].insert(*vi);
221  }
223  }
224  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Computed definitions");
225  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Computing overwritings");
226  for(boost::tie(vi, vi_end) = boost::vertices(*cfg); vi != vi_end; vi++)
227  {
228  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Overwritings in " + GET_NAME(cfg, *vi));
229  const auto& local_overs = GetVariables<type>(*vi, FunctionBehavior_VariableAccessType::OVER);
230  for(auto local_over : local_overs)
231  {
233  "---" + TM->get_tree_node_const(local_over)->ToString());
234  overs[local_over].insert(*vi);
235  }
237  }
238  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Computed overwritings");
239  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "-->Computing dependencies");
240  for(boost::tie(vi, vi_end) = boost::vertices(*cfg); vi != vi_end; vi++)
241  {
243  "-->Computing anti and data dependencies of vertex " + GET_NAME(cfg, *vi));
244  for(auto local_use : GetVariables<type>(*vi, FunctionBehavior_VariableAccessType::USE))
245  {
247  "-->Considering use of " + TM->get_tree_node_const(local_use)->ToString());
248  if(defs.find(local_use) != defs.end())
249  {
250  for(const auto this_def : defs.find(local_use)->second)
251  {
252  const bool forward_dependence = function_behavior->CheckReachability(this_def, *vi);
253  const bool feedback_dependence = function_behavior->CheckReachability(*vi, this_def);
254  THROW_ASSERT(!(forward_dependence and feedback_dependence),
255  "Dependence between operation " + GET_NAME(cfg, this_def) + " and " + GET_NAME(cfg, *vi) +
256  " is in both the direction");
257  if(forward_dependence)
258  {
260  "---Adding data dependence " + GET_NAME(cfg, this_def) + "-->" + GET_NAME(cfg, *vi));
261  function_behavior->ogc->AddEdge(this_def, *vi, dfg_selector);
262  function_behavior->ogc->add_edge_info(this_def, *vi, DFG_SELECTOR, local_use);
263  if(function_behavior->CheckFeedbackReachability(*vi, this_def))
264  {
265  function_behavior->ogc->AddEdge(*vi, this_def, fb_adg_selector);
267  function_behavior->ogc->add_edge_info(this_def, *vi, ADG_SELECTOR, local_use);
268  }
269  }
270 
271  if(feedback_dependence)
272  {
274  "---Checking for feedback data dependence " + GET_NAME(cfg, this_def) + "-->" +
275  GET_NAME(cfg, *vi));
276  if(*vi != this_def)
277  {
278  function_behavior->ogc->AddEdge(*vi, this_def, adg_selector);
279  function_behavior->ogc->add_edge_info(*vi, this_def, ADG_SELECTOR, local_use);
280  }
281  if(function_behavior->CheckFeedbackReachability(this_def, *vi))
282  {
283  function_behavior->ogc->AddEdge(this_def, *vi, fb_dfg_selector);
285  function_behavior->ogc->add_edge_info(this_def, *vi, DFG_SELECTOR, local_use);
286  }
287  }
288 
289  if(*vi == this_def)
290  {
291  function_behavior->ogc->AddEdge(*vi, *vi, fb_dfg_selector);
292  function_behavior->ogc->add_edge_info(*vi, *vi, DFG_SELECTOR, local_use);
293  }
294  }
295  }
296  if(overs.find(local_use) != overs.end())
297  {
298  for(const auto this_over : overs.find(local_use)->second)
299  {
300  const bool dependence = function_behavior->CheckReachability(*vi, this_over);
301  if(dependence)
302  {
304  "---Adding anti dependence " + GET_NAME(cfg, *vi) + "-->" + GET_NAME(cfg, this_over));
305  function_behavior->ogc->AddEdge(*vi, this_over, adg_selector);
306  function_behavior->ogc->add_edge_info(*vi, this_over, ADG_SELECTOR, local_use);
307  }
308  }
309  }
311  }
313  "<--Computed anti and data dependencies of vertex " + GET_NAME(cfg, *vi));
315  "-->Computing output dependencies of vertex " + GET_NAME(cfg, *vi));
316  for(auto local_def : GetVariables<type>(*vi, FunctionBehavior_VariableAccessType::OVER))
317  {
318  if(defs.find(local_def) != defs.end())
319  {
320  for(const auto this_def : defs.find(local_def)->second)
321  {
322  const bool forward_dependence = function_behavior->CheckReachability(this_def, *vi);
323  if(forward_dependence)
324  {
325  function_behavior->ogc->AddEdge(this_def, *vi, ODG_AGG_SELECTOR);
326  function_behavior->ogc->add_edge_info(this_def, *vi, ODG_SELECTOR, local_def);
327  if(function_behavior->CheckFeedbackReachability(*vi, this_def))
328  {
329  function_behavior->ogc->AddEdge(*vi, this_def, FB_ODG_AGG_SELECTOR);
331  function_behavior->ogc->add_edge_info(*vi, this_def, ODG_SELECTOR, local_def);
332  }
333  }
334  }
335  }
336  }
338  "<--Computed output dependencies of vertex " + GET_NAME(cfg, *vi));
339  }
340  INDENT_DBG_MEX(DEBUG_LEVEL_VERY_PEDANTIC, debug_level, "<--Computed dependencies");
341  if(parameters->getOption<bool>(OPT_print_dot))
342  {
343  std::string file_name;
344  file_name = "OP_DFG.dot";
345  function_behavior->CGetOpGraph(FunctionBehavior::DFG)->WriteDot(file_name, 1);
346  file_name = "OP_FDFG.dot";
347  function_behavior->CGetOpGraph(FunctionBehavior::FDFG)->WriteDot(file_name, 1);
348  file_name = "OP_ADG.dot";
349  function_behavior->CGetOpGraph(FunctionBehavior::ADG)->WriteDot(file_name, 1);
350  file_name = "OP_FADG.dot";
351  function_behavior->CGetOpGraph(FunctionBehavior::FADG)->WriteDot(file_name, 1);
352  file_name = "OP_ODG.dot";
353  function_behavior->CGetOpGraph(FunctionBehavior::ODG)->WriteDot(file_name, 1);
354  file_name = "OP_FODG.dot";
355  function_behavior->CGetOpGraph(FunctionBehavior::FODG)->WriteDot(file_name, 1);
356  file_name = "OP_SAODG1.dot";
357  function_behavior->CGetOpGraph(FunctionBehavior::SAODG)->WriteDot(file_name, 1);
358  }
359 #ifndef NDEBUG
360  try
361  {
362  const OpGraphConstRef dfg = function_behavior->CGetOpGraph(FunctionBehavior::DFG);
363  std::deque<vertex> vertices;
364  boost::topological_sort(*dfg, std::front_inserter(vertices));
365  }
366  catch(const char* msg)
367  {
368  THROW_UNREACHABLE("dfg graph of function " + function_name + " is not acyclic");
369  }
370  catch(const std::string& msg)
371  {
372  THROW_UNREACHABLE("dfg graph of function " + function_name + " is not acyclic");
373  }
374  catch(const std::exception& ex)
375  {
376  THROW_UNREACHABLE("dfg graph of function " + function_name + " is not acyclic");
377  }
378  catch(...)
379  {
380  THROW_UNREACHABLE("dfg graph of function " + function_name + " is not acyclic");
381  }
382 #endif
384 }
385 
386 template <>
389  const FunctionBehavior_VariableAccessType variable_access_type) const
390 {
392  if(frontend_flow_step_type == VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS)
393  {
395  }
396  else if(frontend_flow_step_type == SCALAR_SSA_DATA_FLOW_ANALYSIS)
397  {
399  }
400  else
401  {
402  THROW_UNREACHABLE("Unexpected data flow analysis type");
403  }
404  return function_behavior->CGetOpGraph(FunctionBehavior::CFG)
405  ->CGetOpNodeInfo(statement)
406  ->GetVariables(variable_type, variable_access_type);
407 }
Anti + Data flow graph dependence between aggregates.
#define DEBUG_LEVEL_VERY_PEDANTIC
extremely verbose debugging print is performed.
#define INDENT_DBG_MEX(dbgLevel, curDbgLevel, mex)
We are producing a debug version of the program, so the message is printed;.
boost::graph_traits< graph >::out_edge_iterator OutEdgeIterator
out_edge_iterator definition.
Definition: graph.hpp:1312
Basic block control flow graph.
File containing functions and utilities to support the printing of debug messagges.
DataDependenceComputation(const application_managerRef _AppM, unsigned int function_id, const FrontendFlowStepType frontend_flow_step_type, const DesignFlowManagerConstRef design_flow_manager, const ParameterConstRef parameters)
Constructor.
#define FB_DFG_SCA_SELECTOR
Data flow graph edge selector between computed on scalars.
Definition: op_graph.hpp:453
string target
Definition: lenet_tvm.py:16
std::string get_function_name() const
Return the name of the function.
Definition of the class representing a generic C application.
Base class for different data dependence computation.
Anti-dependence graph with feedback.
#define FB_ADG_SCA_SELECTOR
Feedback Anti-dependence graph edge selector computed on scalar.
Definition: op_graph.hpp:468
#define GET_NAME(data, vertex_index)
Helper macro returning the name associated with a node.
FunctionBehavior_VariableType
The possible type of a variable.
const FrontendFlowStepType frontend_flow_step_type
The type of this step.
redefinition of map to manage ordered/unordered structures
#define STR(s)
Macro which performs a lexical_cast to a string.
Auxiliary methods for manipulating string.
int key[32]
Definition: aes.h:67
#define THROW_UNREACHABLE(str_expr)
helper function used to specify that some points should never be reached
Definition: exceptions.hpp:292
#define FB_DFG_AGG_SELECTOR
Data flow graph edge selector between computed on aggregates.
Definition: op_graph.hpp:455
DesignFlowStep_Status Computedependencies(const int dfg_selector, const int fb_dfg_selector, const int adg_selector, const int fb_adg_selector)
Compute the dependencies.
DesignFlowStep_Status InternalExec() final
Cleans the fake data dependencies.
Output dependence graph.
#define FB_ODG_AGG_SELECTOR
Feedback Output-dependence graph edge selector computed on aggregates.
Definition: op_graph.hpp:485
absl::flat_hash_map< T, U, Hash, Eq, Alloc > CustomUnorderedMap
Definition: custom_map.hpp:148
Control flow graph.
#define ODG_SELECTOR
Output-dependence graph edge selector.
Definition: op_graph.hpp:481
redefinition of set to manage ordered/unordered structures
boost::graph_traits< graph >::vertex_descriptor vertex
vertex definition.
Definition: graph.hpp:1303
FunctionBehavior_VariableAccessType
The access type to a variable.
boost::graph_traits< graph >::vertex_iterator VertexIterator
vertex_iterator definition.
Definition: graph.hpp:1307
Classes specification of the tree_node data structures.
const ParameterConstRef parameters
Set of input parameters.
DesignFlowStep_Status
The status of a step.
~DataDependenceComputation() override
Destructor.
#define DFG_SELECTOR
Data flow graph edge selector.
Definition: op_graph.hpp:451
#define ADG_SELECTOR
Anti-dependence graph edge selector.
Definition: op_graph.hpp:466
enum FrontendFlowStepType { CREATE_TREE_MANAGER, FIND_MAX_TRANSFORMATIONS, FUNCTION_ANALYSIS, SYMBOLIC_APPLICATION_FRONTEND_FLOW_STEP, ADD_BB_ECFG_EDGES, ADD_ARTIFICIAL_CALL_FLOW_EDGES, ADD_OP_EXIT_FLOW_EDGES, ADD_OP_LOOP_FLOW_EDGES, ADD_OP_PHI_FLOW_EDGES, BAMBU_FRONTEND_FLOW, BASIC_BLOCKS_CFG_COMPUTATION, BB_CONTROL_DEPENDENCE_COMPUTATION, BB_FEEDBACK_EDGES_IDENTIFICATION, BB_ORDER_COMPUTATION, BB_REACHABILITY_COMPUTATION, BIT_VALUE, BIT_VALUE_OPT, BITVALUE_RANGE, BIT_VALUE_IPA, BLOCK_FIX, BUILD_VIRTUAL_PHI, CALL_EXPR_FIX, CALL_GRAPH_BUILTIN_CALL, CHECK_SYSTEM_TYPE, COMPLETE_BB_GRAPH, COMPLETE_CALL_GRAPH, COMPUTE_IMPLICIT_CALLS, COMMUTATIVE_EXPR_RESTRUCTURING, COND_EXPR_RESTRUCTURING, CSE_STEP, DATAFLOW_CG_EXT, DEAD_CODE_ELIMINATION, DEAD_CODE_ELIMINATION_IPA, DETERMINE_MEMORY_ACCESSES, DOM_POST_DOM_COMPUTATION, EXTRACT_GIMPLE_COND_OP, EXTRACT_PATTERNS, FIX_STRUCTS_PASSED_BY_VALUE, FUNCTION_CALL_TYPE_CLEANUP, FUNCTION_CALL_OPT, FANOUT_OPT, FIX_VDEF, HDL_FUNCTION_DECL_FIX, HDL_VAR_DECL_FIX, HLS_DIV_CG_EXT, HWCALL_INJECTION, INTERFACE_INFER, IR_LOWERING, LOOP_COMPUTATION, LOOPS_ANALYSIS_BAMBU, LOOPS_COMPUTATION, LUT_TRANSFORMATION, MULTI_WAY_IF, MULTIPLE_ENTRY_IF_REDUCTION, NI_SSA_LIVENESS, OP_CONTROL_DEPENDENCE_COMPUTATION, OP_FEEDBACK_EDGES_IDENTIFICATION, OP_ORDER_COMPUTATION, OP_REACHABILITY_COMPUTATION, OPERATIONS_CFG_COMPUTATION, PARM2SSA, PARM_DECL_TAKEN_ADDRESS, PHI_OPT, PREDICATE_STATEMENTS, ESSA, RANGE_ANALYSIS, REBUILD_INITIALIZATION, REBUILD_INITIALIZATION2, REMOVE_CLOBBER_GA, REMOVE_ENDING_IF, SCALAR_SSA_DATA_FLOW_ANALYSIS, SERIALIZE_MUTUAL_EXCLUSIONS, SPLIT_RETURN, SHORT_CIRCUIT_TAF, SIMPLE_CODE_MOTION, SOFT_FLOAT_CG_EXT, STRING_CST_FIX, SWITCH_FIX, UN_COMPARISON_LOWERING, UNROLLING_DEGREE, USE_COUNTING, VAR_ANALYSIS, VAR_DECL_FIX, VECTORIZE, VERIFICATION_OPERATION, VIRTUAL_AGGREGATE_DATA_FLOW_ANALYSIS, VIRTUAL_PHI_NODES_SPLIT } FrontendFlowStepType
Output dependence graph with feedback.
static void ordered_dfs(unsigned u, const OpGraphConstRef avg, CustomUnorderedMap< vertex, unsigned > &pos, std::vector< vertex > &rev_pos, std::vector< bool > &vis, CustomUnorderedSet< std::pair< unsigned, unsigned >> &keep)
#define DFG_SCA_SELECTOR
Selectors used only in operation graphs; numbers continue from cdfg_edge_info.hpp.
Definition: op_graph.hpp:447
const application_managerRef AppM
The application manager.
Data flow graph with feedback.
Class specification of the basic_block structure.
#define FB_ADG_AGG_SELECTOR
Feedback Anti-dependence graph edge selector computed on aggregates.
Definition: op_graph.hpp:470
const BBNodeInfoConstRef CGetBBNodeInfo(const vertex node) const
Return the info associated with a basic block.
Data structures used in operations graph.
Template borrowed from the ANTLR library by Terence Parr (http://www.jGuru.com - Software rights: htt...
Definition: refcount.hpp:94
this class is used to manage the command-line or XML options.
#define ODG_AGG_SELECTOR
Output-dependence graph edge selector computed on aggregates.
Definition: op_graph.hpp:479
#define DFG_AGG_SELECTOR
Data flow graph edge selector between computed on aggregates.
Definition: op_graph.hpp:449
int debug_level
The debug level.
This class provides methods to build an operations graph.
#define ADG_AGG_SELECTOR
Anti-dependence graph edge selector computed on aggregates.
Definition: op_graph.hpp:464
System dependence + anti-dependence graph + output dependence graph.
System dependence + anti-dependence + output dependence graph + flow graph with feedback.
#define ADG_SCA_SELECTOR
Anti-dependence graph edge selector computed on scalar.
Definition: op_graph.hpp:462
Class specification of the manager of the tree structures extracted from the raw file.
Anti-dependence graph.
A brief description of the C++ Header File.
CustomSet< type > GetVariables(const vertex statement, const FunctionBehavior_VariableAccessType variable_access_type) const
Return the variables accessed in a node It is specialized in the different subclasses of this...
const FunctionBehaviorRef function_behavior
The function behavior of the function to be analyzed.
#define THROW_ASSERT(cond, str_expr)
helper function used to check an assert and if needed to throw an error in a standard way ...
Definition: exceptions.hpp:289

Generated on Mon Feb 12 2024 13:02:51 for PandA-2024.02 by doxygen 1.8.13