summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTuowen Zhao <ztuowen@gmail.com>2016-09-17 18:58:56 -0600
committerTuowen Zhao <ztuowen@gmail.com>2016-09-17 18:58:56 -0600
commitbdaf6dc251d98fc1c93165fa8579378204b395e1 (patch)
treeef961130983342c2615a0a84c8f754a017449312
parent8ef3af85585446d897ae292476f433fb6db20c0c (diff)
downloadchill-bdaf6dc251d98fc1c93165fa8579378204b395e1.tar.gz
chill-bdaf6dc251d98fc1c93165fa8579378204b395e1.tar.bz2
chill-bdaf6dc251d98fc1c93165fa8579378204b395e1.zip
chill doc
-rw-r--r--chill/include/chill_error.hh6
-rw-r--r--chill/include/chilldebug.h6
-rw-r--r--chill/include/chillmodule.hh15
-rw-r--r--chill/include/dep.hh12
-rw-r--r--chill/include/graph.hh7
-rw-r--r--chill/include/ir_code.hh72
-rw-r--r--chill/include/ir_rose.hh27
-rw-r--r--chill/include/ir_rose_utils.hh6
-rw-r--r--chill/include/irtools.hh13
-rw-r--r--chill/include/loop.hh65
-rw-r--r--chill/include/omegatools.hh103
-rw-r--r--chill/src/chillmodule.cc4
-rw-r--r--chill/src/ir_rose.cc551
-rw-r--r--chill/src/loop.cc11
-rw-r--r--chill/src/omegatools.cc1127
-rw-r--r--omegalib/code_gen/src/CG_roseRepr.cc51
16 files changed, 163 insertions, 1913 deletions
diff --git a/chill/include/chill_error.hh b/chill/include/chill_error.hh
index dc7432f..ca0936e 100644
--- a/chill/include/chill_error.hh
+++ b/chill/include/chill_error.hh
@@ -1,17 +1,17 @@
#ifndef CHILL_ERROR_HH
#define CHILL_ERROR_HH
-// for loop transformation problem
+//! for loop transformation problem
struct loop_error: public std::runtime_error {
loop_error(const std::string &msg): std::runtime_error(msg){}
};
-// for generic compiler intermediate code handling problem
+//! for generic compiler intermediate code handling problem
struct ir_error: public std::runtime_error {
ir_error(const std::string &msg): std::runtime_error(msg){}
};
-// specific for expression to preburger math translation problem
+//! for specific for expression to preburger math translation problem
struct ir_exp_error: public ir_error {
ir_exp_error(const std::string &msg): ir_error(msg){}
};
diff --git a/chill/include/chilldebug.h b/chill/include/chilldebug.h
index 4abbb82..865f1f6 100644
--- a/chill/include/chilldebug.h
+++ b/chill/include/chilldebug.h
@@ -3,9 +3,13 @@
// enable the next line to get lots of output
//#define DEBUGCHILL
+#ifndef DEBUGCHILL_H
+#define DEBUGCHILL_H
#ifdef DEBUGCHILL
#define DEBUG_PRINT(args...) fprintf(stderr, args )
#else
-#define DEBUG_PRINT(args...) /* Don't do anything */
+#define DEBUG_PRINT(args...) do {} while(0) /* Don't do anything */
+#endif
+
#endif
diff --git a/chill/include/chillmodule.hh b/chill/include/chillmodule.hh
index 2cb6587..a99db0c 100644
--- a/chill/include/chillmodule.hh
+++ b/chill/include/chillmodule.hh
@@ -1,19 +1,12 @@
-#ifndef BASIC_CHILLMODULE_HH
-#define BASIC_CHILLMODULE_HH
-// TODO Python.h defines these and something else does too
-#undef _POSIX_C_SOURCE
-#undef _XOPEN_SOURCE
+#ifndef CHILLMODULE_HH
+#define CHILLMODULE_HH
#include <Python.h>
-// a C routine that will be called from python
-//static PyObject * chill_print_code(PyObject *self, PyObject *args);
-
-//static PyMethodDef ChillMethods[] ;
-
void finalize_loop(int loop_num_start, int loop_num_end);
int get_loop_num_start();
int get_loop_num_end();
-PyMODINIT_FUNC initchill() ; // pass C methods to python
+//! pass C methods to python
+PyMODINIT_FUNC initchill();
#endif
diff --git a/chill/include/dep.hh b/chill/include/dep.hh
index 1fa1280..f1cc864 100644
--- a/chill/include/dep.hh
+++ b/chill/include/dep.hh
@@ -14,9 +14,9 @@ typedef std::vector<DependenceVector> DependenceList;
struct DependenceVector {
DependenceType type;
IR_Symbol *sym;
-
- bool is_reduction; // used to identify a class of flow dependence
- // that can be broken
+
+ bool is_reduction; //!< used to identify a class of flow dependence
+ //!< that can be broken
std::vector<omega::coef_t> lbounds;
std::vector<omega::coef_t> ubounds;
@@ -29,7 +29,6 @@ struct DependenceVector {
quasi = false;
is_scalar_dependence = false;
}
- // DependenceVector(int size);
DependenceVector(const DependenceVector &that);
~DependenceVector() {delete sym;}
DependenceVector &operator=(const DependenceVector &that);
@@ -40,7 +39,7 @@ struct DependenceVector {
bool has_been_carried_at(int dim) const;
bool has_been_carried_before(int dim) const;
- // the following functions will be cleaned up or removed later
+ // TODO the following functions will be cleaned up or removed later
bool isZero() const;
bool isPositive() const;
bool isNegative() const;
@@ -55,7 +54,6 @@ struct DependenceVector {
std::vector<DependenceVector> normalize() const;
std::vector<DependenceVector> permute(const std::vector<int> &pi) const;
DependenceVector reverse() const;
- // std::vector<DependenceVector> matrix(const std::vector<std::vector<int> > &M) const;
DependenceType getType() const;
friend std::ostream& operator<<(std::ostream &os, const DependenceVector &d);
};
@@ -72,10 +70,8 @@ public:
DependenceGraph() { num_dim_ = 0; }
~DependenceGraph() {}
int num_dim() const { return num_dim_; }
-// DependenceGraph permute(const std::vector<int> &pi) const;
DependenceGraph permute(const std::vector<int> &pi,
const std::set<int> &active = std::set<int>()) const;
- // DependenceGraph matrix(const std::vector<std::vector<int> > &M) const;
DependenceGraph subspace(int dim) const;
bool isPositive() const;
bool hasPositive(int dim) const;
diff --git a/chill/include/graph.hh b/chill/include/graph.hh
index f8471df..b67183b 100644
--- a/chill/include/graph.hh
+++ b/chill/include/graph.hh
@@ -62,7 +62,11 @@ struct Graph {
bool hasEdge(int v1, int v2) const;
std::vector<EdgeType> getEdge(int v1, int v2) const;
+ //! Topological sort
+ /*! This topological sort does handle SCC in graph. */
std::vector<std::set<int> > topoSort() const;
+ //! Topological sort
+ /*! This topological sort does not handle SCC in graph. */
std::vector<std::set<int> > packed_topoSort() const;
void dump() {
@@ -76,7 +80,6 @@ template<typename VertexType, typename EdgeType>
std::ostream& operator<<(std::ostream &os, const Graph<VertexType, EdgeType> &g) {
for (int i = 0; i < g.vertex.size(); i++)
for (typename Graph<VertexType,EdgeType>::EdgeList::const_iterator j = g.vertex[i].second.begin(); j != g.vertex[i].second.end(); j++) {
- // os << i+1 << "->" << j->first+1 << ":";
os << "s" << i << "->" << "s" << j->first << ":";
for (typename std::vector<EdgeType>::const_iterator k = j->second.begin(); k != j->second.end(); k++)
os << " " << *k;
@@ -175,7 +178,6 @@ std::vector<EdgeType> Graph<VertexType,EdgeType>::getEdge(int v1, int v2) const
return vertex[v1].second.find(v2)->second;
}
-// This topological sort does handle SCC in graph.
template<typename VertexType, typename EdgeType>
std::vector<std::set<int> > Graph<VertexType, EdgeType>::topoSort() const {
const int n = vertex.size();
@@ -250,7 +252,6 @@ std::vector<std::set<int> > Graph<VertexType, EdgeType>::topoSort() const {
return result;
}
-// This topological sort does not handle SCC in graph.
template<typename VertexType, typename EdgeType>
std::vector<std::set<int> > Graph<VertexType, EdgeType>::packed_topoSort() const {
const int n = vertex.size();
diff --git a/chill/include/ir_code.hh b/chill/include/ir_code.hh
index 1f853fa..b6ebfcd 100644
--- a/chill/include/ir_code.hh
+++ b/chill/include/ir_code.hh
@@ -46,8 +46,8 @@ enum IR_ARRAY_LAYOUT_TYPE {IR_ARRAY_LAYOUT_ROW_MAJOR,
class IR_Code;
-// Base abstract class for scalar and array symbols. This is a place
-// holder for related declaration in IR code.
+//! Base abstract class for scalar and array symbols.
+/*! This is a place holder for related declaration in IR code.*/
struct IR_Symbol {
const IR_Code *ir_;
@@ -75,8 +75,8 @@ struct IR_ArraySymbol: public IR_Symbol {
};
-// Base abstract class for scalar and array references. This is a
-// place holder for related code in IR code.
+//! Base abstract class for scalar and array references.
+/*! This is a place holder for related code in IR code. */
struct IR_Ref {
const IR_Code *ir_;
@@ -87,7 +87,8 @@ struct IR_Ref {
virtual bool operator==(const IR_Ref &that) const = 0;
virtual bool operator!=(const IR_Ref &that) const {return !(*this == that);}
virtual omega::CG_outputRepr *convert() = 0;
- virtual IR_Ref *clone() const = 0; /* shallow copy */
+ //! shallow copy
+ virtual IR_Ref *clone() const = 0;
};
@@ -155,20 +156,23 @@ struct IR_ArrayRef: public IR_Ref {
struct IR_Block;
-// Base abstract class for code structures. This is a place holder
-// for the actual structure in the IR code. However, in cases that
-// original source code may be transformed during loop initialization
-// such as converting a while loop to a for loop or reconstructing the
-// loop from low level IR code, the helper loop class (NOT
-// IMPLEMENTED) must contain the transformed code that needs to be
-// freed when out of service.
+//! Base abstract class for code structures.
+/*!
+ * This is a place holder for the actual structure in the IR code.
+ * However, in cases that original source code may be transformed during
+ * loop initialization such as converting a while loop to a for loop or
+ * reconstructing the loop from low level IR code, the helper loop class (NOT
+ * IMPLEMENTED) must contain the transformed code that needs to be
+ * freed when out of service.
+ */
struct IR_Control {
const IR_Code *ir_;
virtual ~IR_Control() {/* ir_ is not the responsibility of this object */}
virtual IR_CONTROL_TYPE type() const = 0;
virtual IR_Block *convert() = 0;
- virtual IR_Control *clone() const = 0; /* shallow copy */
+ //! shallow copy
+ virtual IR_Control *clone() const = 0;
};
@@ -208,7 +212,7 @@ struct IR_While: public IR_Control {
};
-// Abstract class for compiler IR.
+//! Abstract class for compiler IR.
class IR_Code {
protected:
omega::CG_outputBuilder *ocg_;
@@ -217,10 +221,14 @@ protected:
public:
IR_Code() {ocg_ = NULL; init_code_ = cleanup_code_ = NULL;}
- virtual ~IR_Code() { delete ocg_; delete init_code_; delete cleanup_code_; } /* the content of init and cleanup code have already been released in derived classes */
+ virtual ~IR_Code() { delete ocg_; delete init_code_; delete cleanup_code_; }
+ /* the content of init and cleanup code have already been released in derived classes */
- // memory_type is for differentiating the location of where the new memory is allocated.
- // this is useful for processors with heterogeneous memory hierarchy.
+ /*!
+ * \param memory_type is for differentiating the location of
+ * where the new memory is allocated. this is useful for
+ * processors with heterogeneous memory hierarchy.
+ */
virtual IR_ScalarSymbol *CreateScalarSymbol(const IR_Symbol *sym, int memory_type) = 0;
virtual IR_ArraySymbol *CreateArraySymbol(const IR_Symbol *sym, std::vector<omega::CG_outputRepr *> &size, int memory_type) = 0;
@@ -228,19 +236,28 @@ public:
virtual IR_ArrayRef *CreateArrayRef(const IR_ArraySymbol *sym, std::vector<omega::CG_outputRepr *> &index) = 0;
virtual int ArrayIndexStartAt() {return 0;}
- // Array references should be returned in their accessing order.
- // e.g. s1: A[i] = A[i-1]
- // s2: B[C[i]] = D[i] + E[i]
- // return A[i-1], A[i], D[i], E[i], C[i], B[C[i]] in this order.
+ /*!
+ * Array references should be returned in their accessing order.
+ *
+ * ~~~
+ * e.g. s1: A[i] = A[i-1]
+ * s2: B[C[i]] = D[i] + E[i]
+ * return A[i-1], A[i], D[i], E[i], C[i], B[C[i]] in this order.
+ * ~~~
+ */
virtual std::vector<IR_ArrayRef *> FindArrayRef(const omega::CG_outputRepr *repr) const = 0;
virtual std::vector<IR_ScalarRef *> FindScalarRef(const omega::CG_outputRepr *repr) const = 0;
- // If there is no sub structure interesting inside the block, return empty,
- // so we know when to stop looking inside.
+ /*!
+ * If there is no sub structure interesting inside the block, return empty,
+ * so we know when to stop looking inside.
+ */
virtual std::vector<IR_Control *> FindOneLevelControlStructure(const IR_Block *block) const = 0;
- // All controls must be in the same block, at the same level and in
- // contiguous lexical order as appeared in parameter vector.
+ /*!
+ * All controls must be in the same block, at the same level and in
+ * contiguous lexical order as appeared in parameter vector.
+ */
virtual IR_Block *MergeNeighboringControlStructures(const std::vector<IR_Control *> &controls) const = 0;
virtual IR_Block *GetCode() const = 0;
@@ -252,12 +269,9 @@ public:
virtual std::vector<omega::CG_outputRepr *> QueryExpOperand(const omega::CG_outputRepr *repr) const = 0;
virtual IR_Ref *Repr2Ref(const omega::CG_outputRepr *repr) const = 0;
- //---------------------------------------------------------------------------
- // CC Omega code builder interface here
- //---------------------------------------------------------------------------
+ //! Codegen Omega code builder interface
omega::CG_outputBuilder *builder() const {return ocg_;}
};
#endif
-
diff --git a/chill/include/ir_rose.hh b/chill/include/ir_rose.hh
index 0c0417a..9e94dea 100644
--- a/chill/include/ir_rose.hh
+++ b/chill/include/ir_rose.hh
@@ -236,28 +236,6 @@ public:
std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
std::set<std::string> &indices, std::vector<std::string> &index);
- // std::set<std::string> &def_vars);
- /*void findDefinitions(SgStatementPtrList &list_1,
- std::set<VirtualCFG::CFGNode> &reaching_defs_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::set<std::string> &def_vars);
- */
- /* void checkDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j);
- void checkSelfDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j);
- void checkWriteDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j);
- */
std::vector<IR_ArrayRef *> FindArrayRef(
const omega::CG_outputRepr *repr) const;
std::vector<IR_ScalarRef *> FindScalarRef(
@@ -276,11 +254,6 @@ public:
std::vector<omega::CG_outputRepr *> QueryExpOperand(
const omega::CG_outputRepr *repr) const;
IR_Ref *Repr2Ref(const omega::CG_outputRepr *) const;
- /* std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> >
- FindScalarDeps(const omega::CG_outputRepr *repr1,
- const omega::CG_outputRepr *repr2, std::vector<std::string> index,
- int i, int j);
- */
void finalizeRose();
friend class IR_roseArraySymbol;
friend class IR_roseArrayRef;
diff --git a/chill/include/ir_rose_utils.hh b/chill/include/ir_rose_utils.hh
index 9e98aee..d6749de 100644
--- a/chill/include/ir_rose_utils.hh
+++ b/chill/include/ir_rose_utils.hh
@@ -2,15 +2,11 @@
#define IR_ROSE_UTILS_HH
#include <vector>
#include <rose.h>
-#include "sageBuilder.h"
-
-
+#include <sageBuilder.h>
std::vector<SgForStatement *> find_deepest_loops(SgNode *tnl);
std::vector<SgForStatement *> find_loops(SgNode *tnl);
-
-
SgNode* loop_body_at_level(SgNode* tnl, int level);
SgNode* loop_body_at_level(SgForStatement* loop, int level);
void swap_node_for_node_list(SgNode* tn, SgNode* new_tnl);
diff --git a/chill/include/irtools.hh b/chill/include/irtools.hh
index 8dc8e28..205efe1 100644
--- a/chill/include/irtools.hh
+++ b/chill/include/irtools.hh
@@ -7,15 +7,18 @@
#include "ir_code.hh"
#include "dep.hh"
-// IR tree is used to initialize a loop. For a loop node, payload is
-// its mapped iteration space dimension. For a simple block node,
-// payload is its mapped statement number. Normal if-else is splitted
-// into two nodes where the one with odd payload represents then-part and
-// the one with even payload represents else-part.
+//! It is used to initialize a loop.
struct ir_tree_node {
IR_Control *content;
ir_tree_node *parent;
std::vector<ir_tree_node *> children;
+/*!
+ * * For a loop node, payload is its mapped iteration space dimension.
+ * * For a simple block node, payload is its mapped statement number.
+ * * Normal if-else is splitted into two nodes
+ * * the one with odd payload represents then-part and
+ * * the one with even payload represents else-part.
+ */
int payload;
~ir_tree_node() {
diff --git a/chill/include/loop.hh b/chill/include/loop.hh
index f227bb5..2c50d6b 100644
--- a/chill/include/loop.hh
+++ b/chill/include/loop.hh
@@ -17,17 +17,21 @@ enum TilingMethodType { StridedTile, CountedTile };
enum LoopLevelType { LoopLevelOriginal, LoopLevelTile, LoopLevelUnknown };
-// Describes properties of each loop level of a statement. "payload"
-// for LoopLevelOriginal means iteration space dimension, for
-// LoopLevelTile means tiled loop level. Special value -1 for
-// LoopLevelTile means purely derived loop. For dependence dimension
-// payloads, the values must be in an increasing order.
-// "parallel_level" will be used by code generation to support
-// multi-level parallelization (default 0 means sequential loop under
-// the current parallelization level).
+//! Describes properties of each loop level of a statement.
struct LoopLevel {
LoopLevelType type;
+/*!
+ * For LoopLevelOriginal means iteration space dimension
+ * For LoopLevelTile means tiled loop level. Special value -1 for
+ * LoopLevelTile means purely derived loop. For dependence dimension
+ * payloads, the values must be in an increasing order.
+ */
int payload;
+/*!
+ * Used by code generation to support
+ * multi-level parallelization (default 0 means sequential loop under
+ * the current parallelization level).
+ */
int parallel_level;
};
@@ -107,14 +111,16 @@ public:
std::vector<std::set <int > > sort_by_same_loops(std::set<int > active, int level);
//
- // legacy unimodular transformations for perfectly nested loops
- // e.g. M*(i,j)^T = (i',j')^T or M*(i,j,1)^T = (i',j')^T
- //
+ //! legacy unimodular transformations for perfectly nested loops
+ /*!
+ * e.g. \f$M*(i,j)^T = (i',j')^T or M*(i,j,1)^T = (i',j')^T\f$
+ */
bool nonsingular(const std::vector<std::vector<int> > &M);
- //
- // high-level loop transformations
- //
+ /*!
+ * \defgroup hltrans High-level loop transformations
+ * @{
+ */
void permute(const std::set<int> &active, const std::vector<int> &pi);
void permute(int stmt_num, int level, const std::vector<int> &pi);
void permute(const std::vector<int> &pi);
@@ -129,8 +135,6 @@ public:
bool datacopy_privatized(int stmt_num, int level, const std::string &array_name, const std::vector<int> &privatized_levels, bool allow_extra_read = false, int fastest_changing_dimension = -1, int padding_stride = 1, int padding_alignment = 1, int memory_type = 0);
bool datacopy_privatized(const std::vector<std::pair<int, std::vector<int> > > &array_ref_nums, int level, const std::vector<int> &privatized_levels, bool allow_extra_read = false, int fastest_changing_dimension = -1, int padding_stride = 1, int padding_alignment = 1, int memory_type = 0);
bool datacopy_privatized(const std::vector<std::pair<int, std::vector<IR_ArrayRef *> > > &stmt_refs, int level, const std::vector<int> &privatized_levels, bool allow_extra_read, int fastest_changing_dimension, int padding_stride, int padding_alignment, int memory_type = 0);
- //std::set<int> scalar_replacement_inner(int stmt_num);
-
Graph<std::set<int>, bool> construct_induced_graph_at_level(std::vector<std::set<int> > s, DependenceGraph dep, int dep_dim);
@@ -142,26 +146,35 @@ public:
void scale(const std::set<int> &stmt_nums, int level, int scale_amount);
void reverse(const std::set<int> &stmt_nums, int level);
void peel(int stmt_num, int level, int peel_amount = 1);
- //
- // more fancy loop transformations
- //
+ /*!
+ * \defgroup hlfancy fancy loop transformations
+ * @{
+ */
void modular_shift(int stmt_num, int level, int shift_amount) {}
void diagonal_map(int stmt_num, const std::pair<int, int> &levels, int offset) {}
void modular_partition(int stmt_num, int level, int stride) {}
+ /*! @} */
- //
- // derived loop transformations
- //
+ /*!
+ * \defgroup hlderived derived loop transformations
+ * @{
+ */
+
void shift_to(int stmt_num, int level, int absolute_position);
std::set<int> unroll_extra(int stmt_num, int level, int unroll_amount, int cleanup_split_level = 0);
bool is_dependence_valid_based_on_lex_order(int i, int j,
const DependenceVector &dv, bool before);
- //
- // other public operations
- //
+ /*! @} */
+
+ /*!
+ * \defgroup hlother other public operations
+ * @{
+ */
void pragma(int stmt_num, int level, const std::string &pragmaText);
void prefetch(int stmt_num, int level, const std::string &arrName, int hint);
- //void prefetch(int stmt_num, int level, const std::string &arrName, const std::string &indexName, int offset, int hint);
+ /*! @} */
+
+ /*! @} */
};
diff --git a/chill/include/omegatools.hh b/chill/include/omegatools.hh
index 206079c..f77a376 100644
--- a/chill/include/omegatools.hh
+++ b/chill/include/omegatools.hh
@@ -8,90 +8,81 @@
std::string tmp_e();
+//! Convert expression tree to omega relation.
+/*!
+ * \param destroy shallow deallocation of "repr", not freeing the actual code inside.
+ */
void exp2formula(IR_Code *ir, omega::Relation &r, omega::F_And *f_root,
std::vector<omega::Free_Var_Decl *> &freevars,
omega::CG_outputRepr *repr, omega::Variable_ID lhs, char side,
IR_CONDITION_TYPE rel, bool destroy);
+
+//! Build dependence relation for two array references.
omega::Relation arrays2relation(IR_Code *ir, std::vector<omega::Free_Var_Decl*> &freevars,
const IR_ArrayRef *ref_src, const omega::Relation &IS_w,
const IR_ArrayRef *ref_dst, const omega::Relation &IS_r);
+//! Convert array dependence relation into set of dependence vectors
+/*!
+ * assuming ref_w is lexicographically before ref_r in the source code.
+ */
std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relation2dependences(
const IR_ArrayRef *ref_src, const IR_ArrayRef *ref_dst, const omega::Relation &r);
+//! Convert a boolean expression to omega relation.
+/*!
+ * \param destroy shallow deallocation of "repr", not freeing the actual code inside.
+ */
void exp2constraint(IR_Code *ir, omega::Relation &r, omega::F_And *f_root,
std::vector<omega::Free_Var_Decl *> &freevars,
omega::CG_outputRepr *repr, bool destroy);
-// suif legacy code
-// void suif2formula(Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// operand op, Variable_ID lhs,
-// char side, char rel);
-// void suif2formula(Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// instruction *ins, Variable_ID lhs,
-// char side, char rel);
-// void add_loop_stride_constraints(omega::Relation &r, omega::F_And *f_root,
-// std::vector<omega::Free_Var_Decl*> &freevars,
-// tree_for *tnf, char side);
-// void add_loop_bound_constraints(IR_Code *ir, omega::Relation &r, omega::F_And *f_root,
-// std::vector<omega::Free_Var_Decl*> &freevars,
-// tree_for *tnf,
-// char upper_or_lower, char side, IR_CONDITION_TYPE rel);
-// Relation loop_iteration_space(std::vector<Free_Var_Decl*> &freevars,
-// tree_node *tn, std::vector<tree_for*> &loops);
-
-// Relation arrays2relation(std::vector<Free_Var_Decl*> &freevars,
-// in_array *ia_w, const Relation &IS1,
-// in_array *ia_r, const Relation &IS2);
-// std::vector<DependenceVector> relation2dependences(IR_Code *ir, in_array *ia_w,
-// in_array *ia_r, const Relation &r);
-
-// end of suif legacy code
-
bool is_single_iteration(const omega::Relation &r, int dim);
+//! Set/get the value of a variable which is know to be constant.
void assign_const(omega::Relation &r, int dim, int val);
+
int get_const(const omega::Relation &r, int dim, omega::Var_Kind type);
+
+//! Find the position index variable in a Relation by name.
omega::Variable_ID find_index(omega::Relation &r, const std::string &s, char side);
+
+//! Generate mapping relation for permuation.
omega::Relation permute_relation(const std::vector<int> &pi);
+
omega::Relation get_loop_bound(const omega::Relation &r, int dim);
+
+//! Determine whether the loop (starting from 0) in the iteration space has only one iteration.
bool is_single_loop_iteration(const omega::Relation &r, int level, const omega::Relation &known);
+//! Get the bound for a specific loop.
omega::Relation get_loop_bound(const omega::Relation &r, int level, const omega::Relation &known);
omega::Relation get_max_loop_bound(const std::vector<omega::Relation> &r, int dim);
omega::Relation get_min_loop_bound(const std::vector<omega::Relation> &r, int dim);
+
+//! Add strident to a loop.
+/*!
+ * Issues:
+ *
+ * * Don't work with relations with multiple disjuncts.
+ * * Omega's dealing with max lower bound is awkward.
+ */
void add_loop_stride(omega::Relation &r, const omega::Relation &bound, int dim, int stride);
bool is_inner_loop_depend_on_level(const omega::Relation &r, int level, const omega::Relation &known);
-// void adjust_loop_bound(omega::Relation &r, int dim, int adjustment, std::vector<omega::Free_Var_Decl *> globals = std::vector<omega::Free_Var_Decl *>());
+/*!
+ * Suppose loop dim is i. Replace i with i+adjustment in loop bounds.
+ *
+ * ~~~
+ * do i = 1, n
+ * do j = i, n
+ * ~~~
+ *
+ * after call with dim = 0 and adjustment = 1:
+ *
+ * ~~~
+ * do i = 1, n
+ * do j = i+1, n
+ * ~~~
+ */
omega::Relation adjust_loop_bound(const omega::Relation &r, int level, int adjustment);
-// void adjust_loop_bound(Relation &r, int dim, int adjustment);
-// void adjust_loop_bound(Relation &r, int dim, Free_Var_Decl *global_var, int adjustment);
-// boolean is_private_statement(const omega::Relation &r, int dim);
-
-// coef_t mod(const Relation &r, Variable_ID v, int dividend);
-
enum LexicalOrderType {LEX_MATCH, LEX_BEFORE, LEX_AFTER, LEX_UNKNOWN};
-// template <typename T>
-// LexicalOrderType lexical_order(const std::vector<T> &a, const std::vector<T> &b) {
-// int size = min(a.size(), b.size());
-// for (int i = 0; i < size; i++) {
-// if (a[i] < b[i])
-// return LEX_BEFORE;
-// else if (b[i] < a[i])
-// return LEX_AFTER;
-// }
-// if (a.size() < b.size())
-// return LEX_BEFORE;
-// else if (b.size() < a.size())
-// return LEX_AFTER;
-// else
-// return LEX_MATCH;
-// }
-
-// struct LoopException {
-// std::string descr;
-// LoopException(const std::string &s): descr(s) {};
-// };
-
#endif
diff --git a/chill/src/chillmodule.cc b/chill/src/chillmodule.cc
index 36f810e..b7012cc 100644
--- a/chill/src/chillmodule.cc
+++ b/chill/src/chillmodule.cc
@@ -17,10 +17,6 @@
#include "chillmodule.hh"
-#undef _POSIX_C_SOURCE
-#undef _XOPEN_SOURCE
-#include <Python.h>
-
using namespace omega;
extern Loop *myloop;
diff --git a/chill/src/ir_rose.cc b/chill/src/ir_rose.cc
index dc11b4c..36e2db9 100644
--- a/chill/src/ir_rose.cc
+++ b/chill/src/ir_rose.cc
@@ -232,12 +232,6 @@ IR_Ref *IR_roseConstantRef::clone() const {
// ----------------------------------------------------------------------------
bool IR_roseScalarRef::is_write() const {
- /* if (ins_pos_ != NULL && op_pos_ == -1)
- return true;
- else
- return false;
- */
-
if (is_write_ == 1)
return true;
@@ -270,11 +264,7 @@ omega::CG_outputRepr *IR_roseScalarRef::convert() {
}
IR_Ref * IR_roseScalarRef::clone() const {
- //if (ins_pos_ == NULL)
return new IR_roseScalarRef(ir_, vs_, this->is_write_);
- //else
- // return new IR_roseScalarRef(ir_, , op_pos_);
-
}
// ----------------------------------------------------------------------------
@@ -684,12 +674,11 @@ omega::CG_outputRepr *IR_roseBlock::original() const {
}
}
tnl = new omega::CG_roseRepr(bb);
- //block = tnl->clone();
-
+
} else {
+
tnl = new omega::CG_roseRepr(tnl_);
-
- //block = tnl->clone();
+
}
return tnl;
@@ -744,19 +733,6 @@ omega::CG_outputRepr *IR_roseIf::condition() const {
SgExpression* exp = NULL;
if (SgExprStatement* stmt = isSgExprStatement(tnl))
exp = stmt->get_expression();
- /*
- SgExpression *op = iter(tnl);
- if (iter.is_empty())
- throw ir_error("unrecognized if structure");
- tree_node *tn = iter.step();
- if (!iter.is_empty())
- throw ir_error("unrecognized if structure");
- if (!tn->is_instr())
- throw ir_error("unrecognized if structure");
- instruction *ins = static_cast<tree_instr *>(tn)->instr();
- if (!ins->opcode() == io_bfalse)
- throw ir_error("unrecognized if structure");
- operand op = ins->src_op(0);*/
if (exp == NULL)
return new omega::CG_roseRepr(tnl);
else
@@ -766,13 +742,8 @@ omega::CG_outputRepr *IR_roseIf::condition() const {
IR_Block *IR_roseIf::then_body() const {
SgNode *tnl = isSgNode(isSgIfStmt(ti_)->get_true_body());
- //tree_node_list *tnl = ti_->then_part();
if (tnl == NULL)
return NULL;
- /*
- tree_node_list_iter iter(tnl);
- if (iter.is_empty())
- return NULL; */
return new IR_roseBlock(ir_, tnl);
}
@@ -780,28 +751,14 @@ IR_Block *IR_roseIf::then_body() const {
IR_Block *IR_roseIf::else_body() const {
SgNode *tnl = isSgNode(isSgIfStmt(ti_)->get_false_body());
- //tree_node_list *tnl = ti_->else_part();
-
if (tnl == NULL)
return NULL;
- /*
- tree_node_list_iter iter(tnl);
- if (iter.is_empty())
- return NULL;*/
return new IR_roseBlock(ir_, tnl);
}
IR_Block *IR_roseIf::convert() {
const IR_Code *ir = ir_;
- /* SgNode *tnl = ti_->get_parent();
- SgNode *start, *end;
- start = end = ti_;
-
- //tree_node_list *tnl = ti_->parent();
- //tree_node_list_e *start, *end;
- //start = end = ti_->list_e();
- */
delete this;
return new IR_roseBlock(ir, ti_);
}
@@ -842,8 +799,6 @@ IR_roseCode::IR_roseCode(const char *filename, const char* proc_name) :
strcpy(argv[1], filename);
project = (IR_roseCode_Global_Init::Instance(argv))->project;
- //main_ssa = new ssa_unfiltered_cfg::SSA_UnfilteredCfg(project);
- //main_ssa->run();
firstScope = getFirstGlobalScope(project);
SgFilePtrList& file_list = project->get_fileList();
@@ -855,12 +810,6 @@ IR_roseCode::IR_roseCode(const char *filename, const char* proc_name) :
else
is_fortran_ = false;
- // Manu:: debug
- // if (is_fortran_)
- // std::cout << "Input is a fortran file\n";
- // else
- // std::cout << "Input is a C file\n";
-
root = file->get_globalScope();
if (!is_fortran_) { // Manu:: this macro should not be created if the input code is in fortran
@@ -894,7 +843,6 @@ IR_roseCode::IR_roseCode(const char *filename, const char* proc_name) :
symtab2_ = func->get_definition()->get_symbol_table();
symtab3_ = func->get_definition()->get_body()->get_symbol_table();
- // ocg_ = new omega::CG_roseBuilder(func->get_definition()->get_body()->get_symbol_table() , isSgNode(func->get_definition()->get_body()));
// Manu:: added is_fortran_ parameter
ocg_ = new omega::CG_roseBuilder(is_fortran_, root, firstScope,
func->get_definition()->get_symbol_table(),
@@ -912,14 +860,8 @@ IR_roseCode::~IR_roseCode() {
}
void IR_roseCode::finalizeRose() {
- // Moved this out of the deconstructor
- // ????
SgProject* project = (IR_roseCode_Global_Init::Instance(NULL))->project;
- // -- Causes coredump. commented out for now -- //
- // processes attributes left in Rose Ast
- //postProcessRoseCodeInsertion(project);
project->unparse();
- //backend((IR_roseCode_Global_Init::Instance(NULL))->project);
}
IR_ScalarSymbol *IR_roseCode::CreateScalarSymbol(const IR_Symbol *sym, int) {
@@ -1088,16 +1030,7 @@ IR_ArrayRef *IR_roseCode::CreateArrayRef(const IR_ArraySymbol *sym,
ia1 = buildPntrArrRefExp(ia1,exprLstExp);
} else {
for (int i = 0; i < index.size(); i++) {
-/*
- if (is_fortran_)
- t = index.size() - i - 1;
- else
- t = i;
-*/
-
- // std::string y =
- // isSgNode(
- // static_cast<omega::CG_roseRepr *>(index[i])->GetExpression())->unparseToString();
+
ia1 = buildPntrArrRefExp(ia1,
static_cast<omega::CG_roseRepr *>(index[i])->GetExpression());
@@ -1105,7 +1038,6 @@ IR_ArrayRef *IR_roseCode::CreateArrayRef(const IR_ArraySymbol *sym,
}
SgPntrArrRefExp *ia = isSgPntrArrRefExp(ia1);
- //std::string z = isSgNode(ia)->unparseToString();
return new IR_roseArrayRef(this, ia, -1);
@@ -1188,14 +1120,6 @@ std::vector<IR_ScalarRef *> IR_roseCode::FindScalarRef(
static_cast<const omega::CG_roseRepr *>(repr)->GetExpression();
if (isSgVarRefExp(op)
&& (!isSgArrayType(isSgVarRefExp(op)->get_type()))) {
- /* if ((isSgAssignOp(isSgNode(op)->get_parent()))
- && ((isSgAssignOp(isSgNode(op)->get_parent())->get_lhs_operand())
- == op))
- scalars.push_back(
- new IR_roseScalarRef(this,
- isSgAssignOp(isSgNode(op)->get_parent()), -1));
- else
- */
if (SgBinaryOp* op_ = isSgBinaryOp(
isSgVarRefExp(op)->get_parent())) {
if (SgCompoundAssignOp *op__ = isSgCompoundAssignOp(op_)) {
@@ -1359,30 +1283,6 @@ std::vector<IR_ArrayRef *> IR_roseCode::FindArrayRef(
}
}
- /* base = isSgVarRefExp(op);
- SgVariableSymbol *arrSymbol = (SgVariableSymbol*)(base->get_symbol());
- SgArrayType *arrType = isSgArrayType(arrSymbol->get_type());
-
- SgExprListExp* dimList = arrType->get_dim_info();
-
- if(dimList != NULL){
- SgExpressionPtrList::iterator it = dimList->get_expressions().begin();
- SgExpression *expr;
-
-
- for (int i = 0; it != dimList->get_expressions().end(); it++, i++)
- {
- expr = *it;
-
- omega::CG_roseRepr *r = new omega::CG_roseRepr(expr);
- std::vector<IR_ArrayRef *> a = FindArrayRef(r);
- delete r;
- std::copy(a.begin(), a.end(), back_inserter(arrays));
- }
-
- }
- arrays.push_back(ref);
- */
} else if (isSgAssignOp(op)) {
omega::CG_roseRepr *r1 = new omega::CG_roseRepr(
isSgAssignOp(op)->get_lhs_operand());
@@ -1416,54 +1316,6 @@ std::vector<IR_ArrayRef *> IR_roseCode::FindArrayRef(
}
return arrays;
-
- /* std::string x;
- SgStatement* stmt = isSgStatement(tnl);
- SGExprStatement* expr_statement = isSgExprStatement(stmt);
- SgExpression* exp= NULL;
- if(expr_statement == NULL){
- if(! (SgExpression* exp = isSgExpression(tnl))
- throw ir_error("FindArrayRef: Not a stmt nor an expression!!");
-
- if( expr_statement != NULL){
- for(int i=0; i < tnl->get_numberOfTraversalSuccessors(); i++){
-
- SgNode* tn = isSgStatement(tnl);
- SgStatement* stmt = isSgStatement(tn);
- if(stmt != NULL){
- SgExprStatement* expr_statement = isSgExprStatement(tn);
- if(expr_statement != NULL)
- x = isSgNode(expr_statement)->unparseToString();
- exp = expr_statement->get_expression();
-
- }
- else{
-
- exp = isSgExpression(tn);
- }
- if(exp != NULL){
- x = isSgNode(exp)->unparseToString();
-
- if(SgPntrArrRefExp* arrRef = isSgPntrArrRefExp(exp) ){
- if(arrRef == NULL)
- throw ir_error("something wrong");
- IR_roseArrayRef *ref = new IR_roseArrayRef(this, arrRef);
- arrays.push_back(ref);
- }
-
- omega::CG_outputRepr *r = new omega::CG_roseRepr(isSgNode(exp->get_rhs_operand()));
- std::vector<IR_ArrayRef *> a = FindArrayRef(r);
- delete r;
- std::copy(a.begin(), a.end(), back_inserter(arrays));
-
- omega::CG_outputRepr *r1 = new omega::CG_roseRepr(isSgNode(exp->get_lhs_operand()));
- std::vector<IR_ArrayRef *> a1 = FindArrayRef(r1);
- delete r1;
- std::copy(a1.begin(), a1.end(), back_inserter(arrays));
-
- }
- }*/
-
}
std::vector<IR_Control *> IR_roseCode::FindOneLevelControlStructure(
@@ -1536,52 +1388,6 @@ std::vector<IR_Control *> IR_roseCode::FindOneLevelControlStructure(
}
-/*std::vector<IR_Control *> IR_roseCode::FindOneLevelControlStructure(const IR_Block *block) const {
-
- std::vector<IR_Control *> controls;
- int i;
- int j;
- SgNode* tnl_ = ((static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_);
-
-
- if(isSgForStatement(tnl_))
- controls.push_back(new IR_roseLoop(this,tnl_));
-
- else if(isSgBasicBlock(tnl_)){
-
- SgStatementPtrList& stmts = isSgBasicBlock(tnl_)->get_statements();
-
- for(i =0; i < stmts.size(); i++){
- if(isSgNode(stmts[i]) == ((static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->start_))
- break;
- }
-
-
- SgNode* start= NULL;
- SgNode* prev= NULL;
- for(; i < stmts.size(); i++){
- if ( isSgForStatement(stmts[i]) || isSgFortranDo(stmts[i])){
- if(start != NULL){
- controls.push_back(new IR_roseBlock(this, (static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_ , start, prev));
- start = NULL;
- }
- controls.push_back(new IR_roseLoop(this, isSgNode(stmts[i])));
- }
- else if( start == NULL )
- start = isSgNode(stmts[i]);
-
- prev = isSgNode(stmts[i]);
- }
-
- if((start != NULL) && (start != isSgNode(stmts[0])))
- controls.push_back(new IR_roseBlock(this, (static_cast<IR_roseBlock *>(const_cast<IR_Block *>(block)))->tnl_, start, prev));
- }
-
- return controls;
-
- }
-
-*/
IR_Block *IR_roseCode::MergeNeighboringControlStructures(
const std::vector<IR_Control *> &controls) const {
if (controls.size() == 0)
@@ -1781,61 +1587,6 @@ void IR_roseCode::ReplaceExpression(IR_Ref *old, omega::CG_outputRepr *repr) {
delete old;
}
-/*std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > IR_roseCode::FindScalarDeps(
- const omega::CG_outputRepr *repr1, const omega::CG_outputRepr *repr2,
- std::vector<std::string> index, int i, int j) {
-
- std::vector<DependenceVector> dvs1;
- std::vector<DependenceVector> dvs2;
- SgNode *tnl_1 = static_cast<const omega::CG_roseRepr *>(repr1)->GetCode();
- SgNode *tnl_2 = static_cast<const omega::CG_roseRepr *>(repr2)->GetCode();
- SgStatementPtrList* list_1 =
- static_cast<const omega::CG_roseRepr *>(repr1)->GetList();
- SgStatementPtrList output_list_1;
-
- std::map<SgVarRefExp*, IR_ScalarRef*> read_scalars_1;
- std::map<SgVarRefExp*, IR_ScalarRef*> write_scalars_1;
- std::set<std::string> indices;
- //std::set<VirtualCFG::CFGNode> reaching_defs_1;
- std::set<std::string> def_vars_1;
-
- populateLists(tnl_1, list_1, output_list_1);
- populateScalars(repr1, read_scalars_1, write_scalars_1, indices, index);
- //def_vars_1);
- //findDefinitions(output_list_1, reaching_defs_1, write_scalars_1);
- //def_vars_1);
- if (repr1 == repr2)
- checkSelfDependency(output_list_1, dvs1, read_scalars_1,
- write_scalars_1, index, i, j);
- else {
- SgStatementPtrList* list_2 =
- static_cast<const omega::CG_roseRepr *>(repr2)->GetList();
- SgStatementPtrList output_list_2;
-
- std::map<SgVarRefExp*, IR_ScalarRef*> read_scalars_2;
- std::map<SgVarRefExp*, IR_ScalarRef*> write_scalars_2;
- //std::set<VirtualCFG::CFGNode> reaching_defs_2;
- std::set<std::string> def_vars_2;
-
- populateLists(tnl_2, list_2, output_list_2);
- populateScalars(repr2, read_scalars_2, write_scalars_2, indices, index);
- //def_vars_2);
-
- checkDependency(output_list_2, dvs1, read_scalars_2, write_scalars_1,
- index, i, j);
- checkDependency(output_list_1, dvs1, read_scalars_1, write_scalars_2,
- index, i, j);
- checkWriteDependency(output_list_2, dvs1, write_scalars_2,
- write_scalars_1, index, i, j);
- checkWriteDependency(output_list_1, dvs1, write_scalars_1,
- write_scalars_2, index, i, j);
- }
-
- return std::make_pair(dvs1, dvs2);
- //populateLists(tnl_2, list_2, list2);
-
- }
-*/
IR_OPERATION_TYPE IR_roseCode::QueryExpOperation(
const omega::CG_outputRepr *repr) const {
SgExpression* op =
@@ -1870,299 +1621,7 @@ IR_OPERATION_TYPE IR_roseCode::QueryExpOperation(
else
return IR_OP_UNKNOWN;
}
-/*void IR_roseCode::populateLists(SgNode* tnl_1, SgStatementPtrList* list_1,
- SgStatementPtrList& output_list_1) {
- if ((tnl_1 == NULL) && (list_1 != NULL)) {
- output_list_1 = *list_1;
- } else if (tnl_1 != NULL) {
-
- if (isSgForStatement(tnl_1)) {
- SgStatement* check = isSgForStatement(tnl_1)->get_loop_body();
- if (isSgBasicBlock(check)) {
- output_list_1 = isSgBasicBlock(check)->get_statements();
-
- } else
- output_list_1.push_back(check);
-
- } else if (isSgBasicBlock(tnl_1))
- output_list_1 = isSgBasicBlock(tnl_1)->get_statements();
- else if (isSgExprStatement(tnl_1))
- output_list_1.push_back(isSgExprStatement(tnl_1));
- else
- //if (isSgIfStmt(tnl_1)) {
-
- throw ir_error(
- "Statement type not handled, (probably IF statement)!!");
-
- }
-
- }
-
- void IR_roseCode::populateScalars(const omega::CG_outputRepr *repr1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::set<std::string> &indices, std::vector<std::string> &index) {
-
- //std::set<std::string> &def_vars) {
- std::vector<IR_ScalarRef *> scalars = FindScalarRef(repr1);
-
- for (int k = 0; k < index.size(); k++)
- indices.insert(index[k]);
-
- for (int k = 0; k < scalars.size(); k++)
- if (indices.find(scalars[k]->name()) == indices.end()) {
- if (scalars[k]->is_write()) {
- write_scalars_1.insert(
- std::pair<SgVarRefExp*, IR_ScalarRef*>(
- (isSgVarRefExp(
- static_cast<const omega::CG_roseRepr *>(scalars[k]->convert())->GetExpression())),
- scalars[k]));
-
- } else
-
- read_scalars_1.insert(
- std::pair<SgVarRefExp*, IR_ScalarRef*>(
- (isSgVarRefExp(
- static_cast<const omega::CG_roseRepr *>(scalars[k]->convert())->GetExpression())),
- scalars[k]));
- }
-
- }
-
-
- void IR_roseCode::checkWriteDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j) {
-
- for (std::map<SgVarRefExp*, IR_ScalarRef*>::iterator it =
- read_scalars_1.begin(); it != read_scalars_1.end(); it++) {
- SgVarRefExp* var__ = it->first;
-
- ssa_unfiltered_cfg::SSA_UnfilteredCfg::NodeReachingDefTable to_compare =
- main_ssa->getReachingDefsBefore(isSgNode(var__));
-
- for (ssa_unfiltered_cfg::SSA_UnfilteredCfg::NodeReachingDefTable::iterator it4 =
- to_compare.begin(); it4 != to_compare.end(); it4++) {
- ssa_unfiltered_cfg::SSA_UnfilteredCfg::VarName var_ = it4->first;
- for (int j = 0; j < var_.size(); j++) {
- int found = 0;
- if (var_[j] == var__->get_symbol()->get_declaration()) {
-
- ssa_unfiltered_cfg::ReachingDef::ReachingDefPtr to_compare_2 =
- it4->second;
-
- if (to_compare_2->isPhiFunction()) {
- std::set<VirtualCFG::CFGNode> to_compare_set =
- to_compare_2->getActualDefinitions();
- for (std::set<VirtualCFG::CFGNode>::iterator cfg_it =
- to_compare_set.begin();
- cfg_it != to_compare_set.end(); cfg_it++) {
-
- if (isSgAssignOp(cfg_it->getNode())
- || isSgCompoundAssignOp(cfg_it->getNode()))
- if (SgVarRefExp* variable =
- isSgVarRefExp(
- isSgBinaryOp(cfg_it->getNode())->get_lhs_operand())) {
-
- if (write_scalars_1.find(variable)
- != write_scalars_1.end()) {
-
-
- //end debug
- found = 1;
- DependenceVector dv1;
- dv1.sym = it->second->symbol();
- dv1.is_scalar_dependence = true;
-
- int max = (j > i) ? j : i;
- int start = index.size() - max;
-
- //1.lbounds.push_back(0);
- //1.ubounds.push_back(0);
- //dv2.sym =
- // read_scalars_2.find(*di)->second->symbol();
- for (int k = 0; k < index.size(); k++) {
- if (k >= max) {
- dv1.lbounds.push_back(
- negInfinity);
- dv1.ubounds.push_back(-1);
- } else {
- dv1.lbounds.push_back(0);
- dv1.ubounds.push_back(0);
-
- }
-
- }
- dvs1.push_back(dv1);
- break;
- }
- }
- }
-
- }
-
- }
- if (found == 1)
- break;
- }
- }
- }
- }
- void IR_roseCode::checkDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j) {
-
- for (SgStatementPtrList::iterator it2 = output_list_1.begin();
- it2 != output_list_1.end(); it2++) {
-
- std::set<SgVarRefExp*> vars_1 = main_ssa->getUsesAtNode(
- isSgNode(isSgExprStatement(*it2)->get_expression()));
-
- std::set<SgVarRefExp*>::iterator di;
-
- for (di = vars_1.begin(); di != vars_1.end(); di++) {
- int found = 0;
- if (read_scalars_1.find(*di) != read_scalars_1.end()) {
-
- ssa_unfiltered_cfg::ReachingDef::ReachingDefPtr to_compare =
- main_ssa->getDefinitionForUse(*di);
- if (to_compare->isPhiFunction()) {
-
- std::set<VirtualCFG::CFGNode> to_compare_set =
- to_compare->getActualDefinitions();
-
- for (std::set<VirtualCFG::CFGNode>::iterator cfg_it =
- to_compare_set.begin();
- cfg_it != to_compare_set.end(); cfg_it++) {
-
-
- if (SgAssignOp* definition = isSgAssignOp(
- cfg_it->getNode()))
- if (SgVarRefExp* variable = isSgVarRefExp(
- definition->get_lhs_operand())) {
-
- if (write_scalars_1.find(variable)
- != write_scalars_1.end()) {
-
- found = 1;
- DependenceVector dv1;
- //DependenceVector dv2;
- dv1.sym =
- read_scalars_1.find(*di)->second->symbol();
- dv1.is_scalar_dependence = true;
-
- int max = (j > i) ? j : i;
- int start = index.size() - max;
-
- //1.lbounds.push_back(0);
- //1.ubounds.push_back(0);
- //dv2.sym =
- // read_scalars_2.find(*di)->second->symbol();
- for (int k = 0; k < index.size(); k++) {
- if (k >= max) {
- dv1.lbounds.push_back(negInfinity);
- dv1.ubounds.push_back(-1);
- } else {
- dv1.lbounds.push_back(0);
- dv1.ubounds.push_back(0);
-
- }
-
- }
- dvs1.push_back(dv1);
- break;
- }
- }
- }
- }
- if (found == 1)
- break;
- }
- }
- }
-
- }
-
- void IR_roseCode::checkSelfDependency(SgStatementPtrList &output_list_1,
- std::vector<DependenceVector> &dvs1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &read_scalars_1,
- std::map<SgVarRefExp*, IR_ScalarRef*> &write_scalars_1,
- std::vector<std::string> &index, int i, int j) {
-
- for (SgStatementPtrList::iterator it2 = output_list_1.begin();
- it2 != output_list_1.end(); it2++) {
-
- std::set<SgVarRefExp*> vars_1 = main_ssa->getUsesAtNode(
- isSgNode(isSgExprStatement(*it2)->get_expression()));
-
- std::set<SgVarRefExp*>::iterator di;
-
- for (di = vars_1.begin(); di != vars_1.end(); di++) {
-
- if (read_scalars_1.find(*di) != read_scalars_1.end()) {
-
- ssa_unfiltered_cfg::ReachingDef::ReachingDefPtr to_compare =
- main_ssa->getDefinitionForUse(*di);
- if (to_compare->isPhiFunction()) {
-
- std::set<VirtualCFG::CFGNode> to_compare_set =
- to_compare->getActualDefinitions();
- int found = 0;
- for (std::set<VirtualCFG::CFGNode>::iterator cfg_it =
- to_compare_set.begin();
- cfg_it != to_compare_set.end(); cfg_it++) {
-
- if (isSgAssignOp(cfg_it->getNode())
- || isSgCompoundAssignOp(cfg_it->getNode()))
- if (SgVarRefExp* variable =
- isSgVarRefExp(
- isSgBinaryOp(cfg_it->getNode())->get_lhs_operand())) {
-
- if (write_scalars_1.find(variable)
- == write_scalars_1.end()) {
-
-
- found = 1;
- DependenceVector dv1;
- dv1.sym =
- read_scalars_1.find(*di)->second->symbol();
- dv1.is_scalar_dependence = true;
-
- int max = (j > i) ? j : i;
- int start = index.size() - max;
-
- //1.lbounds.push_back(0);
- //1.ubounds.push_back(0);
- //dv2.sym =
- // read_scalars_2.find(*di)->second->symbol();
- for (int k = 0; k < index.size(); k++) {
- if (k >= max) {
- dv1.lbounds.push_back(negInfinity);
- dv1.ubounds.push_back(-1);
- } else {
- dv1.lbounds.push_back(0);
- dv1.ubounds.push_back(0);
-
- }
-
- }
- dvs1.push_back(dv1);
- break;
- }
- }
- }
- }
-
- }
- }
- }
-
- }
-*/
+
IR_CONDITION_TYPE IR_roseCode::QueryBooleanExpOperation(
const omega::CG_outputRepr *repr) const {
SgExpression* op2 =
diff --git a/chill/src/loop.cc b/chill/src/loop.cc
index f4cd844..f187a50 100644
--- a/chill/src/loop.cc
+++ b/chill/src/loop.cc
@@ -748,17 +748,6 @@ void Loop::pragma(int stmt_num, int level, const std::string &pragmaText) {
CG_outputRepr *code = stmt[stmt_num].code;
ocg->CreatePragmaAttribute(code, level, pragmaText);
}
-/*
-void Loop::prefetch(int stmt_num, int level, const std::string &arrName, const std::string &indexName, int offset, int hint) {
- // check sanity of parameters
- if(stmt_num < 0)
- throw std::invalid_argument("invalid statement " + to_string(stmt_num));
-
- CG_outputBuilder *ocg = ir->builder();
- CG_outputRepr *code = stmt[stmt_num].code;
- ocg->CreatePrefetchAttribute(code, level, arrName, indexName, int offset, hint);
-}
-*/
void Loop::prefetch(int stmt_num, int level, const std::string &arrName, int hint) {
// check sanity of parameters
diff --git a/chill/src/omegatools.cc b/chill/src/omegatools.cc
index cab66d4..3aac404 100644
--- a/chill/src/omegatools.cc
+++ b/chill/src/omegatools.cc
@@ -14,7 +14,6 @@
*****************************************************************************/
#include <code_gen/codegen.h>
-// #include <code_gen/output_repr.h>
#include "omegatools.hh"
#include "ir_code.hh"
#include "chill_error.hh"
@@ -42,18 +41,9 @@ std::string tmp_e() {
return std::string("e")+to_string(counter++);
}
-
-
-//-----------------------------------------------------------------------------
-// Convert expression tree to omega relation. "destroy" means shallow
-// deallocation of "repr", not freeing the actual code inside.
-// -----------------------------------------------------------------------------
void exp2formula(IR_Code *ir, Relation &r, F_And *f_root, std::vector<Free_Var_Decl*> &freevars,
CG_outputRepr *repr, Variable_ID lhs, char side, IR_CONDITION_TYPE rel, bool destroy) {
-// void exp2formula(IR_Code *ir, Relation &r, F_And *f_root, std::vector<Free_Var_Decl*> &freevars,
-// CG_outputRepr *repr, Variable_ID lhs, char side, char rel, bool destroy) {
-
switch (ir->QueryExpOperation(repr)) {
case IR_OP_CONSTANT:
{
@@ -509,10 +499,6 @@ void exp2formula(IR_Code *ir, Relation &r, F_And *f_root, std::vector<Free_Var_D
}
}
-
-//-----------------------------------------------------------------------------
-// Build dependence relation for two array references.
-// -----------------------------------------------------------------------------
Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
const IR_ArrayRef *ref_src, const Relation &IS_w,
const IR_ArrayRef *ref_dst, const Relation &IS_r) {
@@ -583,11 +569,6 @@ Relation arrays2relation(IR_Code *ir, std::vector<Free_Var_Decl*> &freevars,
return r;
}
-
-//-----------------------------------------------------------------------------
-// Convert array dependence relation into set of dependence vectors, assuming
-// ref_w is lexicographically before ref_r in the source code.
-// -----------------------------------------------------------------------------
std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relation2dependences (const IR_ArrayRef *ref_src, const IR_ArrayRef *ref_dst, const Relation &r) {
assert(r.n_inp() == r.n_out());
@@ -815,11 +796,6 @@ std::pair<std::vector<DependenceVector>, std::vector<DependenceVector> > relatio
return std::make_pair(dependences1, dependences2);
}
-
-//-----------------------------------------------------------------------------
-// Convert a boolean expression to omega relation. "destroy" means shallow
-// deallocation of "repr", not freeing the actual code inside.
-//-----------------------------------------------------------------------------
void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
std::vector<Free_Var_Decl *> &freevars,
CG_outputRepr *repr, bool destroy) {
@@ -862,739 +838,6 @@ void exp2constraint(IR_Code *ir, Relation &r, F_And *f_root,
}
}
-
-
-
-
-// inline void exp2formula(IR_Code *ir, Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// const CG_outputRepr *repr, Variable_ID lhs, char side, char rel) {
-// exp2formula(ir, r, f_root, freevars, const_cast<CG_outputRepr *>(repr), lhs, side, rel, false);
-// }
-
-
-
-
-
-
-
-//-----------------------------------------------------------------------------
-// Convert suif expression tree to omega relation.
-//-----------------------------------------------------------------------------
-
-// void suif2formula(Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// operand op, Variable_ID lhs,
-// char side, char rel) {
-// if (op.is_immed()) {
-// immed im = op.immediate();
-
-// if (im.is_integer()) {
-// int c = im.integer();
-
-// if (rel == '>') {
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(lhs, 1);
-// h.update_const(-1*c);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(lhs, -1);
-// h.update_const(c);
-// }
-// else { // '='
-// EQ_Handle h = f_root->add_EQ();
-// h.update_coef(lhs, 1);
-// h.update_const(-1*c);
-// }
-// }
-// else {
-// return; //add Function in the future
-// }
-// }
-// else if (op.is_symbol()) {
-// String s = op.symbol()->name();
-// Variable_ID e = find_index(r, s, side);
-
-// if (e == NULL) { // must be free variable
-// Free_Var_Decl *t = NULL;
-// for (unsigned i = 0; i < freevars.size(); i++) {
-// String ss = freevars[i]->base_name();
-// if (s == ss) {
-// t = freevars[i];
-// break;
-// }
-// }
-
-// if (t == NULL) {
-// t = new Free_Var_Decl(s);
-// freevars.insert(freevars.end(), t);
-// }
-
-// e = r.get_local(t);
-// }
-
-// if (rel == '>') {
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, -1);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(lhs, -1);
-// h.update_coef(e, 1);
-// }
-// else { // '='
-// EQ_Handle h = f_root->add_EQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, -1);
-// }
-// }
-// else if (op.is_instr())
-// suif2formula(r, f_root, freevars, op.instr(), lhs, side, rel);
-// }
-
-
-// void suif2formula(Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// instruction *ins, Variable_ID lhs,
-// char side, char rel) {
-// if (ins->opcode() == io_cpy) {
-// suif2formula(r, f_root, freevars, ins->src_op(0), lhs, side, rel);
-// }
-// else if (ins->opcode() == io_add || ins->opcode() == io_sub) {
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e1 = f_exists->declare(tmp_e());
-// Variable_ID e2 = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// int add_or_sub = ins->opcode() == io_add ? 1 : -1;
-// if (rel == '>') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e1, -1);
-// h.update_coef(e2, -1 * add_or_sub);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, -1);
-// h.update_coef(e1, 1);
-// h.update_coef(e2, 1 * add_or_sub);
-// }
-// else { // '='
-// EQ_Handle h = f_and->add_EQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e1, -1);
-// h.update_coef(e2, -1 * add_or_sub);
-// }
-
-// suif2formula(r, f_and, freevars, ins->src_op(0), e1, side, '=');
-// suif2formula(r, f_and, freevars, ins->src_op(1), e2, side, '=');
-// }
-// else if (ins->opcode() == io_mul) {
-// operand op1 = ins->src_op(0);
-// operand op2 = ins->src_op(1);
-
-// if (!op1.is_immed() && !op2.is_immed())
-// return; // add Function in the future
-// else {
-// operand op;
-// immed im;
-// if (op1.is_immed()) {
-// im = op1.immediate();
-// op = op2;
-// }
-// else {
-// im = op2.immediate();
-// op = op1;
-// }
-
-// if (!im.is_integer())
-// return; //add Function in the future
-// else {
-// int c = im.integer();
-
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// if (rel == '>') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, -c);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, -1);
-// h.update_coef(e, c);
-// }
-// else {
-// EQ_Handle h = f_and->add_EQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, -c);
-// }
-
-// suif2formula(r, f_and, freevars, op, e, side, '=');
-// }
-// }
-// }
-// else if (ins->opcode() == io_div) {
-// operand op1 = ins->src_op(0);
-// operand op2 = ins->src_op(1);
-
-// if (!op2.is_immed())
-// return; //add Function in the future
-// else {
-// immed im = op2.immediate();
-
-// if (!im.is_integer())
-// return; //add Function in the future
-// else {
-// int c = im.integer();
-
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// if (rel == '>') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, c);
-// h.update_coef(e, -1);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, -c);
-// h.update_coef(e, 1);
-// }
-// else {
-// EQ_Handle h = f_and->add_EQ();
-// h.update_coef(lhs, c);
-// h.update_coef(e, -1);
-// }
-
-// suif2formula(r, f_and, freevars, op1, e, side, '=');
-// }
-// }
-// }
-// else if (ins->opcode() == io_neg) {
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// if (rel == '>') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, 1);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h = f_and->add_GEQ();
-// h.update_coef(lhs, -1);
-// h.update_coef(e, -1);
-// }
-// else {
-// EQ_Handle h = f_and->add_EQ();
-// h.update_coef(lhs, 1);
-// h.update_coef(e, 1);
-// }
-
-// suif2formula(r, f_and, freevars, ins->src_op(0), e, side, '=');
-// }
-// else if (ins->opcode() == io_min) {
-// operand op1 = ins->src_op(0);
-// operand op2 = ins->src_op(1);
-
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e1 = f_exists->declare(tmp_e());
-// Variable_ID e2 = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// if (rel == '>') {
-// F_Or *f_or = f_and->add_or();
-// F_And *f_and1 = f_or->add_and();
-// GEQ_Handle h1 = f_and1->add_GEQ();
-// h1.update_coef(lhs, 1);
-// h1.update_coef(e1, -1);
-// F_And *f_and2 = f_or->add_and();
-// GEQ_Handle h2 = f_and2->add_GEQ();
-// h2.update_coef(lhs, 1);
-// h2.update_coef(e2, -1);
-// }
-// else if (rel == '<') {
-// GEQ_Handle h1 = f_and->add_GEQ();
-// h1.update_coef(lhs, -1);
-// h1.update_coef(e1, 1);
-// GEQ_Handle h2 = f_and->add_GEQ();
-// h2.update_coef(lhs, -1);
-// h2.update_coef(e2, 1);
-// }
-// else {
-// F_Or *f_or = f_and->add_or();
-// F_And *f_and1 = f_or->add_and();
-// EQ_Handle h1 = f_and1->add_EQ();
-// h1.update_coef(lhs, 1);
-// h1.update_coef(e1, -1);
-// GEQ_Handle h2 = f_and1->add_GEQ();
-// h2.update_coef(e1, -1);
-// h2.update_coef(e2, 1);
-// F_And *f_and2 = f_or->add_and();
-// EQ_Handle h3 = f_and2->add_EQ();
-// h3.update_coef(lhs, 1);
-// h3.update_coef(e2, -1);
-// GEQ_Handle h4 = f_and2->add_GEQ();
-// h4.update_coef(e1, 1);
-// h4.update_coef(e2, -1);
-// }
-
-// suif2formula(r, f_and, freevars, op1, e1, side, '=');
-// suif2formula(r, f_and, freevars, op2, e2, side, '=');
-// }
-// else if (ins->opcode() == io_max) {
-// operand op1 = ins->src_op(0);
-// operand op2 = ins->src_op(1);
-
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e1 = f_exists->declare(tmp_e());
-// Variable_ID e2 = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// if (rel == '>') {
-// GEQ_Handle h1 = f_and->add_GEQ();
-// h1.update_coef(lhs, 1);
-// h1.update_coef(e1, -1);
-// GEQ_Handle h2 = f_and->add_GEQ();
-// h2.update_coef(lhs, 1);
-// h2.update_coef(e2, -1);
-// }
-// else if (rel == '<') {
-// F_Or *f_or = f_and->add_or();
-// F_And *f_and1 = f_or->add_and();
-// GEQ_Handle h1 = f_and1->add_GEQ();
-// h1.update_coef(lhs, -1);
-// h1.update_coef(e1, 1);
-// F_And *f_and2 = f_or->add_and();
-// GEQ_Handle h2 = f_and2->add_GEQ();
-// h2.update_coef(lhs, -1);
-// h2.update_coef(e2, 1);
-// }
-// else {
-// F_Or *f_or = f_and->add_or();
-// F_And *f_and1 = f_or->add_and();
-// EQ_Handle h1 = f_and1->add_EQ();
-// h1.update_coef(lhs, 1);
-// h1.update_coef(e1, -1);
-// GEQ_Handle h2 = f_and1->add_GEQ();
-// h2.update_coef(e1, 1);
-// h2.update_coef(e2, -1);
-// F_And *f_and2 = f_or->add_and();
-// EQ_Handle h3 = f_and2->add_EQ();
-// h3.update_coef(lhs, 1);
-// h3.update_coef(e2, -1);
-// GEQ_Handle h4 = f_and2->add_GEQ();
-// h4.update_coef(e1, -1);
-// h4.update_coef(e2, 1);
-// }
-
-// suif2formula(r, f_and, freevars, op1, e1, side, '=');
-// suif2formula(r, f_and, freevars, op2, e2, side, '=');
-// }
-// }
-
-//-----------------------------------------------------------------------------
-// Generate iteration space constraints
-//-----------------------------------------------------------------------------
-
-// void add_loop_stride_constraints(Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// tree_for *tnf, char side) {
-
-// std::string name(tnf->index()->name());
-// int dim = 0;
-// for (;dim < r.n_set(); dim++)
-// if (r.set_var(dim+1)->name() == name)
-// break;
-
-// Relation bound = get_loop_bound(r, dim);
-
-// operand op = tnf->step_op();
-// if (!op.is_null()) {
-// if (op.is_immed()) {
-// immed im = op.immediate();
-// if (im.is_integer()) {
-// int c = im.integer();
-
-// if (c != 1 && c != -1)
-// add_loop_stride(r, bound, dim, c);
-// }
-// else
-// assert(0); // messy stride
-// }
-// else
-// assert(0); // messy stride
-// }
-// }
-
-// void add_loop_bound_constraints(IR_Code *ir, Relation &r, F_And *f_root,
-// std::vector<Free_Var_Decl*> &freevars,
-// tree_for *tnf,
-// char upper_or_lower, char side, IR_CONDITION_TYPE rel) {
-// Variable_ID v = find_index(r, tnf->index()->name(), side);
-
-// tree_node_list *tnl;
-
-// if (upper_or_lower == 'u')
-// tnl = tnf->ub_list();
-// else
-// tnl = tnf->lb_list();
-
-// tree_node_list_iter iter(tnl);
-// while (!iter.is_empty()) {
-// tree_node *tn = iter.step();
-// if (tn->kind() != TREE_INSTR)
-// break; // messy bounds
-
-// instruction *ins = static_cast<tree_instr *>(tn)->instr();
-
-
-// if (upper_or_lower == 'u' && (tnf->test() == FOR_SLT || tnf->test() == FOR_ULT)) {
-// operand op1(ins->clone());
-// operand op2(new in_ldc(type_s32, operand(), immed(1)));
-// instruction *t = new in_rrr(io_sub, op1.type(), operand(), op1, op2);
-
-// CG_suifRepr *repr = new CG_suifRepr(operand(t));
-// exp2formula(ir, r, f_root, freevars, repr, v, side, rel, true);
-// delete t;
-// }
-// else if (tnf->test() == FOR_SLT || tnf->test() == FOR_SLTE || tnf->test() == FOR_ULT || tnf->test() == FOR_ULTE) {
-// CG_suifRepr *repr = new CG_suifRepr(operand(ins));
-// exp2formula(ir, r, f_root, freevars, repr, v, side, rel, true);
-// }
-// else
-// assert(0);
-// }
-// }
-
-
-// Relation loop_iteration_space(std::vector<Free_Var_Decl*> &freevars,
-// tree_node *tn, std::vector<tree_for*> &loops) {
-// Relation r(loops.size());
-// for (unsigned i = 0; i < loops.size(); i++) {
-// String s = loops[i]->index()->name();
-// r.name_set_var(i+1, s);
-// }
-
-// F_And *f_root = r.add_and();
-
-// std::vector<tree_for *> outer = find_outer_loops(tn);
-// std::vector<LexicalOrderType> loops_lex(loops.size(), LEX_UNKNOWN);
-
-// for (unsigned i = 0; i < outer.size(); i++) {
-// unsigned j;
-
-// for (j = 0; j < loops.size(); j++) {
-// if (outer[i] == loops[j]) {
-// loops_lex[j] = LEX_MATCH;
-// break;
-// } else if (outer[i]->index() == loops[j]->index()) {
-// loops_lex[j] = lexical_order(outer[i],loops[j]);
-// break;
-// }
-// }
-
-// if (j != loops.size()) {
-// add_loop_bound_constraints(r, f_root, freevars, outer[i], 'l', 's', '>');
-// add_loop_bound_constraints(r, f_root, freevars, outer[i], 'u', 's', '<');
-// add_loop_stride_constraints(r,f_root, freevars, outer[i], 's');
-// }
-// }
-
-// // Add degenerated constraints for non-enclosing loops for this
-// // statement. We treat low-dim space as part of whole
-// // iteration space.
-// LexicalOrderType lex = LEX_MATCH;
-// for (unsigned i = 0; i < loops.size(); i++) {
-// if (loops_lex[i] != 0) {
-// if (lex == LEX_MATCH)
-// lex = loops_lex[i];
-// continue;
-// }
-
-// if (lex == LEX_MATCH) {
-// for (unsigned j = i+1; j < loops.size(); j++) {
-// if (loops_lex[j] == LEX_BEFORE || loops_lex[j] == LEX_AFTER) {
-// lex = loops_lex[j];
-// break;
-// }
-// }
-// }
-
-// if (lex == LEX_MATCH)
-// lex = lexical_order(tn, loops[i]);
-
-// if (lex == LEX_BEFORE)
-// add_loop_bound_constraints(r, f_root, freevars, loops[i], 'l', 's', '=');
-// else
-// add_loop_bound_constraints(r, f_root, freevars, loops[i], 'u', 's', '=');
-// }
-
-// return r;
-// }
-
-// Relation arrays2relation(std::vector<Free_Var_Decl*> &freevars,
-// in_array *ia_w, const Relation &IS1_,
-// in_array *ia_r, const Relation &IS2_) {
-// Relation &IS1 = const_cast<Relation &>(IS1_);
-// Relation &IS2 = const_cast<Relation &>(IS2_);
-
-// Relation r(IS1.n_set(), IS2.n_set());
-
-// for (int i = 1; i <= IS1.n_set(); i++)
-// r.name_input_var(i, IS1.set_var(i)->name());
-
-// for (int i = 1; i <= IS2.n_set(); i++)
-// r.name_output_var(i, IS2.set_var(i)->name()+"'");
-
-// if (get_sym_of_array(ia_w) != get_sym_of_array(ia_r)) {
-// r.add_or(); // False Relation
-// return r;
-// }
-
-// F_And *f_root = r.add_and();
-
-// for (unsigned i = 0; i < ia_w->dims(); i++) {
-// F_Exists *f_exists = f_root->add_exists();
-// Variable_ID e = f_exists->declare(tmp_e());
-// F_And *f_and = f_exists->add_and();
-
-// suif2formula(r, f_and, freevars, ia_w->index(i), e, 'w', '=');
-// suif2formula(r, f_and, freevars, ia_r->index(i), e, 'r', '=');
-// }
-
-// // add iteration space restriction
-// r = Restrict_Domain(r, copy(IS1));
-// r = Restrict_Range(r, copy(IS2));
-
-// // reset the output variable names lost in restriction
-// for (int i = 1; i <= IS2.n_set(); i++)
-// r.name_output_var(i, IS2.set_var(i)->name()+"'");
-
-// return r;
-// }
-
-
-// std::vector<DependenceVector> relation2dependences (IR_Code *ir, in_array *ia_w, in_array *ia_r, const Relation &r) {
-// assert(r.n_inp() == r.n_out());
-
-// std::vector<DependenceVector> dependences;
-
-// std::stack<DependenceLevel> working;
-// working.push(DependenceLevel(r, r.n_inp()));
-
-// while (!working.empty()) {
-// DependenceLevel dep = working.top();
-// working.pop();
-
-// // No dependence exists, move on.
-// if (!dep.r.is_satisfiable())
-// continue;
-
-// if (dep.level == r.n_inp()) {
-// DependenceVector dv;
-
-// // for loop independent dependence, use lexical order to
-// // determine the correct source and destination
-// if (dep.dir == 0) {
-// LexicalOrderType order = lexical_order(ia_w->parent(), ia_r->parent());
-
-// if (order == LEX_MATCH)
-// continue; //trivial self zero-dependence
-// else if (order == LEX_AFTER) {
-// dv.src = new IR_suifArrayRef(ir, ia_r);
-// dv.dst = new IR_suifArrayRef(ir, ia_w);
-// }
-// else {
-// dv.src = new IR_suifArrayRef(ir, ia_w);
-// dv.dst = new IR_suifArrayRef(ir,ia_r);
-// }
-// }
-// else if (dep.dir == 1) {
-// dv.src = new IR_suifArrayRef(ir, ia_w);
-// dv.dst = new IR_suifArrayRef(ir, ia_r);
-// }
-// else { // dep.dir == -1
-// dv.src = new IR_suifArrayRef(ir, ia_r);
-// dv.dst = new IR_suifArrayRef(ir, ia_w);
-// }
-
-// dv.lbounds = dep.lbounds;
-// dv.ubounds = dep.ubounds;
-
-// // // set the dependence type
-// // if (is_lhs(dv.source) && is_lhs(dv.dest))
-// // dv.type = 'o';
-// // else if (!is_lhs(dv.source) && ! is_lhs(dv.dest))
-// // dv.type = 'i';
-// // else if (is_lhs(dv.source))
-// // dv.type = 'f';
-// // else
-// // dv.type = 'a';
-
-// dependences.push_back(dv);
-// }
-// else {
-// // now work on the next dimension level
-// int level = ++dep.level;
-
-// coef_t lbound, ubound;
-// Relation delta = Deltas(copy(dep.r));
-// delta.query_variable_bounds(delta.set_var(level), lbound, ubound);
-
-// if (dep.dir == 0) {
-// if (lbound > 0) {
-// dep.dir = 1;
-// dep.lbounds[level-1] = lbound;
-// dep.ubounds[level-1] = ubound;
-
-// working.push(dep);
-// }
-// else if (ubound < 0) {
-// dep.dir = -1;
-// dep.lbounds[level-1] = -ubound;
-// dep.ubounds[level-1] = -lbound;
-
-// working.push(dep);
-// }
-// else {
-// // split the dependence vector into flow- and anti-dependence
-// // for the first non-zero distance, also separate zero distance
-// // at this level.
-// {
-// DependenceLevel dep2 = dep;
-
-// dep2.lbounds[level-1] = 0;
-// dep2.ubounds[level-1] = 0;
-
-// F_And *f_root = dep2.r.and_with_and();
-// EQ_Handle h = f_root->add_EQ();
-// h.update_coef(dep2.r.input_var(level), 1);
-// h.update_coef(dep2.r.output_var(level), -1);
-
-// working.push(dep2);
-// }
-
-// if (lbound < 0 && ia_w != ia_r) {
-// DependenceLevel dep2 = dep;
-
-// F_And *f_root = dep2.r.and_with_and();
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(dep2.r.input_var(level), 1);
-// h.update_coef(dep2.r.output_var(level), -1);
-// h.update_const(-1);
-
-// // get tighter bounds under new constraints
-// coef_t lbound, ubound;
-// delta = Deltas(copy(dep2.r));
-// delta.query_variable_bounds(delta.set_var(level),
-// lbound, ubound);
-
-// dep2.dir = -1;
-// dep2.lbounds[level-1] = max(-ubound,static_cast<coef_t>(1)); // use max() to avoid Omega retardness
-// dep2.ubounds[level-1] = -lbound;
-
-// working.push(dep2);
-// }
-
-// if (ubound > 0) {
-// DependenceLevel dep2 = dep;
-
-// F_And *f_root = dep2.r.and_with_and();
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(dep2.r.input_var(level), -1);
-// h.update_coef(dep2.r.output_var(level), 1);
-// h.update_const(-1);
-
-// // get tighter bonds under new constraints
-// coef_t lbound, ubound;
-// delta = Deltas(copy(dep2.r));
-// delta.query_variable_bounds(delta.set_var(level),
-// lbound, ubound);
-// dep2.dir = 1;
-// dep2.lbounds[level-1] = max(lbound,static_cast<coef_t>(1)); // use max() to avoid Omega retardness
-// dep2.ubounds[level-1] = ubound;
-
-// working.push(dep2);
-// }
-// }
-// }
-// // now deal with dependence vector with known direction
-// // determined at previous levels
-// else {
-// // For messy bounds, further test to see if the dependence distance
-// // can be reduced to positive/negative. This is an omega hack.
-// if (lbound == negInfinity && ubound == posInfinity) {
-// {
-// Relation t = dep.r;
-// F_And *f_root = t.and_with_and();
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(t.input_var(level), 1);
-// h.update_coef(t.output_var(level), -1);
-// h.update_const(-1);
-
-// if (!t.is_satisfiable()) {
-// lbound = 0;
-// }
-// }
-// {
-// Relation t = dep.r;
-// F_And *f_root = t.and_with_and();
-// GEQ_Handle h = f_root->add_GEQ();
-// h.update_coef(t.input_var(level), -1);
-// h.update_coef(t.output_var(level), 1);
-// h.update_const(-1);
-
-// if (!t.is_satisfiable()) {
-// ubound = 0;
-// }
-// }
-// }
-
-// // Same thing as above, test to see if zero dependence
-// // distance possible.
-// if (lbound == 0 || ubound == 0) {
-// Relation t = dep.r;
-// F_And *f_root = t.and_with_and();
-// EQ_Handle h = f_root->add_EQ();
-// h.update_coef(t.input_var(level), 1);
-// h.update_coef(t.output_var(level), -1);
-
-// if (!t.is_satisfiable()) {
-// if (lbound == 0)
-// lbound = 1;
-// if (ubound == 0)
-// ubound = -1;
-// }
-// }
-
-// if (dep.dir == -1) {
-// dep.lbounds[level-1] = -ubound;
-// dep.ubounds[level-1] = -lbound;
-// }
-// else { // dep.dir == 1
-// dep.lbounds[level-1] = lbound;
-// dep.ubounds[level-1] = ubound;
-// }
-
-// working.push(dep);
-// }
-// }
-// }
-
-// return dependences;
-// }
-
-//-----------------------------------------------------------------------------
-// Determine whether the loop (starting from 0) in the iteration space
-// has only one iteration.
-//-----------------------------------------------------------------------------
bool is_single_loop_iteration(const Relation &r, int level, const Relation &known) {
int n = r.n_set();
Relation r1 = Intersection(copy(r), Extend_Set(copy(known), n-known.n_set()));
@@ -1626,8 +869,6 @@ bool is_single_loop_iteration(const Relation &r, int level, const Relation &know
}
-
-
bool is_single_iteration(const Relation &r, int dim) {
assert(r.is_set());
const int n = r.n_set();
@@ -1637,11 +878,6 @@ bool is_single_iteration(const Relation &r, int dim) {
Relation bound = get_loop_bound(r, dim);
-// if (!bound.has_single_conjunct())
-// return false;
-
-// Conjunct *c = bound.query_DNF()->single_conjunct();
-
for (DNF_Iterator di(bound.query_DNF()); di; di++) {
bool is_single = false;
for (EQ_Iterator ei((*di)->EQs()); ei; ei++)
@@ -1655,78 +891,8 @@ bool is_single_iteration(const Relation &r, int dim) {
}
return true;
-
-
-
-
-// Relation r = copy(r_);
-// const int n = r.n_set();
-
-// if (dim >= n)
-// return true;
-
-// Relation bound = get_loop_bound(r, dim);
-// bound = Approximate(bound);
-// Conjunct *c = bound.query_DNF()->single_conjunct();
-
-// return c->n_GEQs() == 0;
-
-
-
-
-
-// Relation r = copy(r_);
-// r.simplify();
-// const int n = r.n_set();
-
-// if (dim >= n)
-// return true;
-
-// for (DNF_Iterator i(r.query_DNF()); i; i++) {
-// std::vector<bool> is_single(n);
-// for (int j = 0; j < dim; j++)
-// is_single[j] = true;
-// for (int j = dim; j < n; j++)
-// is_single[j] = false;
-
-// bool found_new_single = true;
-// while (found_new_single) {
-// found_new_single = false;
-
-// for (EQ_Iterator j = (*i)->EQs(); j; j++) {
-// int saved_pos = -1;
-// for (Constr_Vars_Iter k(*j); k; k++)
-// if ((*k).var->kind() == Set_Var || (*k).var->kind() == Input_Var) {
-// int pos = (*k).var->get_position() - 1;
-// if (!is_single[pos])
-// if (saved_pos == -1)
-// saved_pos = pos;
-// else {
-// saved_pos = -1;
-// break;
-// }
-// }
-
-// if (saved_pos != -1) {
-// is_single[saved_pos] = true;
-// found_new_single = true;
-// }
-// }
-
-// if (is_single[dim])
-// break;
-// }
-
-// if (!is_single[dim])
-// return false;
-// }
-
-// return true;
}
-//-----------------------------------------------------------------------------
-// Set/get the value of a variable which is know to be constant.
-//-----------------------------------------------------------------------------
void assign_const(Relation &r, int dim, int val) {
const int n = r.n_out();
@@ -1751,14 +917,10 @@ void assign_const(Relation &r, int dim, int val) {
int get_const(const Relation &r, int dim, Var_Kind type) {
-// Relation rr = copy(r);
Relation &rr = const_cast<Relation &>(r);
Variable_ID v;
switch (type) {
- // case Set_Var:
- // v = rr.set_var(dim+1);
- // break;
case Input_Var:
v = rr.input_var(dim+1);
break;
@@ -1777,19 +939,10 @@ int get_const(const Relation &r, int dim, Var_Kind type) {
throw std::runtime_error("cannot get variable's constant value");
}
-
-
-
-
-
-//---------------------------------------------------------------------------
-// Get the bound for a specific loop.
-//---------------------------------------------------------------------------
Relation get_loop_bound(const Relation &r, int dim) {
assert(r.is_set());
const int n = r.n_set();
-// Relation r1 = project_onto_levels(copy(r), dim+1, true);
Relation mapping(n,n);
F_And *f_root = mapping.add_and();
for (int i = 1; i <= dim+1; i++) {
@@ -1864,12 +1017,6 @@ Relation get_min_loop_bound(const std::vector<Relation> &r, int dim) {
return res;
}
-//-----------------------------------------------------------------------------
-// Add strident to a loop.
-// Issues:
-// - Don't work with relations with multiple disjuncts.
-// - Omega's dealing with max lower bound is awkward.
-//-----------------------------------------------------------------------------
void add_loop_stride(Relation &r, const Relation &bound_, int dim, int stride) {
F_And *f_root = r.and_with_and();
Relation &bound = const_cast<Relation &>(bound_);
@@ -1953,15 +1100,6 @@ bool is_inner_loop_depend_on_level(const Relation &r, int level, const Relation
return false;
}
-
-//-----------------------------------------------------------------------------
-// Suppose loop dim is i. Replace i with i+adjustment in loop bounds.
-// e.g. do i = 1, n
-// do j = i, n
-// after call with dim = 0 and adjustment = 1:
-// do i = 1, n
-// do j = i+1, n
-// -----------------------------------------------------------------------------
Relation adjust_loop_bound(const Relation &r, int level, int adjustment) {
if (adjustment == 0)
return copy(r);
@@ -1998,236 +1136,6 @@ Relation adjust_loop_bound(const Relation &r, int level, int adjustment) {
return r1;
}
-
-// commented out on 07/14/2010
-// void adjust_loop_bound(Relation &r, int dim, int adjustment, std::vector<Free_Var_Decl *> globals) {
-// assert(r.is_set());
-
-// if (adjustment == 0)
-// return;
-
-// const int n = r.n_set();
-// Tuple<std::string> name(n);
-// for (int i = 1; i <= n; i++)
-// name[i] = r.set_var(i)->name();
-
-// Relation r1 = project_onto_levels(copy(r), dim+1, true);
-// Relation r2 = Gist(copy(r), copy(r1));
-
-// // remove old bogus global variable conditions since we are going to
-// // update the value.
-// if (globals.size() > 0)
-// r1 = Gist(r1, project_onto_levels(copy(r), 0, true));
-
-// Relation r4 = Relation::True(n);
-
-// for (DNF_Iterator di(r2.query_DNF()); di; di++) {
-// for (EQ_Iterator ei = (*di)->EQs(); ei; ei++) {
-// EQ_Handle h = r4.and_with_EQ(*ei);
-
-// Variable_ID v = r2.set_var(dim+1);
-// coef_t c = (*ei).get_coef(v);
-// if (c != 0)
-// h.update_const(c*adjustment);
-
-// for (int i = 0; i < globals.size(); i++) {
-// Variable_ID v = r2.get_local(globals[i]);
-// coef_t c = (*ei).get_coef(v);
-// if (c != 0)
-// h.update_const(c*adjustment);
-// }
-// }
-
-// for (GEQ_Iterator gi = (*di)->GEQs(); gi; gi++) {
-// GEQ_Handle h = r4.and_with_GEQ(*gi);
-
-// Variable_ID v = r2.set_var(dim+1);
-// coef_t c = (*gi).get_coef(v);
-// if (c != 0)
-// h.update_const(c*adjustment);
-
-// for (int i = 0; i < globals.size(); i++) {
-// Variable_ID v = r2.get_local(globals[i]);
-// coef_t c = (*gi).get_coef(v);
-// if (c != 0)
-// h.update_const(c*adjustment);
-// }
-// }
-// }
-// r = Intersection(r1, r4);
-// // }
-// // else
-// // r = Intersection(r1, r2);
-
-// for (int i = 1; i <= n; i++)
-// r.name_set_var(i, name[i]);
-// r.setup_names();
-// }
-
-
-// void adjust_loop_bound(Relation &r, int dim, int adjustment) {
-// assert(r.is_set());
-// const int n = r.n_set();
-// Tuple<String> name(n);
-// for (int i = 1; i <= n; i++)
-// name[i] = r.set_var(i)->name();
-
-// Relation r1 = project_onto_levels(copy(r), dim+1, true);
-// Relation r2 = Gist(r, copy(r1));
-
-// Relation r3(n, n);
-// F_And *f_root = r3.add_and();
-// for (int i = 0; i < n; i++) {
-// EQ_Handle h = f_root->add_EQ();
-// h.update_coef(r3.output_var(i+1), 1);
-// h.update_coef(r3.input_var(i+1), -1);
-// if (i == dim)
-// h.update_const(adjustment);
-// }
-
-// r2 = Range(Restrict_Domain(r3, r2));
-// r = Intersection(r1, r2);
-
-// for (int i = 1; i <= n; i++)
-// r.name_set_var(i, name[i]);
-// r.setup_names();
-// }
-
-// void adjust_loop_bound(Relation &r, int dim, Free_Var_Decl *global_var, int adjustment) {
-// assert(r.is_set());
-// const int n = r.n_set();
-// Tuple<String> name(n);
-// for (int i = 1; i <= n; i++)
-// name[i] = r.set_var(i)->name();
-
-// Relation r1 = project_onto_levels(copy(r), dim+1, true);
-// Relation r2 = Gist(r, copy(r1));
-
-// Relation r3(n);
-// Variable_ID v = r2.get_local(global_var);
-
-// for (DNF_Iterator di(r2.query_DNF()); di; di++) {
-// for (EQ_Iterator ei = (*di)->EQs(); ei; ei++) {
-// coef_t c = (*ei).get_coef(v);
-// EQ_Handle h = r3.and_with_EQ(*ei);
-// if (c != 0)
-// h.update_const(c*adjustment);
-// }
-// for (GEQ_Iterator gi = (*di)->GEQs(); gi; gi++) {
-// coef_t c = (*gi).get_coef(v);
-// GEQ_Handle h = r3.and_with_GEQ(*gi);
-// if (c != 0)
-// h.update_const(c*adjustment);
-// }
-// }
-
-// r = Intersection(r1, r3);
-// for (int i = 1; i <= n; i++)
-// r.name_set_var(i, name[i]);
-// r.setup_names();
-// }
-
-
-
-//------------------------------------------------------------------------------
-// If the dimension has value posInfinity, the statement should be privatized
-// at this dimension.
-//------------------------------------------------------------------------------
-// boolean is_private_statement(const Relation &r, int dim) {
-// int n;
-// if (r.is_set())
-// n = r.n_set();
-// else
-// n = r.n_out();
-
-// if (dim >= n)
-// return false;
-
-// try {
-// coef_t c;
-// if (r.is_set())
-// c = get_const(r, dim, Set_Var);
-// else
-// c = get_const(r, dim, Output_Var);
-// if (c == posInfinity)
-// return true;
-// else
-// return false;
-// }
-// catch (loop_error e){
-// }
-
-// return false;
-// }
-
-
-
-// // ----------------------------------------------------------------------------
-// // Calculate v mod dividend based on equations inside relation r.
-// // Return posInfinity if it is not a constant.
-// // ----------------------------------------------------------------------------
-// static coef_t mod_(const Relation &r_, Variable_ID v, int dividend, std::set<Variable_ID> &working_on) {
-// assert(dividend > 0);
-// if (v->kind() == Forall_Var || v->kind() == Exists_Var || v->kind() == Wildcard_Var)
-// return posInfinity;
-
-// working_on.insert(v);
-
-// Relation &r = const_cast<Relation &>(r_);
-// Conjunct *c = r.query_DNF()->single_conjunct();
-
-// for (EQ_Iterator ei(c->EQs()); ei; ei++) {
-// int coef = mod((*ei).get_coef(v), dividend);
-// if (coef != 1 && coef != dividend - 1 )
-// continue;
-
-// coef_t result = 0;
-// for (Constr_Vars_Iter cvi(*ei); cvi; cvi++)
-// if ((*cvi).var != v) {
-// int p = mod((*cvi).coef, dividend);
-
-// if (p == 0)
-// continue;
-
-// if (working_on.find((*cvi).var) != working_on.end()) {
-// result = posInfinity;
-// break;
-// }
-
-// coef_t q = mod_(r, (*cvi).var, dividend, working_on);
-// if (q == posInfinity) {
-// result = posInfinity;
-// break;
-// }
-// result += p * q;
-// }
-
-// if (result != posInfinity) {
-// result += (*ei).get_const();
-// if (coef == 1)
-// result = -result;
-// working_on.erase(v);
-
-// return mod(result, dividend);
-// }
-// }
-
-// working_on.erase(v);
-// return posInfinity;
-// }
-
-
-// coef_t mod(const Relation &r, Variable_ID v, int dividend) {
-// std::set<Variable_ID> working_on = std::set<Variable_ID>();
-
-// return mod_(r, v, dividend, working_on);
-// }
-
-
-
-//-----------------------------------------------------------------------------
-// Generate mapping relation for permuation.
-//-----------------------------------------------------------------------------
Relation permute_relation(const std::vector<int> &pi) {
const int n = pi.size();
@@ -2243,11 +1151,6 @@ Relation permute_relation(const std::vector<int> &pi) {
return r;
}
-
-
-//---------------------------------------------------------------------------
-// Find the position index variable in a Relation by name.
-//---------------------------------------------------------------------------
Variable_ID find_index(Relation &r, const std::string &s, char side) {
// Omega quirks: assure the names are propagated inside the relation
r.setup_names();
@@ -2280,33 +1183,3 @@ Variable_ID find_index(Relation &r, const std::string &s, char side) {
return NULL;
}
-// EQ_Handle get_eq(const Relation &r, int dim, Var_Kind type) {
-// Variable_ID v;
-// switch (type) {
-// case Set_Var:
-// v = r.set_var(dim+1);
-// break;
-// case Input_Var:
-// v = r.input_var(dim+1);
-// break;
-// case Output_Var:
-// v = r.output_var(dim+1);
-// break;
-// default:
-// return NULL;
-// }
-// for (DNF_iterator di(r.query_DNF()); di; di++)
-// for (EQ_Iterator ei = (*di)->EQs(); ei; ei++)
-// if ((*ei).get_coef(v) != 0)
-// return (*ei);
-
-// return NULL;
-// }
-
-
-// std::Pair<Relation, Relation> split_loop(const Relation &r, const Relation &cond) {
-// Relation r1 = Intersection(copy(r), copy(cond));
-// Relation r2 = Intersection(copy(r), Complement(copy(cond)));
-
-// return std::Pair<Relation, Relation>(r1, r2);
-// }
diff --git a/omegalib/code_gen/src/CG_roseRepr.cc b/omegalib/code_gen/src/CG_roseRepr.cc
index 99cf973..9265ab0 100644
--- a/omegalib/code_gen/src/CG_roseRepr.cc
+++ b/omegalib/code_gen/src/CG_roseRepr.cc
@@ -122,55 +122,4 @@ void CG_roseRepr::DumpFileHelper(SgNode* node, FILE *fp) const{
}
}
-/*void CG_roseRepr::DumpToFile(FILE *fp) const {
-// std::string x;
-SgNode* tnl = tnl_;
-SgExpression* op = op_ ;
-
-if(tnl!= NULL){
- std::string x = tnl->unparseToString();
- fprintf(fp, "%s", x.c_str());
-
-}
-else if(op != NULL){
- std::string x = isSgNode(op)->unparseToString();
- fprintf(fp, "%s", x.c_str());
-
-
-
-}
-}
-*/
-/*
-SgNode* CG_roseRepr::copyAST ( SgNode* node )
-{
-
-// This is a better implementation using a derived class from SgCopyHelp to control the
-// copying process (skipping the copy of any function definition). This is a variable
-// declaration with an explicitly declared class type.
-class RestrictedCopyType : public SgCopyHelp
- {
- // DQ (9/26/2005): This class demonstrates the use of the copy mechanism
- // within Sage III (originally designed and implemented by Qing Yi).
- // One problem with it is that there is no context information permitted.
-
- public:
- virtual SgNode *copyAst(const SgNode *n)
- {
- // This is the simpliest possible version of a deep copy SgCopyHelp::copyAst() member function.
- SgNode *returnValue = n->copy(*this);
-
- return returnValue;
- }
- } restrictedCopyType;
-
-
-
-
-// This triggers a bug with test2005_152.C (the unparsed code fails for g++ 4.1.2, but not 3.5.6)
-SgNode* copyOfNode = node->copy(restrictedCopyType);
-return copyOfNode;
-
-}
-*/
} // namespace