/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/polly/lib/External/isl/isl_dim_map.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2008-2009 Katholieke Universiteit Leuven |
3 | | * Copyright 2010-2011 INRIA Saclay |
4 | | * |
5 | | * Use of this software is governed by the MIT license |
6 | | * |
7 | | * Written by Sven Verdoolaege, K.U.Leuven, Departement |
8 | | * Computerwetenschappen, Celestijnenlaan 200A, B-3001 Leuven, Belgium |
9 | | * and INRIA Saclay - Ile-de-France, Parc Club Orsay Universite, |
10 | | * ZAC des vignes, 4 rue Jacques Monod, 91893 Orsay, France |
11 | | */ |
12 | | |
13 | | #include <isl_map_private.h> |
14 | | #include <isl_space_private.h> |
15 | | #include <isl_dim_map.h> |
16 | | #include <isl_reordering.h> |
17 | | |
18 | | struct isl_dim_map_entry { |
19 | | int pos; |
20 | | int sgn; |
21 | | }; |
22 | | |
23 | | /* Maps dst positions to src positions */ |
24 | | struct isl_dim_map { |
25 | | unsigned len; |
26 | | struct isl_dim_map_entry m[1]; |
27 | | }; |
28 | | |
29 | | __isl_give isl_dim_map *isl_dim_map_alloc(isl_ctx *ctx, unsigned len) |
30 | 654k | { |
31 | 654k | int i; |
32 | 654k | struct isl_dim_map *dim_map; |
33 | 654k | dim_map = isl_alloc(ctx, struct isl_dim_map, |
34 | 654k | sizeof(struct isl_dim_map) + len * sizeof(struct isl_dim_map_entry)); |
35 | 654k | if (!dim_map) |
36 | 0 | return NULL; |
37 | 654k | dim_map->len = 1 + len; |
38 | 654k | dim_map->m[0].pos = 0; |
39 | 654k | dim_map->m[0].sgn = 1; |
40 | 5.41M | for (i = 0; i < len; ++i4.75M ) |
41 | 4.75M | dim_map->m[1 + i].sgn = 0; |
42 | 654k | return dim_map; |
43 | 654k | } |
44 | | |
45 | | void isl_dim_map_range(__isl_keep isl_dim_map *dim_map, |
46 | | unsigned dst_pos, int dst_stride, unsigned src_pos, int src_stride, |
47 | | unsigned n, int sign) |
48 | 5.42k | { |
49 | 5.42k | int i; |
50 | 5.42k | |
51 | 5.42k | if (!dim_map) |
52 | 0 | return; |
53 | 5.42k | |
54 | 12.4k | for (i = 0; 5.42k i < n; ++i7.06k ) { |
55 | 7.06k | unsigned d = 1 + dst_pos + dst_stride * i; |
56 | 7.06k | unsigned s = 1 + src_pos + src_stride * i; |
57 | 7.06k | dim_map->m[d].pos = s; |
58 | 7.06k | dim_map->m[d].sgn = sign; |
59 | 7.06k | } |
60 | 5.42k | } |
61 | | |
62 | | void isl_dim_map_dim_range(__isl_keep isl_dim_map *dim_map, |
63 | | __isl_keep isl_space *dim, enum isl_dim_type type, |
64 | | unsigned first, unsigned n, unsigned dst_pos) |
65 | 1.56M | { |
66 | 1.56M | int i; |
67 | 1.56M | unsigned src_pos; |
68 | 1.56M | |
69 | 1.56M | if (!dim_map || !dim) |
70 | 0 | return; |
71 | 1.56M | |
72 | 1.56M | src_pos = 1 + isl_space_offset(dim, type); |
73 | 4.31M | for (i = 0; i < n; ++i2.74M ) { |
74 | 2.74M | dim_map->m[1 + dst_pos + i].pos = src_pos + first + i; |
75 | 2.74M | dim_map->m[1 + dst_pos + i].sgn = 1; |
76 | 2.74M | } |
77 | 1.56M | } |
78 | | |
79 | | void isl_dim_map_dim(__isl_keep isl_dim_map *dim_map, __isl_keep isl_space *dim, |
80 | | enum isl_dim_type type, unsigned dst_pos) |
81 | 1.34M | { |
82 | 1.34M | isl_dim_map_dim_range(dim_map, dim, type, |
83 | 1.34M | 0, isl_space_dim(dim, type), dst_pos); |
84 | 1.34M | } |
85 | | |
86 | | void isl_dim_map_div(__isl_keep isl_dim_map *dim_map, |
87 | | __isl_keep isl_basic_map *bmap, unsigned dst_pos) |
88 | 480k | { |
89 | 480k | int i; |
90 | 480k | unsigned src_pos; |
91 | 480k | |
92 | 480k | if (!dim_map || !bmap) |
93 | 0 | return; |
94 | 480k | |
95 | 480k | src_pos = 1 + isl_space_dim(bmap->dim, isl_dim_all); |
96 | 517k | for (i = 0; i < bmap->n_div; ++i36.3k ) { |
97 | 36.3k | dim_map->m[1 + dst_pos + i].pos = src_pos + i; |
98 | 36.3k | dim_map->m[1 + dst_pos + i].sgn = 1; |
99 | 36.3k | } |
100 | 480k | } |
101 | | |
102 | | void isl_dim_map_dump(struct isl_dim_map *dim_map) |
103 | 0 | { |
104 | 0 | int i; |
105 | 0 |
|
106 | 0 | for (i = 0; i < dim_map->len; ++i) |
107 | 0 | fprintf(stderr, "%d -> %d * %d; ", i, |
108 | 0 | dim_map->m[i].sgn, dim_map->m[i].pos); |
109 | 0 | fprintf(stderr, "\n"); |
110 | 0 | } |
111 | | |
112 | | static void copy_constraint_dim_map(isl_int *dst, isl_int *src, |
113 | | struct isl_dim_map *dim_map) |
114 | 1.95M | { |
115 | 1.95M | int i; |
116 | 1.95M | |
117 | 26.3M | for (i = 0; i < dim_map->len; ++i24.3M ) { |
118 | 24.3M | if (dim_map->m[i].sgn == 0) |
119 | 24.3M | isl_int_set_si4.56M (dst[i], 0); |
120 | 24.3M | else if (19.8M dim_map->m[i].sgn > 019.8M ) |
121 | 19.8M | isl_int_set19.8M (dst[i], src[dim_map->m[i].pos]); |
122 | 19.8M | else |
123 | 19.8M | isl_int_neg10.9k (dst[i], src[dim_map->m[i].pos]); |
124 | 24.3M | } |
125 | 1.95M | } |
126 | | |
127 | | static void copy_div_dim_map(isl_int *dst, isl_int *src, |
128 | | struct isl_dim_map *dim_map) |
129 | 37.4k | { |
130 | 37.4k | isl_int_set(dst[0], src[0]); |
131 | 37.4k | copy_constraint_dim_map(dst+1, src+1, dim_map); |
132 | 37.4k | } |
133 | | |
134 | | __isl_give isl_basic_map *isl_basic_map_add_constraints_dim_map( |
135 | | __isl_take isl_basic_map *dst, __isl_take isl_basic_map *src, |
136 | | __isl_take isl_dim_map *dim_map) |
137 | 559k | { |
138 | 559k | int i; |
139 | 559k | |
140 | 559k | if (!src || !dst || !dim_map) |
141 | 0 | goto error; |
142 | 559k | |
143 | 1.46M | for (i = 0; 559k i < src->n_eq; ++i905k ) { |
144 | 905k | int i1 = isl_basic_map_alloc_equality(dst); |
145 | 905k | if (i1 < 0) |
146 | 0 | goto error; |
147 | 905k | copy_constraint_dim_map(dst->eq[i1], src->eq[i], dim_map); |
148 | 905k | } |
149 | 559k | |
150 | 1.56M | for (i = 0; 559k i < src->n_ineq; ++i1.00M ) { |
151 | 1.00M | int i1 = isl_basic_map_alloc_inequality(dst); |
152 | 1.00M | if (i1 < 0) |
153 | 0 | goto error; |
154 | 1.00M | copy_constraint_dim_map(dst->ineq[i1], src->ineq[i], dim_map); |
155 | 1.00M | } |
156 | 559k | |
157 | 597k | for (i = 0; 559k i < src->n_div; ++i37.4k ) { |
158 | 37.4k | int i1 = isl_basic_map_alloc_div(dst); |
159 | 37.4k | if (i1 < 0) |
160 | 0 | goto error; |
161 | 37.4k | copy_div_dim_map(dst->div[i1], src->div[i], dim_map); |
162 | 37.4k | } |
163 | 559k | |
164 | 559k | free(dim_map); |
165 | 559k | isl_basic_map_free(src); |
166 | 559k | |
167 | 559k | return dst; |
168 | 0 | error: |
169 | 0 | free(dim_map); |
170 | 0 | isl_basic_map_free(src); |
171 | 0 | isl_basic_map_free(dst); |
172 | 0 | return NULL; |
173 | 559k | } |
174 | | |
175 | | __isl_give isl_basic_set *isl_basic_set_add_constraints_dim_map( |
176 | | __isl_take isl_basic_set *dst, __isl_take isl_basic_set *src, |
177 | | __isl_take isl_dim_map *dim_map) |
178 | 1.02k | { |
179 | 1.02k | return isl_basic_map_add_constraints_dim_map(dst, src, dim_map); |
180 | 1.02k | } |
181 | | |
182 | | /* Extend the given dim_map with mappings for the divs in bmap. |
183 | | */ |
184 | | __isl_give isl_dim_map *isl_dim_map_extend(__isl_keep isl_dim_map *dim_map, |
185 | | __isl_keep isl_basic_map *bmap) |
186 | 87.3k | { |
187 | 87.3k | int i; |
188 | 87.3k | struct isl_dim_map *res; |
189 | 87.3k | int offset; |
190 | 87.3k | |
191 | 87.3k | if (!dim_map) |
192 | 0 | return NULL; |
193 | 87.3k | |
194 | 87.3k | offset = isl_basic_map_offset(bmap, isl_dim_div); |
195 | 87.3k | |
196 | 87.3k | res = isl_dim_map_alloc(bmap->ctx, dim_map->len - 1 + bmap->n_div); |
197 | 87.3k | if (!res) |
198 | 0 | return NULL; |
199 | 87.3k | |
200 | 737k | for (i = 0; 87.3k i < dim_map->len; ++i650k ) |
201 | 650k | res->m[i] = dim_map->m[i]; |
202 | 88.5k | for (i = 0; i < bmap->n_div; ++i1.16k ) { |
203 | 1.16k | res->m[dim_map->len + i].pos = offset + i; |
204 | 1.16k | res->m[dim_map->len + i].sgn = 1; |
205 | 1.16k | } |
206 | 87.3k | |
207 | 87.3k | return res; |
208 | 87.3k | } |
209 | | |
210 | | /* Extract a dim_map from a reordering. |
211 | | * We essentially need to reverse the mapping, and add an offset |
212 | | * of 1 for the constant term. |
213 | | */ |
214 | | __isl_give isl_dim_map *isl_dim_map_from_reordering( |
215 | | __isl_keep isl_reordering *exp) |
216 | 85.6k | { |
217 | 85.6k | int i; |
218 | 85.6k | isl_ctx *ctx; |
219 | 85.6k | isl_space *space; |
220 | 85.6k | struct isl_dim_map *dim_map; |
221 | 85.6k | |
222 | 85.6k | if (!exp) |
223 | 0 | return NULL; |
224 | 85.6k | |
225 | 85.6k | ctx = isl_reordering_get_ctx(exp); |
226 | 85.6k | space = isl_reordering_peek_space(exp); |
227 | 85.6k | dim_map = isl_dim_map_alloc(ctx, isl_space_dim(space, isl_dim_all)); |
228 | 85.6k | if (!dim_map) |
229 | 0 | return NULL; |
230 | 85.6k | |
231 | 422k | for (i = 0; 85.6k i < exp->len; ++i337k ) { |
232 | 337k | dim_map->m[1 + exp->pos[i]].pos = 1 + i; |
233 | 337k | dim_map->m[1 + exp->pos[i]].sgn = 1; |
234 | 337k | } |
235 | 85.6k | |
236 | 85.6k | return dim_map; |
237 | 85.6k | } |