/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/polly/lib/External/isl/isl_seq.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2008-2009 Katholieke Universiteit Leuven |
3 | | * Copyright 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 | | */ |
10 | | |
11 | | #include <isl_ctx_private.h> |
12 | | #include <isl_seq.h> |
13 | | |
14 | | void isl_seq_clr(isl_int *p, unsigned len) |
15 | 145M | { |
16 | 145M | int i; |
17 | 411M | for (i = 0; i < len; ++i265M ) |
18 | 265M | isl_int_set_si(p[i], 0); |
19 | 145M | } |
20 | | |
21 | | void isl_seq_set_si(isl_int *p, int v, unsigned len) |
22 | 1.75k | { |
23 | 1.75k | int i; |
24 | 2.70k | for (i = 0; i < len; ++i941 ) |
25 | 1.75k | isl_int_set_si941 (p[i], v); |
26 | 1.75k | } |
27 | | |
28 | | void isl_seq_set(isl_int *p, isl_int v, unsigned len) |
29 | 10 | { |
30 | 10 | int i; |
31 | 22 | for (i = 0; i < len; ++i12 ) |
32 | 12 | isl_int_set(p[i], v); |
33 | 10 | } |
34 | | |
35 | | void isl_seq_neg(isl_int *dst, isl_int *src, unsigned len) |
36 | 38.6M | { |
37 | 38.6M | int i; |
38 | 382M | for (i = 0; i < len; ++i343M ) |
39 | 343M | isl_int_neg(dst[i], src[i]); |
40 | 38.6M | } |
41 | | |
42 | | void isl_seq_cpy(isl_int *dst, isl_int *src, unsigned len) |
43 | 114M | { |
44 | 114M | int i; |
45 | 924M | for (i = 0; i < len; ++i809M ) |
46 | 809M | isl_int_set(dst[i], src[i]); |
47 | 114M | } |
48 | | |
49 | | void isl_seq_submul(isl_int *dst, isl_int f, isl_int *src, unsigned len) |
50 | 12.6k | { |
51 | 12.6k | int i; |
52 | 131k | for (i = 0; i < len; ++i118k ) |
53 | 118k | isl_int_submul(dst[i], f, src[i]); |
54 | 12.6k | } |
55 | | |
56 | | void isl_seq_addmul(isl_int *dst, isl_int f, isl_int *src, unsigned len) |
57 | 66.1k | { |
58 | 66.1k | int i; |
59 | 349k | for (i = 0; i < len; ++i283k ) |
60 | 283k | isl_int_addmul(dst[i], f, src[i]); |
61 | 66.1k | } |
62 | | |
63 | | void isl_seq_swp_or_cpy(isl_int *dst, isl_int *src, unsigned len) |
64 | 6.31M | { |
65 | 6.31M | int i; |
66 | 56.2M | for (i = 0; i < len; ++i49.9M ) |
67 | 49.9M | isl_int_swap_or_set(dst[i], src[i]); |
68 | 6.31M | } |
69 | | |
70 | | void isl_seq_scale(isl_int *dst, isl_int *src, isl_int m, unsigned len) |
71 | 11.6M | { |
72 | 11.6M | int i; |
73 | 37.6M | for (i = 0; i < len; ++i25.9M ) |
74 | 25.9M | isl_int_mul(dst[i], src[i], m); |
75 | 11.6M | } |
76 | | |
77 | | void isl_seq_scale_down(isl_int *dst, isl_int *src, isl_int m, unsigned len) |
78 | 5.96M | { |
79 | 5.96M | int i; |
80 | 72.5M | for (i = 0; i < len; ++i66.5M ) |
81 | 66.5M | isl_int_divexact(dst[i], src[i], m); |
82 | 5.96M | } |
83 | | |
84 | | void isl_seq_cdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len) |
85 | 3.96k | { |
86 | 3.96k | int i; |
87 | 17.0k | for (i = 0; i < len; ++i13.0k ) |
88 | 13.0k | isl_int_cdiv_q(dst[i], src[i], m); |
89 | 3.96k | } |
90 | | |
91 | | void isl_seq_fdiv_q(isl_int *dst, isl_int *src, isl_int m, unsigned len) |
92 | 117 | { |
93 | 117 | int i; |
94 | 877 | for (i = 0; i < len; ++i760 ) |
95 | 760 | isl_int_fdiv_q(dst[i], src[i], m); |
96 | 117 | } |
97 | | |
98 | | void isl_seq_fdiv_r(isl_int *dst, isl_int *src, isl_int m, unsigned len) |
99 | 824 | { |
100 | 824 | int i; |
101 | 5.53k | for (i = 0; i < len; ++i4.71k ) |
102 | 4.71k | isl_int_fdiv_r(dst[i], src[i], m); |
103 | 824 | } |
104 | | |
105 | | void isl_seq_combine(isl_int *dst, isl_int m1, isl_int *src1, |
106 | | isl_int m2, isl_int *src2, unsigned len) |
107 | 32.0M | { |
108 | 32.0M | int i; |
109 | 32.0M | isl_int tmp; |
110 | 32.0M | |
111 | 32.0M | if (dst == src1 && isl_int_is_one31.9M (m1)) { |
112 | 28.9M | if (isl_int_is_zero(m2)) |
113 | 28.9M | return17.9M ; |
114 | 88.4M | for (i = 0; 11.0M i < len; ++i77.4M ) |
115 | 77.4M | isl_int_addmul(src1[i], m2, src2[i]); |
116 | 11.0M | return; |
117 | 11.0M | } |
118 | 3.11M | |
119 | 3.11M | isl_int_init(tmp); |
120 | 31.3M | for (i = 0; i < len; ++i28.2M ) { |
121 | 28.2M | isl_int_mul(tmp, m1, src1[i]); |
122 | 28.2M | isl_int_addmul(tmp, m2, src2[i]); |
123 | 28.2M | isl_int_set(dst[i], tmp); |
124 | 28.2M | } |
125 | 3.11M | isl_int_clear(tmp); |
126 | 3.11M | } |
127 | | |
128 | | /* |
129 | | * Let d = dst[pos] and s = src[pos] |
130 | | * dst is replaced by |s| dst - sgn(s)d src |
131 | | */ |
132 | | void isl_seq_elim(isl_int *dst, isl_int *src, unsigned pos, unsigned len, |
133 | | isl_int *m) |
134 | 3.91M | { |
135 | 3.91M | isl_int a; |
136 | 3.91M | isl_int b; |
137 | 3.91M | |
138 | 3.91M | if (isl_int_is_zero(dst[pos])) |
139 | 3.91M | return5.20k ; |
140 | 3.90M | |
141 | 3.90M | isl_int_init(a); |
142 | 3.90M | isl_int_init(b); |
143 | 3.90M | |
144 | 3.90M | isl_int_gcd(a, src[pos], dst[pos]); |
145 | 3.90M | isl_int_divexact(b, dst[pos], a); |
146 | 3.90M | if (isl_int_is_pos(src[pos])) |
147 | 3.90M | isl_int_neg3.72M (b, b); |
148 | 3.90M | isl_int_divexact(a, src[pos], a); |
149 | 3.90M | isl_int_abs(a, a); |
150 | 3.90M | isl_seq_combine(dst, a, dst, b, src, len); |
151 | 3.90M | |
152 | 3.90M | if (m) |
153 | 3.90M | isl_int_mul22.3k (*m, *m, a); |
154 | 3.90M | |
155 | 3.90M | isl_int_clear(a); |
156 | 3.90M | isl_int_clear(b); |
157 | 3.90M | } |
158 | | |
159 | | int isl_seq_eq(isl_int *p1, isl_int *p2, unsigned len) |
160 | 33.7M | { |
161 | 33.7M | int i; |
162 | 227M | for (i = 0; i < len; ++i193M ) |
163 | 209M | if (isl_int_ne(p1[i], p2[i])) |
164 | 209M | return 016.6M ; |
165 | 33.7M | return 117.1M ; |
166 | 33.7M | } |
167 | | |
168 | | int isl_seq_cmp(isl_int *p1, isl_int *p2, unsigned len) |
169 | 3.57M | { |
170 | 3.57M | int i; |
171 | 3.57M | int cmp; |
172 | 27.6M | for (i = 0; i < len; ++i24.0M ) |
173 | 26.0M | if ((cmp = isl_int_cmp(p1[i], p2[i])) != 0) |
174 | 1.94M | return cmp; |
175 | 3.57M | return 01.62M ; |
176 | 3.57M | } |
177 | | |
178 | | int isl_seq_is_neg(isl_int *p1, isl_int *p2, unsigned len) |
179 | 1.14M | { |
180 | 1.14M | int i; |
181 | 1.14M | |
182 | 7.50M | for (i = 0; i < len; ++i6.36M ) { |
183 | 7.04M | if (isl_int_abs_ne(p1[i], p2[i])) |
184 | 7.04M | return 039.1k ; |
185 | 7.00M | if (isl_int_is_zero(p1[i])) |
186 | 7.00M | continue5.85M ; |
187 | 1.15M | if (isl_int_eq(p1[i], p2[i])) |
188 | 1.15M | return 0639k ; |
189 | 1.15M | } |
190 | 1.14M | return 1466k ; |
191 | 1.14M | } |
192 | | |
193 | | int isl_seq_first_non_zero(isl_int *p, unsigned len) |
194 | 83.4M | { |
195 | 83.4M | int i; |
196 | 83.4M | |
197 | 405M | for (i = 0; i < len; ++i321M ) |
198 | 386M | if (!isl_int_is_zero(p[i])) |
199 | 386M | return i64.2M ; |
200 | 83.4M | return -119.2M ; |
201 | 83.4M | } |
202 | | |
203 | | int isl_seq_last_non_zero(isl_int *p, unsigned len) |
204 | 20.7M | { |
205 | 20.7M | int i; |
206 | 20.7M | |
207 | 100M | for (i = len - 1; i >= 0; --i79.2M ) |
208 | 91.3M | if (!isl_int_is_zero(p[i])) |
209 | 91.3M | return i12.0M ; |
210 | 20.7M | return -18.63M ; |
211 | 20.7M | } |
212 | | |
213 | | void isl_seq_abs_max(isl_int *p, unsigned len, isl_int *max) |
214 | 29.9k | { |
215 | 29.9k | int i; |
216 | 29.9k | |
217 | 29.9k | isl_int_set_si(*max, 0); |
218 | 29.9k | |
219 | 265k | for (i = 0; i < len; ++i235k ) |
220 | 235k | if (isl_int_abs_gt(p[i], *max)) |
221 | 235k | isl_int_abs30.7k (*max, p[i]); |
222 | 29.9k | } |
223 | | |
224 | | int isl_seq_abs_min_non_zero(isl_int *p, unsigned len) |
225 | 58.7M | { |
226 | 58.7M | int i, min = isl_seq_first_non_zero(p, len); |
227 | 58.7M | if (min < 0) |
228 | 4.05M | return -1; |
229 | 406M | for (i = min + 1; 54.7M i < len; ++i351M ) { |
230 | 351M | if (isl_int_is_zero(p[i])) |
231 | 351M | continue290M ; |
232 | 60.8M | if (isl_int_abs_lt(p[i], p[min])) |
233 | 60.8M | min = i12.7M ; |
234 | 60.8M | } |
235 | 54.7M | return min; |
236 | 54.7M | } |
237 | | |
238 | | void isl_seq_gcd(isl_int *p, unsigned len, isl_int *gcd) |
239 | 55.1M | { |
240 | 55.1M | int i, min = isl_seq_abs_min_non_zero(p, len); |
241 | 55.1M | |
242 | 55.1M | if (min < 0) { |
243 | 3.31M | isl_int_set_si(*gcd, 0); |
244 | 3.31M | return; |
245 | 3.31M | } |
246 | 51.8M | isl_int_abs(*gcd, p[min]); |
247 | 121M | for (i = 0; isl_int_cmp_si(*gcd, 1) > 0 && i < len75.5M ; ++i69.4M ) { |
248 | 69.4M | if (i == min) |
249 | 6.52M | continue; |
250 | 62.8M | if (isl_int_is_zero(p[i])) |
251 | 62.8M | continue44.8M ; |
252 | 18.0M | isl_int_gcd(*gcd, *gcd, p[i]); |
253 | 18.0M | } |
254 | 51.8M | } |
255 | | |
256 | | void isl_seq_normalize(struct isl_ctx *ctx, isl_int *p, unsigned len) |
257 | 22.8M | { |
258 | 22.8M | if (len == 0) |
259 | 0 | return; |
260 | 22.8M | isl_seq_gcd(p, len, &ctx->normalize_gcd); |
261 | 22.8M | if (!isl_int_is_zero(ctx->normalize_gcd) && |
262 | 22.8M | !21.3M isl_int_is_one21.3M (ctx->normalize_gcd)) |
263 | 22.8M | isl_seq_scale_down(p, p, ctx->normalize_gcd, len)5.71M ; |
264 | 22.8M | } |
265 | | |
266 | | void isl_seq_lcm(isl_int *p, unsigned len, isl_int *lcm) |
267 | 3.94k | { |
268 | 3.94k | int i; |
269 | 3.94k | |
270 | 3.94k | if (len == 0) { |
271 | 0 | isl_int_set_si(*lcm, 1); |
272 | 0 | return; |
273 | 0 | } |
274 | 3.94k | isl_int_set(*lcm, p[0]); |
275 | 8.50k | for (i = 1; i < len; ++i4.55k ) |
276 | 4.55k | isl_int_lcm(*lcm, *lcm, p[i]); |
277 | 3.94k | } |
278 | | |
279 | | void isl_seq_inner_product(isl_int *p1, isl_int *p2, unsigned len, |
280 | | isl_int *prod) |
281 | 21.3M | { |
282 | 21.3M | int i; |
283 | 21.3M | if (len == 0) { |
284 | 0 | isl_int_set_si(*prod, 0); |
285 | 0 | return; |
286 | 0 | } |
287 | 21.3M | isl_int_mul(*prod, p1[0], p2[0]); |
288 | 162M | for (i = 1; i < len; ++i140M ) |
289 | 140M | isl_int_addmul(*prod, p1[i], p2[i]); |
290 | 21.3M | } |
291 | | |
292 | | uint32_t isl_seq_hash(isl_int *p, unsigned len, uint32_t hash) |
293 | 42.4M | { |
294 | 42.4M | int i; |
295 | 419M | for (i = 0; i < len; ++i377M ) { |
296 | 377M | if (isl_int_is_zero(p[i])) |
297 | 377M | continue325M ; |
298 | 51.9M | hash *= 16777619; |
299 | 51.9M | hash ^= (i & 0xFF); |
300 | 51.9M | hash = isl_int_hash(p[i], hash); |
301 | 51.9M | } |
302 | 42.4M | return hash; |
303 | 42.4M | } |
304 | | |
305 | | /* Given two affine expressions "p" of length p_len (including the |
306 | | * denominator and the constant term) and "subs" of length subs_len, |
307 | | * plug in "subs" for the variable at position "pos". |
308 | | * The variables of "subs" and "p" are assumed to match up to subs_len, |
309 | | * but "p" may have additional variables. |
310 | | * "v" is an initialized isl_int that can be used internally. |
311 | | * |
312 | | * In particular, if "p" represents the expression |
313 | | * |
314 | | * (a i + g)/m |
315 | | * |
316 | | * with i the variable at position "pos" and "subs" represents the expression |
317 | | * |
318 | | * f/d |
319 | | * |
320 | | * then the result represents the expression |
321 | | * |
322 | | * (a f + d g)/(m d) |
323 | | * |
324 | | */ |
325 | | void isl_seq_substitute(isl_int *p, int pos, isl_int *subs, |
326 | | int p_len, int subs_len, isl_int v) |
327 | 2.18k | { |
328 | 2.18k | isl_int_set(v, p[1 + pos]); |
329 | 2.18k | isl_int_set_si(p[1 + pos], 0); |
330 | 2.18k | isl_seq_combine(p + 1, subs[0], p + 1, v, subs + 1, subs_len - 1); |
331 | 2.18k | isl_seq_scale(p + subs_len, p + subs_len, subs[0], p_len - subs_len); |
332 | 2.18k | isl_int_mul(p[0], p[0], subs[0]); |
333 | 2.18k | } |
334 | | |
335 | | uint32_t isl_seq_get_hash(isl_int *p, unsigned len) |
336 | 42.4M | { |
337 | 42.4M | uint32_t hash = isl_hash_init(); |
338 | 42.4M | |
339 | 42.4M | return isl_seq_hash(p, len, hash); |
340 | 42.4M | } |
341 | | |
342 | | uint32_t isl_seq_get_hash_bits(isl_int *p, unsigned len, unsigned bits) |
343 | 40.5M | { |
344 | 40.5M | uint32_t hash; |
345 | 40.5M | |
346 | 40.5M | hash = isl_seq_get_hash(p, len); |
347 | 40.5M | return isl_hash_bits(hash, bits); |
348 | 40.5M | } |
349 | | |
350 | | void isl_seq_dump(isl_int *p, unsigned len) |
351 | 0 | { |
352 | 0 | int i; |
353 | 0 |
|
354 | 0 | for (i = 0; i < len; ++i) { |
355 | 0 | if (i) |
356 | 0 | fprintf(stderr, " "); |
357 | 0 | isl_int_print(stderr, p[i], 0); |
358 | 0 | } |
359 | 0 | fprintf(stderr, "\n"); |
360 | 0 | } |