CSFSActivity/ManagerDUActive.cpp

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