Program Listing for File CompSliceLocality.h

Program Listing for File CompSliceLocality.h#

Return to documentation for file (src/midend/programTransformation/loopProcessing/slicing/CompSliceLocality.h)

#ifndef COMPSLICE_LOCALITYANAL
#define COMPSLICE_LOCALITYANAL
#include <CompSlice.h>
#include <LoopTreeLocality.h>
#include <iostream>
#include <sstream>

class CompSliceLocalityAnal
{
  LoopTreeLocalityAnal &anal;
  unsigned linesize, reuseDist;
 public:
  typedef LoopTreeLocalityAnal::AstNodeSet AstNodeSet;
  CompSliceLocalityAnal( LoopTreeLocalityAnal &a, unsigned ls, unsigned _reuseDist)
        : anal(a), linesize(ls), reuseDist(_reuseDist) {}
  int TemporaryReuses(const CompSlice *slice1, const CompSlice *slice2,
                      AstNodeSet& refSet);
  int SpatialReuses(const CompSlice *slice1, const CompSlice *slice2,
                      AstNodeSet& refSet);
  float SpatialReuses( const CompSlice *slice1);
  unsigned GetCacheLineSize() const { return linesize; }
};

class CompSliceLocalityRegistry : protected CompSliceLocalityAnal
{
  class Impl;
 public:
  class SliceRelInfo
  {
    CompSliceLocalityAnal::AstNodeSet tmpRefSet, spRefSet;
   public:
    SliceRelInfo( CompSliceLocalityAnal& anal,
                  const CompSlice* slice1, const CompSlice* slice2)
     {
        anal.TemporaryReuses(slice1, slice2, tmpRefSet);
        anal.SpatialReuses(slice1, slice2, spRefSet);
     }
    const CompSliceLocalityAnal::AstNodeSet* get_temporaryReuseSet() const
       { return &tmpRefSet; }
    void FuseRelInfo( const SliceRelInfo& rel)
     { tmpRefSet.insert(rel.tmpRefSet.begin(), rel.tmpRefSet.end()); }
    int TemporaryReuses( CompSliceLocalityAnal::AstNodeSet* refset = 0) const
         {
            if (refset != 0)
               *refset = tmpRefSet;
            return tmpRefSet.size();
         }
    int SpatialReuses() const { return spRefSet.size(); }
    std::string toString() const
    {
       std::stringstream out;
       out << " Temporary reuse: " << TemporaryReuses();
       return out.str();
    }
  };

  class SliceSelfInfo
  {
   float spatialReuses;
   CompSliceLocalityAnal::AstNodeSet tmpRefSet;
  public:
   SliceSelfInfo (CompSliceLocalityAnal& anal, const CompSlice *slice)
   {
     spatialReuses = anal.SpatialReuses(slice);
     anal.TemporaryReuses(slice, slice, tmpRefSet);
   }
   void FuseSelfInfo( const SliceSelfInfo& that, const SliceRelInfo& rel)
   { spatialReuses += that.spatialReuses;
     const CompSliceLocalityAnal::AstNodeSet*
                 tmpSet1 = rel.get_temporaryReuseSet();
     tmpRefSet.insert( that.tmpRefSet.begin(), that.tmpRefSet.end());
     tmpRefSet.insert( tmpSet1->begin(), tmpSet1->end());
   }
   int TemporaryReuses( CompSliceLocalityAnal::AstNodeSet* refset = 0) const
         {
            if (refset != 0)
               *refset = tmpRefSet;
            return tmpRefSet.size();
         }
   float SpatialReuses() { return spatialReuses; }
   std::string toString() const
    {
       std::stringstream out;
       out << "spatial reuse: " << spatialReuses << "; Temporary reuse: " <<
              TemporaryReuses();
       return out.str();
    }
  };

 private:
  Impl* impl;
  void operator = (const CompSliceLocalityRegistry& that) {}
 public:
  typedef LoopTreeLocalityAnal::AstNodeSet AstNodeSet;
  CompSliceLocalityRegistry( LoopTreeLocalityAnal &a, unsigned ls, unsigned reuseDist) ;
  ~CompSliceLocalityRegistry();
  int TemporaryReuses(const CompSlice *slice1, const CompSlice *slice2,
                      CompSliceLocalityAnal::AstNodeSet* refset = 0) ;
  int SpatialReuses(const CompSlice *slice1, const CompSlice *slice2);
  int TemporaryReuses(const CompSlice* slice);
  float SpatialReuses( const CompSlice *slice);
};

#endif