CSFIActivity/ManagerDUActive.cpp

Go to the documentation of this file.
00001 
00016 #include <iostream>
00017 #include "ManagerDUActive.hpp"
00018 
00019 
00020 
00021 namespace OA {
00022   namespace Activity {
00023 
00024 #if defined(DEBUG_ALL) || defined(DEBUG_ManagerDUActive)
00025 static bool debug = true;
00026 #else
00027 static bool debug = false;
00028 #endif
00029 
00030 ManagerDUActive::ManagerDUActive(
00031     OA_ptr<Activity::ActivityIRInterface> _ir,
00032     OA_ptr<OA::DUG::DUGStandard> _dug)
00033     : mIR(_ir), mDUG(_dug)
00034 {    
00035 }
00036 
00039 void
00040 ManagerDUActive::markVaried(bool activeWithVariedOnly)
00041 {
00042     std::list<CallHandle> callStack;
00043     std::set<OA_ptr<DUG::EdgeInterface> > visited;
00044     std::set<std::pair<unsigned,unsigned> > onPath;
00045 
00046 #ifdef DEBUG_DUAA
00047     std::cout << "ManagerDUActive::markVaried: ---" << std::endl;
00048 #endif
00049     // iterate over independent variables
00050     std::list<std::pair<SymHandle, ProcHandle> >& indepSyms = mDUG->getIndepSyms();
00051     std::list<std::pair<SymHandle, ProcHandle> >::iterator indepIter = indepSyms.begin();
00052     for (; indepIter != indepSyms.end(); indepIter++) {
00053         callStack.empty();
00054         std::pair<SymHandle, ProcHandle> indepPair = *indepIter;
00055         SymHandle sym = indepPair.first;
00056         ProcHandle proc = indepPair.second;
00057 #ifdef DEBUG_DUAA
00058         std::cout << "ManagerDUActive::markVaried: Independent(" << mIR->toString(sym) 
00059                   << "), isNode(" << mDUG->isNode(sym, proc) << ")" << std::endl;
00060 #endif
00061     
00062         if (mDUG->isNode(sym, proc)){
00063             OA_ptr<DUG::NodeInterface> node = mDUG->getNode(sym, proc);
00064             std::pair<unsigned, unsigned> pathNode(1, node->getId());
00065             onPath.insert(pathNode);
00066             node->markVaried(callStack, mIR, visited, onPath, node->getProc(), 
00067                              (unsigned)-1, OA_ptr<DUG::EdgeInterface>(),
00068                              activeWithVariedOnly);
00069             onPath.erase(pathNode);
00070         }
00071     }
00072   
00073 }
00074 
00077 void
00078 ManagerDUActive::markUseful()
00079 {
00080     std::list<CallHandle> callStack;
00081     std::set<OA_ptr<DUG::EdgeInterface> > visited;
00082     std::set<std::pair<unsigned,unsigned> > onPath;
00083 
00084 
00085 #ifdef DEBUG_DUAA
00086     std::cout << "ManagerDUActive::markUseful: ---" << std::endl;
00087 #endif
00088     // iterate over dependent variables
00089     std::list<std::pair<SymHandle, ProcHandle> >& depSyms = mDUG->getDepSyms();
00090     std::list<std::pair<SymHandle, ProcHandle> >::iterator depIter = depSyms.begin();
00091     for (; depIter != depSyms.end(); depIter++) {
00092         callStack.empty();
00093         std::pair<SymHandle, ProcHandle> depPair = *depIter;
00094         SymHandle sym = depPair.first;
00095         ProcHandle proc = depPair.second;
00096 #ifdef DEBUG_DUAA
00097         std::cout << "ManagerDUActive::markUseful: Dependent(" << mIR->toString(sym) 
00098                   << "), isNode(" << mDUG->isNode(sym, proc) << ")" << std::endl;
00099 #endif
00100 
00101         if (mDUG->isNode(sym, proc)){
00102             OA_ptr<DUG::NodeInterface> node = mDUG->getNode(sym, proc);
00103             std::pair<unsigned, unsigned> pathNode(1, node->getId());
00104             onPath.insert(pathNode);
00105 
00106 
00107       
00108             node->markUseful(callStack, mIR, visited, onPath, node->getProc(), 
00109                              (unsigned)-1, OA_ptr<DUG::EdgeInterface>());
00110             onPath.erase(pathNode);
00111         }
00112     }
00113 }
00114 
00117 OA_ptr<InterActiveFortran> 
00118 ManagerDUActive::performAnalysis(OA_ptr<DataFlow::ParamBindings> paramBind,
00119                                  bool activeWithVariedOnly)
00120 {
00121 #ifdef DEBUG_DUAA
00122   std::cout << "ManagerDUActive::performAnalysis: with activeWithVariedOnly = " << activeWithVariedOnly << std::endl;
00123 #endif
00124     OA_ptr<InterActiveFortran> retval;
00125     retval = new InterActiveFortran;
00126 
00127     // Def-Use Activity Analysis
00128     markVaried(activeWithVariedOnly);
00129     if (!activeWithVariedOnly)
00130       markUseful();
00131   
00132     //-------------------------------------------------------------
00133     // copy active SymHandles from mDUG to 'retval'
00134     OA_ptr<std::set<SymHandle> > activeSymSet = mDUG->getActiveSymSet();
00135   
00136     std::set<SymHandle>::iterator ssIter = activeSymSet->begin();
00137     for (; ssIter != activeSymSet->end(); ssIter++){
00138         retval->setActive(*ssIter);
00139     }
00140   
00141     // store results that will be needed in callbacks
00142     mParamBind  = paramBind;
00143 
00144     // create an empty InterActive
00145     mInterActiveFortran = new InterActiveFortran();
00146 
00147     mActiveMap = mDUG->getActiveMap();
00148 
00149     // then iterate over each statement to find active use memrefs
00150 
00151     // assign activity results for each procedure into InterActiveFortran
00152     std::map<ProcHandle,OA_ptr<ActiveStandard> >::iterator mapIter;
00153     for (mapIter=mActiveMap.begin(); mapIter!=mActiveMap.end(); mapIter++) {
00154         retval->mapProcToActive(mapIter->first,mapIter->second);
00155     }
00156 
00157     // iterate over all symbols to determine the size
00158     OA_ptr<SymHandleIterator> symIter = retval->getActiveSymIterator();
00159     int bytes = 0;
00160     int numActiveSyms = 0;
00161     for ( ; symIter->isValid(); (*symIter)++ ) {
00162         SymHandle sym = symIter->current();
00163 
00164         bytes += mIR->getSizeInBytes(sym);
00165         numActiveSyms++;
00166 
00167 #ifdef DEBUG_DUAA
00168         std::cout << "ManagerICFGActive: sym = " << mIR->toString(sym)
00169                   << ", size = " << mIR->getSizeInBytes(sym) << ", bytes = "
00170                   << bytes << std::endl;
00171 #endif
00172     }
00173     retval->setActiveSizeInBytes(bytes);
00174 
00175 #ifdef DEBUG_DUAA
00176     std::cout << "CSFI - numActiveSyms is " << numActiveSyms << std::endl;
00177     std::cout << "CSFI - total active variable size is " << bytes << " bytes" << std::endl;
00178 #endif
00179 
00180     return retval;
00181 }
00182 
00183   } // end of namespace Activity
00184 } // end of namespace OA