break up access relations into may_read/may_write/must_write in interface
[pet.git] / expr.h
blob199e991669d5d61690d2a08f0248b0003f0360fb
1 #ifndef PET_EXPR_H
2 #define PET_EXPR_H
4 #include <pet.h>
6 #include "context.h"
8 #if defined(__cplusplus)
9 extern "C" {
10 #endif
12 /* d is valid when type == pet_expr_double
13 * i isl valid when type == pet_expr_int
14 * acc is valid when type == pet_expr_access
15 * name is valid when type == pet_expr_call
16 * type is valid when type == pet_expr_cast
17 * op is valid otherwise
19 * If type_size is not zero, then the expression is of an integer type
20 * and type_size represents the size of the type in bits.
21 * If type_size is greater than zero, then the type is unsigned
22 * and the number of bits is equal to type_size.
23 * If type_size is less than zero, then the type is signed
24 * and the number of bits is equal to -type_size.
25 * type_size may also be zero if the size is (still) unknown.
27 * For each access expression inside the body of a statement, acc.ref_id
28 * is a unique reference identifier.
29 * acc.index represents the index expression, while acc.access
30 * represents the corresponding access relation.
31 * The output dimension of the index expression may be smaller
32 * than the number of dimensions of the accessed array (recorded
33 * in acc.depth).
34 * The target space of the access relation, on the other hand,
35 * is equal to the array space.
36 * acc.access may be NULL if it can be derived directly from
37 * acc.index and acc.depth in construct_access_relation.
38 * That is, acc.access may be NULL if there are no additional
39 * constraints on the access relations.
40 * Both acc.index and acc.access usually map an iteration space
41 * to a (partial) data space.
42 * If the access has arguments, however, then the domain of the
43 * mapping is a wrapped mapping from the iteration space
44 * to a space of dimensionality equal to the number of arguments.
45 * Each dimension in this space corresponds to the value of the
46 * corresponding argument.
48 * The ranges of the index expressions and access relations may
49 * also be wrapped relations, in which case the expression represents
50 * a member access, with the structure represented by the domain
51 * of this wrapped relation and the member represented by the range.
52 * In case of nested member accesses, the domain is itself a wrapped
53 * relation.
55 * If the data space is unnamed (and 1D), then it represents
56 * the set of integers. That is, the access represents a value that
57 * is equal to the index.
59 * A double is represented as both an (approximate) value "val" and
60 * a string representation "s".
62 struct pet_expr {
63 int ref;
64 isl_ctx *ctx;
66 enum pet_expr_type type;
68 int type_size;
70 unsigned n_arg;
71 pet_expr **args;
73 union {
74 struct {
75 isl_id *ref_id;
76 isl_map *access;
77 isl_multi_pw_aff *index;
78 int depth;
79 int read;
80 int write;
81 } acc;
82 enum pet_op_type op;
83 char *name;
84 char *type_name;
85 struct {
86 double val;
87 char *s;
88 } d;
89 isl_val *i;
93 const char *pet_type_str(enum pet_expr_type type);
94 enum pet_expr_type pet_str_type(const char *str);
96 enum pet_op_type pet_str_op(const char *str);
98 __isl_give pet_expr *pet_expr_alloc(isl_ctx *ctx, enum pet_expr_type type);
99 __isl_give pet_expr *pet_expr_from_access_and_index(__isl_take isl_map *access,
100 __isl_take isl_multi_pw_aff *index);
101 __isl_give pet_expr *pet_expr_kill_from_access_and_index(
102 __isl_take isl_map *access, __isl_take isl_multi_pw_aff *index);
103 __isl_give pet_expr *pet_expr_new_unary(enum pet_op_type op,
104 __isl_take pet_expr *arg);
105 __isl_give pet_expr *pet_expr_new_binary(int type_size, enum pet_op_type op,
106 __isl_take pet_expr *lhs, __isl_take pet_expr *rhs);
107 __isl_give pet_expr *pet_expr_new_ternary(__isl_take pet_expr *cond,
108 __isl_take pet_expr *lhs, __isl_take pet_expr *rhs);
109 __isl_give pet_expr *pet_expr_new_call(isl_ctx *ctx, const char *name,
110 unsigned n_arg);
111 __isl_give pet_expr *pet_expr_new_cast(const char *type_name,
112 __isl_take pet_expr *arg);
113 __isl_give pet_expr *pet_expr_new_double(isl_ctx *ctx, double d, const char *s);
114 __isl_give pet_expr *pet_expr_new_int(__isl_take isl_val *v);
116 __isl_give pet_expr *pet_expr_cow(__isl_take pet_expr *expr);
118 __isl_give isl_pw_aff *pet_expr_extract_affine_condition(
119 __isl_keep pet_expr *expr, __isl_keep pet_context *pc);
120 __isl_give isl_pw_aff *pet_expr_extract_comparison(enum pet_op_type op,
121 __isl_keep pet_expr *lhs, __isl_keep pet_expr *rhs,
122 __isl_keep pet_context *pc);
123 __isl_give pet_expr *pet_expr_resolve_assume(__isl_take pet_expr *expr,
124 __isl_keep pet_context *pc);
126 int pet_expr_is_assume(__isl_keep pet_expr *expr);
127 int pet_expr_is_boolean(__isl_keep pet_expr *expr);
128 int pet_expr_is_comparison(__isl_keep pet_expr *expr);
129 int pet_expr_is_min(__isl_keep pet_expr *expr);
130 int pet_expr_is_max(__isl_keep pet_expr *expr);
131 int pet_expr_is_scalar_access(__isl_keep pet_expr *expr);
132 int pet_expr_is_equal(__isl_keep pet_expr *expr1, __isl_keep pet_expr *expr2);
134 __isl_give isl_space *pet_expr_access_get_parameter_space(
135 __isl_take pet_expr *expr);
136 __isl_give isl_space *pet_expr_access_get_domain_space(
137 __isl_keep pet_expr *expr);
138 __isl_give isl_space *pet_expr_access_get_data_space(__isl_keep pet_expr *expr);
140 __isl_give isl_map *pet_expr_access_get_may_access(__isl_keep pet_expr *expr);
142 __isl_give pet_expr *pet_expr_map_access(__isl_take pet_expr *expr,
143 __isl_give pet_expr *(*fn)(__isl_take pet_expr *expr, void *user),
144 void *user);
146 __isl_give pet_expr *pet_expr_access_set_access(__isl_take pet_expr *expr,
147 __isl_take isl_map *access);
148 __isl_give pet_expr *pet_expr_access_set_index(__isl_take pet_expr *expr,
149 __isl_take isl_multi_pw_aff *index);
151 int pet_expr_is_sub_access(__isl_keep pet_expr *expr1,
152 __isl_keep pet_expr *expr2, int n_arg);
154 int pet_expr_writes(__isl_keep pet_expr *expr, __isl_keep isl_id *id);
156 __isl_give pet_expr *pet_expr_access_move_dims(__isl_take pet_expr *expr,
157 enum isl_dim_type dst_type, unsigned dst_pos,
158 enum isl_dim_type src_type, unsigned src_pos, unsigned n);
159 __isl_give pet_expr *pet_expr_access_pullback_multi_aff(
160 __isl_take pet_expr *expr, __isl_take isl_multi_aff *ma);
161 __isl_give pet_expr *pet_expr_access_pullback_multi_pw_aff(
162 __isl_take pet_expr *expr, __isl_take isl_multi_pw_aff *mpa);
163 __isl_give pet_expr *pet_expr_access_align_params(__isl_take pet_expr *expr);
164 __isl_give pet_expr *pet_expr_restrict(__isl_take pet_expr *expr,
165 __isl_take isl_set *cond);
166 __isl_give pet_expr *pet_expr_access_update_domain(__isl_take pet_expr *expr,
167 __isl_keep isl_multi_pw_aff *update);
168 __isl_give pet_expr *pet_expr_update_domain(__isl_take pet_expr *expr,
169 __isl_take isl_multi_pw_aff *update);
170 __isl_give pet_expr *pet_expr_align_params(__isl_take pet_expr *expr,
171 __isl_take isl_space *space);
172 __isl_give pet_expr *pet_expr_filter(__isl_take pet_expr *expr,
173 __isl_take isl_multi_pw_aff *test, int satisfied);
174 __isl_give pet_expr *pet_expr_add_ref_ids(__isl_take pet_expr *expr,
175 int *n_ref);
176 __isl_give pet_expr *pet_expr_anonymize(__isl_take pet_expr *expr);
177 __isl_give pet_expr *pet_expr_gist(__isl_take pet_expr *expr,
178 __isl_keep isl_set *context, __isl_keep isl_union_map *value_bounds);
180 __isl_give isl_union_map *pet_expr_tag_access(__isl_keep pet_expr *expr,
181 __isl_take isl_union_map *access);
183 __isl_give pet_expr *pet_expr_access_subscript(__isl_take pet_expr *base,
184 __isl_take pet_expr *index);
185 __isl_give pet_expr *pet_expr_access_member(__isl_take pet_expr *base,
186 __isl_take isl_id *member);
188 int pet_expr_get_type_size(__isl_keep pet_expr *expr);
189 __isl_give pet_expr *pet_expr_set_type_size(__isl_take pet_expr *expr,
190 int type_size);
191 __isl_give pet_expr *pet_expr_access_set_depth(__isl_take pet_expr *expr,
192 int depth);
194 __isl_give pet_expr *pet_expr_insert_domain(__isl_take pet_expr *expr,
195 __isl_take isl_space *space);
197 void pet_expr_dump_with_indent(__isl_keep pet_expr *expr, int indent);
199 #if defined(__cplusplus)
201 #endif
203 #endif