Program Listing for File BottomUpTraversalLiveness.h

Program Listing for File BottomUpTraversalLiveness.h#

Return to documentation for file (src/midend/programAnalysis/defUseAnalysis/BottomUpTraversalLiveness.h)

/******************************************
 * Category: DFA
 * Liveness Analysis Declaration
 * created by tps in Nov 2008
 *****************************************/

#ifndef __LivenessAnalysisBUP_HXX_LOADED__
#define __LivenessAnalysisBUP_HXX_LOADED__
#include <string>
#include "LivenessAnalysis.h"

class BottomUpTraversalLivenessIN: public AstBottomUpProcessing<std::vector<SgInitializedName*> *> {
  LivenessAnalysis* live;
 public:
  BottomUpTraversalLivenessIN(LivenessAnalysis* liveness)  {live=liveness;  }
  virtual ~BottomUpTraversalLivenessIN(){};

 protected:
  virtual std::vector<SgInitializedName*> *evaluateSynthesizedAttribute(SgNode *node,
                                                      SynthesizedAttributesList synAttributes)  {
    std::vector<SgInitializedName*> current_in = (live->getIn(node));

//    std::cout << ">>> visiting node : " << node->class_name() << "  elements IN[]: " << current_in.size()
//            <<"  merging with nodes: " << synAttributes.size() << std::endl;
    std::vector<SgInitializedName*>* newVec = defaultSynthesizedAttribute();

    std::vector<  std::vector<SgInitializedName*>* >::const_iterator s;
    for (s = synAttributes.begin(); s != synAttributes.end(); ++s)   {
      std::vector<SgInitializedName*>* vec = *s;
      // merge vec and in
     // std::cout << "    >>> Merging *vec and newVec    --- *vec size :" << (*vec).size() << std::endl;
      if ((*vec).size()>0) {
        *newVec = live->merge_no_dups(*vec,*newVec);
      }
      delete *s;
    }
    *newVec = live->merge_no_dups(*newVec,current_in);

    if (isSgStatement(node)) {
      // replace the current in[SgNode] map
      live->setIn(node,*newVec);
      //std::cout << "  --- replacing stmt : newVecElements : " << (*newVec).size() << std::endl;
    }
    return newVec;
  }
  virtual std::vector<SgInitializedName*> *defaultSynthesizedAttribute()  {
    // Create new value
    std::vector<SgInitializedName*>* vec = new std::vector<SgInitializedName*> ;
    return vec;
  }


};

class BottomUpTraversalLivenessOUT: public AstBottomUpProcessing<std::vector<SgInitializedName*> *> {
  LivenessAnalysis* live;
 public:
  BottomUpTraversalLivenessOUT(LivenessAnalysis* liveness)  {live=liveness;  }
  virtual ~BottomUpTraversalLivenessOUT(){};

 protected:
  virtual std::vector<SgInitializedName*> *evaluateSynthesizedAttribute(SgNode *node,
                                                      SynthesizedAttributesList synAttributes)  {
    std::vector<SgInitializedName*> current_out = (live->getOut(node));

//    std::cout << ">>> visiting node : " << node->class_name() << "  elements OUT[]: " << current_out.size()
//            <<"  merging with nodes: " << synAttributes.size() << std::endl;
    std::vector<SgInitializedName*>* newVec = defaultSynthesizedAttribute();

    std::vector<  std::vector<SgInitializedName*>* >::const_iterator s;
    for (s = synAttributes.begin(); s != synAttributes.end(); ++s)   {
      std::vector<SgInitializedName*>* vec = *s;
      // merge vec and out
      //std::cout << "    >>> Merging *vec and newVec    --- *vec size :" << (*vec).size() << std::endl;
      if ((*vec).size()>0) {
        *newVec = live->merge_no_dups(*vec,*newVec);
      }
      delete *s;
    }
    *newVec = live->merge_no_dups(*newVec,current_out);

    if (isSgStatement(node)) {
      // replace the current out[SgNode] map
      live->setOut(node,*newVec);
      //std::cout << "  --- replacing stmt : newVecElements : " << (*newVec).size() << std::endl;
    }
    return newVec;
  }
  virtual std::vector<SgInitializedName*> *defaultSynthesizedAttribute()  {
    // Create new value
    std::vector<SgInitializedName*>* vec = new std::vector<SgInitializedName*> ;
    return vec;
  }


};

#endif