Program Listing for File LoopAnalysis.h

Program Listing for File LoopAnalysis.h#

Return to documentation for file (src/midend/programTransformation/loopProcessing/depGraph/LoopAnalysis.h)

#ifndef TRANSFORM_ANALYSIS
#define TRANSFORM_ANALYSIS

#include <TransDepGraph.h>

template <class Node>
struct LoopAnalInfo
{
 Node *n;
 int index;
 LoopAnalInfo( Node* _n, int _level) { n = _n; index = _level; }
};


struct LoopAlignInfo {
     int mina, maxa;
     LoopAlignInfo() { mina = 1; maxa = -1; }
     LoopAlignInfo(int _mina, int _maxa) : mina(_mina), maxa(_maxa) {}
     operator bool() { return mina <= maxa; }
     void operator &= ( const LoopAlignInfo &that)
       { if (mina < that.mina) mina = that.mina;
         if (maxa > that.maxa) maxa = that.maxa; }
     void Set(int m1, int m2) { mina  = m1; maxa = m2; }
  };

inline LoopAlignInfo operator +(const LoopAlignInfo& info1, const LoopAlignInfo& info2)
     { return LoopAlignInfo(info1.mina + info2.mina, info1.maxa + info2.maxa); }
inline LoopAlignInfo operator -(const LoopAlignInfo& info1, const LoopAlignInfo& info2)
     { return LoopAlignInfo(info1.mina - info2.maxa, info1.maxa - info2.mina); }

template <class Node>
class TransLoopFusible
{public:
  LoopAlignInfo operator()( TransDepGraphCreate<Node> *graph,
                             const LoopAnalInfo<Node> &l1,
                             const LoopAnalInfo<Node> &l2);
};

template <class Node>
class TransLoopSlicable
{ public: bool operator() ( TransDepGraphCreate<Node> *graph,
                             const LoopAnalInfo<Node> &l);
};

template <class Edge, class GraphCreate>
class PerfectLoopSlicable
{ public: bool operator() (GraphCreate *g, int level); };

template <class Node> class TransLoopDistributable
{ public: bool operator() ( TransDepGraphCreate<Node> *graph,
                       const LoopAnalInfo<Node> &l1,
                      const LoopAnalInfo<Node> &l2);
};

template <class Node>
class TransLoopReversible
{ public: bool operator()( TransDepGraphCreate<Node> *graph,
                             const LoopAnalInfo<Node> &l);
};

template <class Edge, class GraphCreate>
class PerfectLoopReversible
{ public: bool operator()( GraphCreate *g, int  level);
};

#endif