]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/tree-affine.c
Fix missed IPA-CP on by-ref argument directly passed through (PR 93429)
[thirdparty/gcc.git] / gcc / tree-affine.c
1 /* Operations with affine combinations of trees.
2 Copyright (C) 2005-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 3, or (at your option) any
9 later version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "ssa.h"
28 #include "tree-pretty-print.h"
29 #include "fold-const.h"
30 #include "tree-affine.h"
31 #include "gimplify.h"
32 #include "dumpfile.h"
33 #include "cfgexpand.h"
34
35 /* Extends CST as appropriate for the affine combinations COMB. */
36
37 static widest_int
38 wide_int_ext_for_comb (const widest_int &cst, tree type)
39 {
40 return wi::sext (cst, TYPE_PRECISION (type));
41 }
42
43 /* Likewise for polynomial offsets. */
44
45 static poly_widest_int
46 wide_int_ext_for_comb (const poly_widest_int &cst, tree type)
47 {
48 return wi::sext (cst, TYPE_PRECISION (type));
49 }
50
51 /* Initializes affine combination COMB so that its value is zero in TYPE. */
52
53 static void
54 aff_combination_zero (aff_tree *comb, tree type)
55 {
56 int i;
57 comb->type = type;
58 comb->offset = 0;
59 comb->n = 0;
60 for (i = 0; i < MAX_AFF_ELTS; i++)
61 comb->elts[i].coef = 0;
62 comb->rest = NULL_TREE;
63 }
64
65 /* Sets COMB to CST. */
66
67 void
68 aff_combination_const (aff_tree *comb, tree type, const poly_widest_int &cst)
69 {
70 aff_combination_zero (comb, type);
71 comb->offset = wide_int_ext_for_comb (cst, comb->type);;
72 }
73
74 /* Sets COMB to single element ELT. */
75
76 void
77 aff_combination_elt (aff_tree *comb, tree type, tree elt)
78 {
79 aff_combination_zero (comb, type);
80
81 comb->n = 1;
82 comb->elts[0].val = elt;
83 comb->elts[0].coef = 1;
84 }
85
86 /* Scales COMB by SCALE. */
87
88 void
89 aff_combination_scale (aff_tree *comb, const widest_int &scale_in)
90 {
91 unsigned i, j;
92
93 widest_int scale = wide_int_ext_for_comb (scale_in, comb->type);
94 if (scale == 1)
95 return;
96
97 if (scale == 0)
98 {
99 aff_combination_zero (comb, comb->type);
100 return;
101 }
102
103 comb->offset = wide_int_ext_for_comb (scale * comb->offset, comb->type);
104 for (i = 0, j = 0; i < comb->n; i++)
105 {
106 widest_int new_coef
107 = wide_int_ext_for_comb (scale * comb->elts[i].coef, comb->type);
108 /* A coefficient may become zero due to overflow. Remove the zero
109 elements. */
110 if (new_coef == 0)
111 continue;
112 comb->elts[j].coef = new_coef;
113 comb->elts[j].val = comb->elts[i].val;
114 j++;
115 }
116 comb->n = j;
117
118 if (comb->rest)
119 {
120 tree type = comb->type;
121 if (POINTER_TYPE_P (type))
122 type = sizetype;
123 if (comb->n < MAX_AFF_ELTS)
124 {
125 comb->elts[comb->n].coef = scale;
126 comb->elts[comb->n].val = comb->rest;
127 comb->rest = NULL_TREE;
128 comb->n++;
129 }
130 else
131 comb->rest = fold_build2 (MULT_EXPR, type, comb->rest,
132 wide_int_to_tree (type, scale));
133 }
134 }
135
136 /* Adds ELT * SCALE to COMB. */
137
138 void
139 aff_combination_add_elt (aff_tree *comb, tree elt, const widest_int &scale_in)
140 {
141 unsigned i;
142 tree type;
143
144 widest_int scale = wide_int_ext_for_comb (scale_in, comb->type);
145 if (scale == 0)
146 return;
147
148 for (i = 0; i < comb->n; i++)
149 if (operand_equal_p (comb->elts[i].val, elt, 0))
150 {
151 widest_int new_coef
152 = wide_int_ext_for_comb (comb->elts[i].coef + scale, comb->type);
153 if (new_coef != 0)
154 {
155 comb->elts[i].coef = new_coef;
156 return;
157 }
158
159 comb->n--;
160 comb->elts[i] = comb->elts[comb->n];
161
162 if (comb->rest)
163 {
164 gcc_assert (comb->n == MAX_AFF_ELTS - 1);
165 comb->elts[comb->n].coef = 1;
166 comb->elts[comb->n].val = comb->rest;
167 comb->rest = NULL_TREE;
168 comb->n++;
169 }
170 return;
171 }
172 if (comb->n < MAX_AFF_ELTS)
173 {
174 comb->elts[comb->n].coef = scale;
175 comb->elts[comb->n].val = elt;
176 comb->n++;
177 return;
178 }
179
180 type = comb->type;
181 if (POINTER_TYPE_P (type))
182 type = sizetype;
183
184 if (scale == 1)
185 elt = fold_convert (type, elt);
186 else
187 elt = fold_build2 (MULT_EXPR, type,
188 fold_convert (type, elt),
189 wide_int_to_tree (type, scale));
190
191 if (comb->rest)
192 comb->rest = fold_build2 (PLUS_EXPR, type, comb->rest,
193 elt);
194 else
195 comb->rest = elt;
196 }
197
198 /* Adds CST to C. */
199
200 static void
201 aff_combination_add_cst (aff_tree *c, const poly_widest_int &cst)
202 {
203 c->offset = wide_int_ext_for_comb (c->offset + cst, c->type);
204 }
205
206 /* Adds COMB2 to COMB1. */
207
208 void
209 aff_combination_add (aff_tree *comb1, aff_tree *comb2)
210 {
211 unsigned i;
212
213 aff_combination_add_cst (comb1, comb2->offset);
214 for (i = 0; i < comb2->n; i++)
215 aff_combination_add_elt (comb1, comb2->elts[i].val, comb2->elts[i].coef);
216 if (comb2->rest)
217 aff_combination_add_elt (comb1, comb2->rest, 1);
218 }
219
220 /* Converts affine combination COMB to TYPE. */
221
222 void
223 aff_combination_convert (aff_tree *comb, tree type)
224 {
225 unsigned i, j;
226 tree comb_type = comb->type;
227
228 if (TYPE_PRECISION (type) > TYPE_PRECISION (comb_type))
229 {
230 tree val = fold_convert (type, aff_combination_to_tree (comb));
231 tree_to_aff_combination (val, type, comb);
232 return;
233 }
234
235 comb->type = type;
236 if (comb->rest && !POINTER_TYPE_P (type))
237 comb->rest = fold_convert (type, comb->rest);
238
239 if (TYPE_PRECISION (type) == TYPE_PRECISION (comb_type))
240 return;
241
242 comb->offset = wide_int_ext_for_comb (comb->offset, comb->type);
243 for (i = j = 0; i < comb->n; i++)
244 {
245 if (comb->elts[i].coef == 0)
246 continue;
247 comb->elts[j].coef = comb->elts[i].coef;
248 comb->elts[j].val = fold_convert (type, comb->elts[i].val);
249 j++;
250 }
251
252 comb->n = j;
253 if (comb->n < MAX_AFF_ELTS && comb->rest)
254 {
255 comb->elts[comb->n].coef = 1;
256 comb->elts[comb->n].val = comb->rest;
257 comb->rest = NULL_TREE;
258 comb->n++;
259 }
260 }
261
262 /* Tries to handle OP0 CODE OP1 as affine combination of parts. Returns
263 true when that was successful and returns the combination in COMB. */
264
265 static bool
266 expr_to_aff_combination (aff_tree *comb, tree_code code, tree type,
267 tree op0, tree op1 = NULL_TREE)
268 {
269 aff_tree tmp;
270 poly_int64 bitpos, bitsize, bytepos;
271
272 switch (code)
273 {
274 case POINTER_PLUS_EXPR:
275 tree_to_aff_combination (op0, type, comb);
276 tree_to_aff_combination (op1, sizetype, &tmp);
277 aff_combination_add (comb, &tmp);
278 return true;
279
280 case PLUS_EXPR:
281 case MINUS_EXPR:
282 tree_to_aff_combination (op0, type, comb);
283 tree_to_aff_combination (op1, type, &tmp);
284 if (code == MINUS_EXPR)
285 aff_combination_scale (&tmp, -1);
286 aff_combination_add (comb, &tmp);
287 return true;
288
289 case MULT_EXPR:
290 if (TREE_CODE (op1) != INTEGER_CST)
291 break;
292 tree_to_aff_combination (op0, type, comb);
293 aff_combination_scale (comb, wi::to_widest (op1));
294 return true;
295
296 case NEGATE_EXPR:
297 tree_to_aff_combination (op0, type, comb);
298 aff_combination_scale (comb, -1);
299 return true;
300
301 case BIT_NOT_EXPR:
302 /* ~x = -x - 1 */
303 tree_to_aff_combination (op0, type, comb);
304 aff_combination_scale (comb, -1);
305 aff_combination_add_cst (comb, -1);
306 return true;
307
308 CASE_CONVERT:
309 {
310 tree otype = type;
311 tree inner = op0;
312 tree itype = TREE_TYPE (inner);
313 enum tree_code icode = TREE_CODE (inner);
314
315 /* STRIP_NOPS */
316 if (tree_nop_conversion_p (otype, itype))
317 {
318 tree_to_aff_combination (op0, type, comb);
319 return true;
320 }
321
322 /* In principle this is a valid folding, but it isn't necessarily
323 an optimization, so do it here and not in fold_unary. */
324 if ((icode == PLUS_EXPR || icode == MINUS_EXPR || icode == MULT_EXPR)
325 && TREE_CODE (itype) == INTEGER_TYPE
326 && TREE_CODE (otype) == INTEGER_TYPE
327 && TYPE_PRECISION (otype) > TYPE_PRECISION (itype))
328 {
329 tree op0 = TREE_OPERAND (inner, 0), op1 = TREE_OPERAND (inner, 1);
330
331 /* If inner type has undefined overflow behavior, fold conversion
332 for below two cases:
333 (T1)(X *+- CST) -> (T1)X *+- (T1)CST
334 (T1)(X + X) -> (T1)X + (T1)X. */
335 if (TYPE_OVERFLOW_UNDEFINED (itype)
336 && (TREE_CODE (op1) == INTEGER_CST
337 || (icode == PLUS_EXPR && operand_equal_p (op0, op1, 0))))
338 {
339 op0 = fold_convert (otype, op0);
340 op1 = fold_convert (otype, op1);
341 return expr_to_aff_combination (comb, icode, otype, op0, op1);
342 }
343 wide_int minv, maxv;
344 /* If inner type has wrapping overflow behavior, fold conversion
345 for below case:
346 (T1)(X *+- CST) -> (T1)X *+- (T1)CST
347 if X *+- CST doesn't overflow by range information. */
348 if (TYPE_UNSIGNED (itype)
349 && TYPE_OVERFLOW_WRAPS (itype)
350 && TREE_CODE (op1) == INTEGER_CST
351 && determine_value_range (op0, &minv, &maxv) == VR_RANGE)
352 {
353 wi::overflow_type overflow = wi::OVF_NONE;
354 signop sign = UNSIGNED;
355 if (icode == PLUS_EXPR)
356 wi::add (maxv, wi::to_wide (op1), sign, &overflow);
357 else if (icode == MULT_EXPR)
358 wi::mul (maxv, wi::to_wide (op1), sign, &overflow);
359 else
360 wi::sub (minv, wi::to_wide (op1), sign, &overflow);
361
362 if (overflow == wi::OVF_NONE)
363 {
364 op0 = fold_convert (otype, op0);
365 op1 = fold_convert (otype, op1);
366 return expr_to_aff_combination (comb, icode, otype, op0,
367 op1);
368 }
369 }
370 }
371 }
372 break;
373
374 default:;
375 }
376
377 return false;
378 }
379
380 /* Splits EXPR into an affine combination of parts. */
381
382 void
383 tree_to_aff_combination (tree expr, tree type, aff_tree *comb)
384 {
385 aff_tree tmp;
386 enum tree_code code;
387 tree core, toffset;
388 poly_int64 bitpos, bitsize, bytepos;
389 machine_mode mode;
390 int unsignedp, reversep, volatilep;
391
392 STRIP_NOPS (expr);
393
394 code = TREE_CODE (expr);
395 switch (code)
396 {
397 case POINTER_PLUS_EXPR:
398 case PLUS_EXPR:
399 case MINUS_EXPR:
400 case MULT_EXPR:
401 if (expr_to_aff_combination (comb, code, type, TREE_OPERAND (expr, 0),
402 TREE_OPERAND (expr, 1)))
403 return;
404 break;
405
406 case NEGATE_EXPR:
407 case BIT_NOT_EXPR:
408 if (expr_to_aff_combination (comb, code, type, TREE_OPERAND (expr, 0)))
409 return;
410 break;
411
412 CASE_CONVERT:
413 /* ??? TREE_TYPE (expr) should be equal to type here, but IVOPTS
414 calls this with not showing an outer widening cast. */
415 if (expr_to_aff_combination (comb, code,
416 TREE_TYPE (expr), TREE_OPERAND (expr, 0)))
417 {
418 aff_combination_convert (comb, type);
419 return;
420 }
421 break;
422
423 case ADDR_EXPR:
424 /* Handle &MEM[ptr + CST] which is equivalent to POINTER_PLUS_EXPR. */
425 if (TREE_CODE (TREE_OPERAND (expr, 0)) == MEM_REF)
426 {
427 expr = TREE_OPERAND (expr, 0);
428 tree_to_aff_combination (TREE_OPERAND (expr, 0), type, comb);
429 tree_to_aff_combination (TREE_OPERAND (expr, 1), sizetype, &tmp);
430 aff_combination_add (comb, &tmp);
431 return;
432 }
433 core = get_inner_reference (TREE_OPERAND (expr, 0), &bitsize, &bitpos,
434 &toffset, &mode, &unsignedp, &reversep,
435 &volatilep);
436 if (!multiple_p (bitpos, BITS_PER_UNIT, &bytepos))
437 break;
438 aff_combination_const (comb, type, bytepos);
439 if (TREE_CODE (core) == MEM_REF)
440 {
441 tree mem_offset = TREE_OPERAND (core, 1);
442 aff_combination_add_cst (comb, wi::to_poly_widest (mem_offset));
443 core = TREE_OPERAND (core, 0);
444 }
445 else
446 core = build_fold_addr_expr (core);
447
448 if (TREE_CODE (core) == ADDR_EXPR)
449 aff_combination_add_elt (comb, core, 1);
450 else
451 {
452 tree_to_aff_combination (core, type, &tmp);
453 aff_combination_add (comb, &tmp);
454 }
455 if (toffset)
456 {
457 tree_to_aff_combination (toffset, type, &tmp);
458 aff_combination_add (comb, &tmp);
459 }
460 return;
461
462 default:
463 {
464 if (poly_int_tree_p (expr))
465 {
466 aff_combination_const (comb, type, wi::to_poly_widest (expr));
467 return;
468 }
469 break;
470 }
471 }
472
473 aff_combination_elt (comb, type, expr);
474 }
475
476 /* Creates EXPR + ELT * SCALE in TYPE. EXPR is taken from affine
477 combination COMB. */
478
479 static tree
480 add_elt_to_tree (tree expr, tree type, tree elt, const widest_int &scale_in)
481 {
482 enum tree_code code;
483
484 widest_int scale = wide_int_ext_for_comb (scale_in, type);
485
486 elt = fold_convert (type, elt);
487 if (scale == 1)
488 {
489 if (!expr)
490 return elt;
491
492 return fold_build2 (PLUS_EXPR, type, expr, elt);
493 }
494
495 if (scale == -1)
496 {
497 if (!expr)
498 return fold_build1 (NEGATE_EXPR, type, elt);
499
500 return fold_build2 (MINUS_EXPR, type, expr, elt);
501 }
502
503 if (!expr)
504 return fold_build2 (MULT_EXPR, type, elt, wide_int_to_tree (type, scale));
505
506 if (wi::neg_p (scale))
507 {
508 code = MINUS_EXPR;
509 scale = -scale;
510 }
511 else
512 code = PLUS_EXPR;
513
514 elt = fold_build2 (MULT_EXPR, type, elt, wide_int_to_tree (type, scale));
515 return fold_build2 (code, type, expr, elt);
516 }
517
518 /* Makes tree from the affine combination COMB. */
519
520 tree
521 aff_combination_to_tree (aff_tree *comb)
522 {
523 tree type = comb->type, base = NULL_TREE, expr = NULL_TREE;
524 unsigned i;
525 poly_widest_int off;
526 int sgn;
527
528 gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE);
529
530 i = 0;
531 if (POINTER_TYPE_P (type))
532 {
533 type = sizetype;
534 if (comb->n > 0 && comb->elts[0].coef == 1
535 && POINTER_TYPE_P (TREE_TYPE (comb->elts[0].val)))
536 {
537 base = comb->elts[0].val;
538 ++i;
539 }
540 }
541
542 for (; i < comb->n; i++)
543 expr = add_elt_to_tree (expr, type, comb->elts[i].val, comb->elts[i].coef);
544
545 if (comb->rest)
546 expr = add_elt_to_tree (expr, type, comb->rest, 1);
547
548 /* Ensure that we get x - 1, not x + (-1) or x + 0xff..f if x is
549 unsigned. */
550 if (known_lt (comb->offset, 0))
551 {
552 off = -comb->offset;
553 sgn = -1;
554 }
555 else
556 {
557 off = comb->offset;
558 sgn = 1;
559 }
560 expr = add_elt_to_tree (expr, type, wide_int_to_tree (type, off), sgn);
561
562 if (base)
563 return fold_build_pointer_plus (base, expr);
564 else
565 return fold_convert (comb->type, expr);
566 }
567
568 /* Copies the tree elements of COMB to ensure that they are not shared. */
569
570 void
571 unshare_aff_combination (aff_tree *comb)
572 {
573 unsigned i;
574
575 for (i = 0; i < comb->n; i++)
576 comb->elts[i].val = unshare_expr (comb->elts[i].val);
577 if (comb->rest)
578 comb->rest = unshare_expr (comb->rest);
579 }
580
581 /* Remove M-th element from COMB. */
582
583 void
584 aff_combination_remove_elt (aff_tree *comb, unsigned m)
585 {
586 comb->n--;
587 if (m <= comb->n)
588 comb->elts[m] = comb->elts[comb->n];
589 if (comb->rest)
590 {
591 comb->elts[comb->n].coef = 1;
592 comb->elts[comb->n].val = comb->rest;
593 comb->rest = NULL_TREE;
594 comb->n++;
595 }
596 }
597
598 /* Adds C * COEF * VAL to R. VAL may be NULL, in that case only
599 C * COEF is added to R. */
600
601
602 static void
603 aff_combination_add_product (aff_tree *c, const widest_int &coef, tree val,
604 aff_tree *r)
605 {
606 unsigned i;
607 tree aval, type;
608
609 for (i = 0; i < c->n; i++)
610 {
611 aval = c->elts[i].val;
612 if (val)
613 {
614 type = TREE_TYPE (aval);
615 aval = fold_build2 (MULT_EXPR, type, aval,
616 fold_convert (type, val));
617 }
618
619 aff_combination_add_elt (r, aval, coef * c->elts[i].coef);
620 }
621
622 if (c->rest)
623 {
624 aval = c->rest;
625 if (val)
626 {
627 type = TREE_TYPE (aval);
628 aval = fold_build2 (MULT_EXPR, type, aval,
629 fold_convert (type, val));
630 }
631
632 aff_combination_add_elt (r, aval, coef);
633 }
634
635 if (val)
636 {
637 if (c->offset.is_constant ())
638 /* Access coeffs[0] directly, for efficiency. */
639 aff_combination_add_elt (r, val, coef * c->offset.coeffs[0]);
640 else
641 {
642 /* c->offset is polynomial, so multiply VAL rather than COEF
643 by it. */
644 tree offset = wide_int_to_tree (TREE_TYPE (val), c->offset);
645 val = fold_build2 (MULT_EXPR, TREE_TYPE (val), val, offset);
646 aff_combination_add_elt (r, val, coef);
647 }
648 }
649 else
650 aff_combination_add_cst (r, coef * c->offset);
651 }
652
653 /* Multiplies C1 by C2, storing the result to R */
654
655 void
656 aff_combination_mult (aff_tree *c1, aff_tree *c2, aff_tree *r)
657 {
658 unsigned i;
659 gcc_assert (TYPE_PRECISION (c1->type) == TYPE_PRECISION (c2->type));
660
661 aff_combination_zero (r, c1->type);
662
663 for (i = 0; i < c2->n; i++)
664 aff_combination_add_product (c1, c2->elts[i].coef, c2->elts[i].val, r);
665 if (c2->rest)
666 aff_combination_add_product (c1, 1, c2->rest, r);
667 if (c2->offset.is_constant ())
668 /* Access coeffs[0] directly, for efficiency. */
669 aff_combination_add_product (c1, c2->offset.coeffs[0], NULL, r);
670 else
671 {
672 /* c2->offset is polynomial, so do the multiplication in tree form. */
673 tree offset = wide_int_to_tree (c2->type, c2->offset);
674 aff_combination_add_product (c1, 1, offset, r);
675 }
676 }
677
678 /* Returns the element of COMB whose value is VAL, or NULL if no such
679 element exists. If IDX is not NULL, it is set to the index of VAL in
680 COMB. */
681
682 static class aff_comb_elt *
683 aff_combination_find_elt (aff_tree *comb, tree val, unsigned *idx)
684 {
685 unsigned i;
686
687 for (i = 0; i < comb->n; i++)
688 if (operand_equal_p (comb->elts[i].val, val, 0))
689 {
690 if (idx)
691 *idx = i;
692
693 return &comb->elts[i];
694 }
695
696 return NULL;
697 }
698
699 /* Element of the cache that maps ssa name NAME to its expanded form
700 as an affine expression EXPANSION. */
701
702 class name_expansion
703 {
704 public:
705 aff_tree expansion;
706
707 /* True if the expansion for the name is just being generated. */
708 unsigned in_progress : 1;
709 };
710
711 /* Expands SSA names in COMB recursively. CACHE is used to cache the
712 results. */
713
714 void
715 aff_combination_expand (aff_tree *comb ATTRIBUTE_UNUSED,
716 hash_map<tree, name_expansion *> **cache)
717 {
718 unsigned i;
719 aff_tree to_add, current, curre;
720 tree e;
721 gimple *def;
722 widest_int scale;
723 class name_expansion *exp;
724
725 aff_combination_zero (&to_add, comb->type);
726 for (i = 0; i < comb->n; i++)
727 {
728 tree type, name;
729 enum tree_code code;
730
731 e = comb->elts[i].val;
732 type = TREE_TYPE (e);
733 name = e;
734 /* Look through some conversions. */
735 if (CONVERT_EXPR_P (e)
736 && (TYPE_PRECISION (type)
737 >= TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (e, 0)))))
738 name = TREE_OPERAND (e, 0);
739 if (TREE_CODE (name) != SSA_NAME)
740 continue;
741 def = SSA_NAME_DEF_STMT (name);
742 if (!is_gimple_assign (def) || gimple_assign_lhs (def) != name)
743 continue;
744
745 code = gimple_assign_rhs_code (def);
746 if (code != SSA_NAME
747 && !IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (code))
748 && (get_gimple_rhs_class (code) != GIMPLE_SINGLE_RHS
749 || !is_gimple_min_invariant (gimple_assign_rhs1 (def))))
750 continue;
751
752 /* We do not know whether the reference retains its value at the
753 place where the expansion is used. */
754 if (TREE_CODE_CLASS (code) == tcc_reference)
755 continue;
756
757 name_expansion **slot = NULL;
758 if (*cache)
759 slot = (*cache)->get (name);
760 exp = slot ? *slot : NULL;
761 if (!exp)
762 {
763 /* Only bother to handle cases tree_to_aff_combination will. */
764 switch (code)
765 {
766 case POINTER_PLUS_EXPR:
767 case PLUS_EXPR:
768 case MINUS_EXPR:
769 case MULT_EXPR:
770 if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
771 gimple_assign_rhs1 (def),
772 gimple_assign_rhs2 (def)))
773 continue;
774 break;
775 case NEGATE_EXPR:
776 case BIT_NOT_EXPR:
777 if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
778 gimple_assign_rhs1 (def)))
779 continue;
780 break;
781 CASE_CONVERT:
782 if (!expr_to_aff_combination (&current, code, TREE_TYPE (name),
783 gimple_assign_rhs1 (def)))
784 /* This makes us always expand conversions which we did
785 in the past and makes gcc.dg/tree-ssa/ivopts-lt-2.c
786 PASS, eliminating one induction variable in IVOPTs.
787 ??? But it is really excessive and we should try
788 harder to do without it. */
789 aff_combination_elt (&current, TREE_TYPE (name),
790 fold_convert (TREE_TYPE (name),
791 gimple_assign_rhs1 (def)));
792 break;
793 case ADDR_EXPR:
794 case INTEGER_CST:
795 case POLY_INT_CST:
796 tree_to_aff_combination (gimple_assign_rhs1 (def),
797 TREE_TYPE (name), &current);
798 break;
799 default:
800 continue;
801 }
802 exp = XNEW (class name_expansion);
803 exp->in_progress = 1;
804 if (!*cache)
805 *cache = new hash_map<tree, name_expansion *>;
806 (*cache)->put (name, exp);
807 aff_combination_expand (&current, cache);
808 exp->expansion = current;
809 exp->in_progress = 0;
810 }
811 else
812 {
813 /* Since we follow the definitions in the SSA form, we should not
814 enter a cycle unless we pass through a phi node. */
815 gcc_assert (!exp->in_progress);
816 current = exp->expansion;
817 }
818 if (!useless_type_conversion_p (comb->type, current.type))
819 aff_combination_convert (&current, comb->type);
820
821 /* Accumulate the new terms to TO_ADD, so that we do not modify
822 COMB while traversing it; include the term -coef * E, to remove
823 it from COMB. */
824 scale = comb->elts[i].coef;
825 aff_combination_zero (&curre, comb->type);
826 aff_combination_add_elt (&curre, e, -scale);
827 aff_combination_scale (&current, scale);
828 aff_combination_add (&to_add, &current);
829 aff_combination_add (&to_add, &curre);
830 }
831 aff_combination_add (comb, &to_add);
832 }
833
834 /* Similar to tree_to_aff_combination, but follows SSA name definitions
835 and expands them recursively. CACHE is used to cache the expansions
836 of the ssa names, to avoid exponential time complexity for cases
837 like
838
839 a1 = a0 + a0;
840 a2 = a1 + a1;
841 a3 = a2 + a2;
842 ... */
843
844 void
845 tree_to_aff_combination_expand (tree expr, tree type, aff_tree *comb,
846 hash_map<tree, name_expansion *> **cache)
847 {
848 tree_to_aff_combination (expr, type, comb);
849 aff_combination_expand (comb, cache);
850 }
851
852 /* Frees memory occupied by struct name_expansion in *VALUE. Callback for
853 hash_map::traverse. */
854
855 bool
856 free_name_expansion (tree const &, name_expansion **value, void *)
857 {
858 free (*value);
859 return true;
860 }
861
862 /* Frees memory allocated for the CACHE used by
863 tree_to_aff_combination_expand. */
864
865 void
866 free_affine_expand_cache (hash_map<tree, name_expansion *> **cache)
867 {
868 if (!*cache)
869 return;
870
871 (*cache)->traverse<void *, free_name_expansion> (NULL);
872 delete (*cache);
873 *cache = NULL;
874 }
875
876 /* If VAL != CST * DIV for any constant CST, returns false.
877 Otherwise, if *MULT_SET is true, additionally compares CST and MULT,
878 and if they are different, returns false. Finally, if neither of these
879 two cases occur, true is returned, and CST is stored to MULT and MULT_SET
880 is set to true. */
881
882 static bool
883 wide_int_constant_multiple_p (const poly_widest_int &val,
884 const poly_widest_int &div,
885 bool *mult_set, poly_widest_int *mult)
886 {
887 poly_widest_int rem, cst;
888
889 if (known_eq (val, 0))
890 {
891 if (*mult_set && maybe_ne (*mult, 0))
892 return false;
893 *mult_set = true;
894 *mult = 0;
895 return true;
896 }
897
898 if (maybe_eq (div, 0))
899 return false;
900
901 if (!multiple_p (val, div, &cst))
902 return false;
903
904 if (*mult_set && maybe_ne (*mult, cst))
905 return false;
906
907 *mult_set = true;
908 *mult = cst;
909 return true;
910 }
911
912 /* Returns true if VAL = X * DIV for some constant X. If this is the case,
913 X is stored to MULT. */
914
915 bool
916 aff_combination_constant_multiple_p (aff_tree *val, aff_tree *div,
917 poly_widest_int *mult)
918 {
919 bool mult_set = false;
920 unsigned i;
921
922 if (val->n == 0 && known_eq (val->offset, 0))
923 {
924 *mult = 0;
925 return true;
926 }
927 if (val->n != div->n)
928 return false;
929
930 if (val->rest || div->rest)
931 return false;
932
933 if (!wide_int_constant_multiple_p (val->offset, div->offset,
934 &mult_set, mult))
935 return false;
936
937 for (i = 0; i < div->n; i++)
938 {
939 class aff_comb_elt *elt
940 = aff_combination_find_elt (val, div->elts[i].val, NULL);
941 if (!elt)
942 return false;
943 if (!wide_int_constant_multiple_p (elt->coef, div->elts[i].coef,
944 &mult_set, mult))
945 return false;
946 }
947
948 gcc_assert (mult_set);
949 return true;
950 }
951
952 /* Prints the affine VAL to the FILE. */
953
954 static void
955 print_aff (FILE *file, aff_tree *val)
956 {
957 unsigned i;
958 signop sgn = TYPE_SIGN (val->type);
959 if (POINTER_TYPE_P (val->type))
960 sgn = SIGNED;
961 fprintf (file, "{\n type = ");
962 print_generic_expr (file, val->type, TDF_VOPS|TDF_MEMSYMS);
963 fprintf (file, "\n offset = ");
964 print_dec (val->offset, file, sgn);
965 if (val->n > 0)
966 {
967 fprintf (file, "\n elements = {\n");
968 for (i = 0; i < val->n; i++)
969 {
970 fprintf (file, " [%d] = ", i);
971 print_generic_expr (file, val->elts[i].val, TDF_VOPS|TDF_MEMSYMS);
972
973 fprintf (file, " * ");
974 print_dec (val->elts[i].coef, file, sgn);
975 if (i != val->n - 1)
976 fprintf (file, ", \n");
977 }
978 fprintf (file, "\n }");
979 }
980 if (val->rest)
981 {
982 fprintf (file, "\n rest = ");
983 print_generic_expr (file, val->rest, TDF_VOPS|TDF_MEMSYMS);
984 }
985 fprintf (file, "\n}");
986 }
987
988 /* Prints the affine VAL to the standard error, used for debugging. */
989
990 DEBUG_FUNCTION void
991 debug_aff (aff_tree *val)
992 {
993 print_aff (stderr, val);
994 fprintf (stderr, "\n");
995 }
996
997 /* Computes address of the reference REF in ADDR. The size of the accessed
998 location is stored to SIZE. Returns the ultimate containing object to
999 which REF refers. */
1000
1001 tree
1002 get_inner_reference_aff (tree ref, aff_tree *addr, poly_widest_int *size)
1003 {
1004 poly_int64 bitsize, bitpos;
1005 tree toff;
1006 machine_mode mode;
1007 int uns, rev, vol;
1008 aff_tree tmp;
1009 tree base = get_inner_reference (ref, &bitsize, &bitpos, &toff, &mode,
1010 &uns, &rev, &vol);
1011 tree base_addr = build_fold_addr_expr (base);
1012
1013 /* ADDR = &BASE + TOFF + BITPOS / BITS_PER_UNIT. */
1014
1015 tree_to_aff_combination (base_addr, sizetype, addr);
1016
1017 if (toff)
1018 {
1019 tree_to_aff_combination (toff, sizetype, &tmp);
1020 aff_combination_add (addr, &tmp);
1021 }
1022
1023 aff_combination_const (&tmp, sizetype, bits_to_bytes_round_down (bitpos));
1024 aff_combination_add (addr, &tmp);
1025
1026 *size = bits_to_bytes_round_up (bitsize);
1027
1028 return base;
1029 }
1030
1031 /* Returns true if a region of size SIZE1 at position 0 and a region of
1032 size SIZE2 at position DIFF cannot overlap. */
1033
1034 bool
1035 aff_comb_cannot_overlap_p (aff_tree *diff, const poly_widest_int &size1,
1036 const poly_widest_int &size2)
1037 {
1038 /* Unless the difference is a constant, we fail. */
1039 if (diff->n != 0)
1040 return false;
1041
1042 if (!ordered_p (diff->offset, 0))
1043 return false;
1044
1045 if (maybe_lt (diff->offset, 0))
1046 {
1047 /* The second object is before the first one, we succeed if the last
1048 element of the second object is before the start of the first one. */
1049 return known_le (diff->offset + size2, 0);
1050 }
1051 else
1052 {
1053 /* We succeed if the second object starts after the first one ends. */
1054 return known_le (size1, diff->offset);
1055 }
1056 }
1057