OpenADFortTk (including Open64 and OpenAnalysis references)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
auto_ManagerAvailableExpressionsStandard.cpp
Go to the documentation of this file.
1 
2 // ManagerAvailableExpressionsStandard.cpp
3 
5 
6 using namespace std;
7 using namespace OA::DataFlow;
8 using namespace OA::CFG;
9 using namespace OA::Alias;
10 using namespace OA::SideEffect;
11 
12 namespace OA {
13  namespace AvailableExpressions {
14 
15 static bool debug = false;
16 
17 
18 ManagerAvailableExpressionsStandard::ManagerAvailableExpressionsStandard(
20  :
21  mIR(_ir)
22 {
23  OA_DEBUG_CTRL_MACRO("DEBUG_ManagerAvailableExpressionsStandard:ALL", debug);
24  mSolver = new CFGDFSolver(CFGDFSolver::Forward, *this);
25 }
26 
27 
29 {
31  retval = new AvailableExpressionsDFSet();
32  return retval;
33 }
34 
35 
37 {
39  retval = new AvailableExpressionsDFSet();
40  return retval;
41 }
42 
43 
46 {
48  retval = new AvailableExpressionsDFSet();
49  return retval;
50 }
51 
52 
55 {
57  retval = new AvailableExpressionsDFSet();
58  return retval;
59 }
60 
61 
63  ProcHandle proc,
67 {
68  if (debug) {
69  cout << "In AvailableExpressions::ManagerAvailableExpressionsStandard::performAnalysis"
70  << endl;
71  }
72 
73  // create the object we'll store results in
75 
76  // store Alias information for use within the transfer function
77  mAlias = alias;
78 
79  {
80 
81  // maycode for defs[s]
82  OA_ptr<IRStmtIterator> stmtIter;
83  stmtIter = mIR->getStmtIterator(proc);
84  for(; stmtIter->isValid(); ++(*stmtIter)) {
85  StmtHandle stmt = stmtIter->current();
86 
88  defsIter = mIR->getDefMemRefs(stmt);
89  for (; defsIter->isValid(); (*defsIter)++) {
90  MemRefHandle ref = defsIter->current();
91 
92  OA_ptr<LocIterator> locIter;
93  locIter = alias->getMayLocs(ref);
94  for (; locIter->isValid(); ++(*locIter)) {
95  mStmt2MayDefMap[stmt].insert(locIter->current());
96  }
97  }
98  }
99  } {
100 
101  // mustcode for defs[s]
102  OA_ptr<IRStmtIterator> stmtIter;
103  stmtIter = mIR->getStmtIterator(proc);
104  for(; stmtIter->isValid(); ++(*stmtIter)) {
105  StmtHandle stmt = stmtIter->current();
106 
108  defsIter = mIR->getDefMemRefs(stmt);
109  for (; defsIter->isValid(); (*defsIter)++) {
110  MemRefHandle ref = defsIter->current();
111  OA_ptr<LocIterator> locIter;
112  locIter = alias->getMayLocs(ref);
113  for (; locIter->isValid(); ++(*locIter)) {
114  mStmt2MustDefMap[stmt].insert(locIter->current());
115  }
116  }
117  }
118  }
119  {
120 
121  OA_ptr<IRStmtIterator> stmtIter;
122  OA_ptr<ExprHandleIterator> iterHdlExpr;
123  OA_ptr<NewExprTree> eTree;
124 
125  iterHdlExp = getExprHandleIterator(OA::StmtHandle stmt);
126 
127  // iterate through all statements in the procedure
128  stmtIter = mIR->getStmtIterator(proc);
129  for(; stmtIter->isValid(); ++(*stmtIter)) {
130  StmtHandle stmt = stmtIter->current();
131 
132  // iterate through all expressions in the statement
133  iterHdlExpr = mIR->getExprHandleIterator(stmt);
134  for(; iterHdlExpr->isValid(); ++(*iterHdlExpr)) {
135  ExprHandle hExp = iterHdlExpr->current();
136 
137  eTree = mIR->getNewExprTree(hExp);
138  mStmt2MayExprMap[hExp].insert(eTree);
139  }
140  }
141  } {
142 
143  OA_ptr<IRStmtIterator> stmtIter;
144  OA_ptr<ExprHandleIterator> iterHdlExpr;
145  OA_ptr<NewExprTree> eTree;
146 
147  iterHdlExp = getExprHandleIterator(OA::StmtHandle stmt);
148 
149  // iterate through all statements in the procedure
150  stmtIter = mIR->getStmtIterator(proc);
151  for(; stmtIter->isValid(); ++(*stmtIter)) {
152  StmtHandle stmt = stmtIter->current();
153 
154  // iterate through all expressions in the statement
155  iterHdlExpr = mIR->getExprHandleIterator(stmt);
156  for(; iterHdlExpr->isValid(); ++(*iterHdlExpr)) {
157  ExprHandle hExp = iterHdlExpr->current();
158 
159  eTree = mIR->getNewExprTree(hExp);
160  mStmt2MayExprMap[hExp].insert(eTree);
161  }
162  }
163  }
164  {
165 
166  // maycode for uses[s]
167  OA_ptr<IRStmtIterator> stmtIter;
168  stmtIter = mIR->getStmtIterator(proc);
169  for(; stmtIter->isValid(); ++(*stmtIter)) {
170  StmtHandle stmt = stmtIter->current();
171 
172  OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
173  for (; useIterPtr->isValid(); (*useIterPtr)++) {
174  MemRefHandle ref = useIterPtr->current();
175  OA_ptr<LocIterator> locIterPtr = alias->getMayLocs(ref);
176  for (; locIterPtr->isValid(); ++(*locIterPtr)) {
177  mStmt2MayUseMap[stmt].insert(locIterPtr->current());
178  }
179  }
180  }
181  } {
182 
183  // mustcode for uses[s]
184  OA_ptr<IRStmtIterator> stmtIter;
185  stmtIter = mIR->getStmtIterator(proc);
186  for(; stmtIter->isValid(); ++(*stmtIter)) {
187  StmtHandle stmt = stmtIter->current();
188 
189  OA_ptr<MemRefHandleIterator> useIterPtr = mIR->getUseMemRefs(stmt);
190  for (; useIterPtr->isValid(); (*useIterPtr)++) {
191  MemRefHandle ref = useIterPtr->current();
192  OA_ptr<LocIterator> locIterPtr = alias->getMustLocs(ref);
193  for (; locIterPtr->isValid(); ++(*locIterPtr)) {
194  mStmt2MustUseMap[stmt].insert(locIterPtr->current());
195  }
196  }
197  }
198  }
199 
200  // use the dataflow solver to get the In and Out sets for the
201  // basic blocks (BBs).
202  mSolver->solve(cfg, ITERATIVE);
203 
204  // get exit node for CFG and determine what data flow values exit it.
205  // store these data flow values in the result's exit information.
207  node = cfg->getExit();
211  for(AvailableExpressionsDFSet::iterator i = exitSet->begin();
212  i != exitSet->end(); i++)
213  {
214  mAvailableExpressionsMap->insertExit(*i);
215  }
216 
217 
219 }
220 
222  OA_ptr<set<OA_ptr<NewExprTree> > > setRecast;
223  setRecast = inSet.convert<set<OA_ptr<NewExprTree> > >();
224  set<OA_ptr<NewExprTree> >::iterator iter;
225  iter = setRecast->begin();
226  for(; iter != setRecast->end(); iter++) {
227  cout << (*iter)->toString(mIR);
228  }
229  cout << endl;
230 }
231 
232 
235  OA_ptr<DataFlowSet> set1orig,
236  OA_ptr<DataFlowSet> set2orig)
237 {
238  // convert the incoming sets to sets of the specific flow value.
241 
242  if (debug) {
243  cout << "ManagerAvailableExpressionsStandard::meet" << endl;
244  cout << "\tset1 = ";
245  dumpset(set1);
246  cout << "\tset2 = ";
247  dumpset(set2);
248  }
249 
250  // perform the meet operator on the left hand set. It's okay to modify the
251  // set and return it as a result [since the solver passes a temporary set
252  // in as set1. See the CFGDFProblem header for more info.
253  set1->intersectEqu(*set2);
254 
255  if (debug) {
256  cout << endl << "\tcalculated set = ";
257  dumpset(set1);
258  }
259 
260  return set1;
261 }
262 
264 {
266  genSet = new AvailableExpressionsDFSet();
267 
268  // Generate GEN code:
271  genSet = set1;
272 
273  return genSet;
274 }
275 
277  StmtHandle stmt, OA_ptr<DataFlowSet> xdfset)
278 {
280  x = xdfset.convert<AvailableExpressionsDFSet>();
281 
283  killSet = new AvailableExpressionsDFSet();
284 
285  // Generate KILL code:
287  set2 = new DFAGenDFSet<OA_ptr<NewExprTree> >();
288  AvailableExpressionsDFSet::iterator iter1;
289  OA_ptr<NewExprTree> iter1Val;
290 
291  for(iter1 = x->begin(); iter1 != x->end(); iter1++) {
292  iter1Val = *iter1
294  set3 = new DFAGenDFSet<OA_ptr<Location> >(mStmt2MayUseMap[iter1Val]);
296  set4 = new DFAGenDFSet<OA_ptr<Location> >(mStmt2MayDefMap[stmt]);
298  set5 = set3->intersect(set4);
299  bool cond1;
300  cond1 = !set5->isEmpty();
301  bool cond;
302  cond = cond1;
303  if(cond) {
304  set2->insert(iter1Val);
305  }
306  }
307  killSet = set2;
308 
309  return killSet;
310 }
311 
312 // Currently the transfer function used by DFAGen is assumed to be:
313 // Y = gen[n] U (X - kill[n]).
316  OA_ptr<DataFlowSet> xdfset,
317  StmtHandle stmt)
318 {
319  OA_ptr<set<".FLOWTYPE" > > xdfgenset;
320  xdfgenset = xdfset.convert<set<OA_ptr<NewExprTree> > >();
321 
323  x = new AvailableExpressionsDFSet(*xdfgenset);
324 
325  // if debug mode is on print information about transfer function
326  if (debug) {
327  cout << "In transfer: " << endl;
328  cout << "\t Stmt = " << mIR->toString(stmt) << endl;
329  cout << "\t X = ";
330  dumpset(x);
331  }
332 
333  OA_ptr<DataFlowSet> genBaseObj = genSet(stmt);
335 
336  OA_ptr<DataFlowSet> killBaseObj = killSet(stmt, x);
338 
339 
340  // Add gen[n] to Y
341  AvailableExpressionsDFSet::iterator genIter = gen->begin();
342  for(; genIter != gen->end(); ++genIter) {
343  OA_ptr<NewExprTree> genVal;
344  genVal = *genIter;
345  mAvailableExpressionsMap->insert(stmt, genVal);
346  }
347  // Add X - kill[n] to Y
348  x->minusEqu(*kill);
349  AvailableExpressionsDFSet::iterator xIter = x->begin();
350  for(; xIter != x->end(); ++xIter) {
351  OA_ptr<NewExprTree> xVal;
352  xVal = *xIter;
353  mAvailableExpressionsMap->insert(stmt, xVal);
354  }
355 
356  // if debug mode is on print information about transfer function
357  if(debug) {
358  cout << "\t gen = ";
359  dumpset(gen);
360  cout << "\t kill = ";
361  dumpset(kill);
362  cout << "\t Y = ";
363  dumpset(mAvailableExpressionsMap->getAvailableExpressionsSet(stmt));
364  }
365 
366  return mAvailableExpressionsMap->getAvailableExpressionsSet(stmt);
367 }
368 
369  } // end of namespace AvailableExpressions
370 } // end of namespace OA