summaryrefslogtreecommitdiff
path: root/include/omegatools.hh
blob: b51b2bdc62c9bf272e3112799d71e477045e370c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#ifndef OMEGATOOLS_HH
#define OMEGATOOLS_HH

/*!
 * \file
 * \brief Useful tools involving Omega manipulation.
 */

#include <string>
#include <omega.h>
#include "dep.hh"
#include "ir_code.hh"

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);

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);
/*!
 * 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);

enum LexicalOrderType {LEX_MATCH, LEX_BEFORE, LEX_AFTER, LEX_UNKNOWN};

#endif