annotate gcc/tree-affine.c @ 158:494b0b89df80 default tip

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