Program Listing for File DepInfo.h

Program Listing for File DepInfo.h#

Return to documentation for file (src/midend/programTransformation/loopProcessing/depInfo/DepInfo.h)

#ifndef DEP_INFO_H
#define DEP_INFO_H

#include <CountRefHandle.h>
#include <IteratorTmpl.h>
#include <AstInterface.h>

#include <DepRel.h>
#include <Matrix.h>
#include <iostream>


typedef enum { DEPTYPE_NONE = 0, DEPTYPE_TRUE = 1, DEPTYPE_ANTI = 2,
               DEPTYPE_OUTPUT = 4, DEPTYPE_SCALAR = 8, DEPTYPE_BACKSCALAR = 16,
               DEPTYPE_INPUT = 32, DEPTYPE_ARRAY = 39,
               DEPTYPE_IO = 64, DEPTYPE_DATA = 95, DEPTYPE_CTRL = 128, DEPTYPE_BACKCTRL = 256,
               DEPTYPE_ALL = 479, DEPTYPE_TRANS = 512} DepType;
std::string DepType2String( DepType t);
typedef enum {DEP_SRC = 1, DEP_SINK = 2, DEP_SRC_SINK = 3} DepDirection;

typedef Matrix<DepRel> DepEDD;

class DepInfoImpl
{
   DepEDD edd;
   bool precise;
   int commonlevel;
 protected:
   virtual ~DepInfoImpl() {}
   DepInfoImpl( int dim1, int dim2, bool p, int cl)  // p: precise or not
        : edd( dim1, dim2, (dim1 == 0 || dim2 == 0)? 0 : 1) ,
          precise(p), commonlevel(cl) {}

   DepInfoImpl(const DepInfoImpl &that) : edd(that.edd), precise(that.precise),
                     commonlevel(that.commonlevel) {}
 public:
   int rows() const { return edd.rows(); }
   int cols() const { return edd.cols(); }
   DepRel& Entry(int index1, int index2) const
       { return edd.Entry(index1,index2); }
   DepEDD& GetEDD() { return edd; }
   const DepEDD& GetEDD() const { return edd; }

   int CommonLevel() const {  return commonlevel; }
   int& CommonLevel()  {  return commonlevel; }
   bool is_precise() const { return precise; }
   void set_precise() { precise = true; }

   virtual DepInfoImpl* Clone() const
     { return new DepInfoImpl(*this); }
   virtual DepType GetDepType() const { return DEPTYPE_NONE; }
   virtual AstNodePtr SrcRef() const { return AST_NULL; }
   virtual AstNodePtr SnkRef() const { return AST_NULL; }

   void Reset(int srcdim, int snkdim) { edd.Reset(srcdim, snkdim); }
   void Initialize(  const DepRel &init) { edd.Initialize(init); }
 friend class CountRefHandle<DepInfoImpl>;
 friend class DepInfoGenerator;
};

inline DepInfoImpl* Clone(const DepInfoImpl& that) { return that.Clone(); }

class DepInfo : protected CountRefHandle <DepInfoImpl>
{
  DepInfo( DepInfoImpl *impl) : CountRefHandle<DepInfoImpl>(impl) {}
 public:
  typedef DepRel Elem;

  DepInfo() {}
  DepInfo(int) {}
  DepInfo( const DepInfo &that) : CountRefHandle<DepInfoImpl>(that) {}
  DepInfo & operator = (const DepInfo &that)
    { CountRefHandle <DepInfoImpl>::operator =(that); return *this; }
  const DepInfo* operator->() const { return this; }
  DepInfo* operator->() { return this; }


  int rows() const { return (ConstPtr() == 0)? 0 : ConstRef().rows(); }
  int cols() const { return (ConstPtr() == 0)? 0 : ConstRef().cols(); }
  DepType GetDepType() const
    { return (ConstPtr()==0)? DEPTYPE_NONE: ConstRef().GetDepType(); }
  AstNodePtr SrcRef() const { return (ConstPtr()==0)?AST_NULL:ConstRef().SrcRef(); }
  AstNodePtr SnkRef() const { return (ConstPtr()==0)?AST_NULL:ConstRef().SnkRef(); }
  int CommonLevel() const { return  (ConstPtr()==0)?-1:ConstRef().CommonLevel(); }

  int& CommonLevel() { return  UpdateRef().CommonLevel(); }

  const DepRel& Entry(int index1, int index2) const
    { return ConstRef().Entry(index1,index2); }
  DepRel& Entry(int index1, int index2)
    { return UpdateRef().Entry(index1, index2); }
  DepEDD& GetEDD() { return UpdateRef().GetEDD(); }
  const DepEDD& GetEDD() const { return ConstRef().GetEDD(); }
  void Initialize( const DepRel &init) { UpdateRef().Initialize(init); }

  void Dump() const { std::cerr << toString() << std::endl; }
  std::string toString() const;
  void CarryLevels( int &minLevel, int &maxLevel) const;
  int CarryLevel() const;
  bool IsTop( ) const;
  bool IsBottom( int level = 0 ) const;
  bool IsID() const;
  bool is_precise() const { return (ConstPtr() == 0)? true : ConstRef().is_precise(); }
  void set_precise() { UpdateRef().set_precise(); }

  bool operator &= ( const DepInfo &d2);
  bool operator |= ( const DepInfo &d2);
  bool operator *= (const DepInfo& d2);
  bool ClosureEntries();

  bool operator <= ( const DepInfo &d2) const ;
  bool operator < ( const DepInfo &d2) const ;
  bool operator == (const DepInfo &d) const;
  bool operator != (const DepInfo &d) const { return ! operator ==(d); }
  void InsertLoop( int level, DepDirection dir);
  void RemoveLoop( int level, DepDirection dir);
  void DistLoop( int level);
  void MergeLoop( int index1, int index2, DepDirection dir);
  void SwapLoop( int index1, int index2, DepDirection dir);
  void AlignLoop( int index1, int index2, DepDirection dir);

  void TransformDep( DepInfo &dep, DepDirection dir) const;
 friend class DepInfoGenerator;
};

inline bool IsNIL(const DepInfo &info) { return info.IsTop(); }
bool IsValidDep( const DepInfo &info, int commLevel);
typedef IteratorImpl<DepInfo> DepInfoConstIteratorImpl;
typedef IteratorImpl<DepInfo&> DepInfoUpdateIteratorImpl;
typedef IteratorWrap<DepInfo,DepInfoConstIteratorImpl> DepInfoConstIterator;
typedef IteratorWrap<DepInfo&, DepInfoUpdateIteratorImpl> DepInfoUpdateIterator;

DepInfo operator * (const DepInfo& d1, const DepInfo& d2);
DepInfo operator & ( const DepInfo &d1, const DepInfo &d2) ;
DepInfo operator | ( const DepInfo &d1, const DepInfo &d2);
DepInfo Reverse( const DepInfo &d);
DepInfo Closure( const DepInfo &d);

class DepInfoGenerator
{
 public:
  static DepInfo GetTopDepInfo();
  static DepInfo GetBottomDepInfo( int nr, int nc, int commLevel = 0);
  static DepInfo GetIDDepInfo( int nr, bool precise );
  static DepInfo GetDepInfo(int nr, int nc, bool precise, int commLevel);
  static DepInfo GetDepInfo(int nr, int nc, DepType t, bool precise, int commLevel);
  static DepInfo GetDepInfo(int nr, int nc, DepType t,
                            const AstNodePtr& srcRef, const AstNodePtr& snkRef,
                            bool precise, int commLevel);
};

#endif