annotate gcc/cfgloop.h @ 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 /* Natural loop functions
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 1987-2020 Free Software Foundation, Inc.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
3
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 This file is part of GCC.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
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 under
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 version.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
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 ANY
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 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.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
15
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 #ifndef GCC_CFGLOOP_H
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 #define GCC_CFGLOOP_H
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
22
111
kono
parents: 67
diff changeset
23 #include "cfgloopmanip.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
24
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 /* Structure to hold decision about unrolling/peeling. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
26 enum lpt_dec
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 LPT_NONE,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 LPT_UNROLL_CONSTANT,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
30 LPT_UNROLL_RUNTIME,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 LPT_UNROLL_STUPID
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
33
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
34 struct GTY (()) lpt_decision {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
35 enum lpt_dec decision;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 unsigned times;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
38
111
kono
parents: 67
diff changeset
39 /* The type of extend applied to an IV. */
kono
parents: 67
diff changeset
40 enum iv_extend_code
kono
parents: 67
diff changeset
41 {
kono
parents: 67
diff changeset
42 IV_SIGN_EXTEND,
kono
parents: 67
diff changeset
43 IV_ZERO_EXTEND,
kono
parents: 67
diff changeset
44 IV_UNKNOWN_EXTEND
kono
parents: 67
diff changeset
45 };
kono
parents: 67
diff changeset
46
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 /* The structure describing a bound on number of iterations of a loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
48
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 class GTY ((chain_next ("%h.next"))) nb_iter_bound {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 public:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 /* The statement STMT is executed at most ... */
111
kono
parents: 67
diff changeset
52 gimple *stmt;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
53
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 /* ... BOUND + 1 times (BOUND must be an unsigned constant).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 The + 1 is added for the following reasons:
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
56
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 a) 0 would otherwise be unused, while we would need to care more about
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 overflows (as MAX + 1 is sometimes produced as the estimate on number
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 of executions of STMT).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 b) it is consistent with the result of number_of_iterations_exit. */
111
kono
parents: 67
diff changeset
61 widest_int bound;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
63 /* True if the statement will cause the loop to be leaved the (at most)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 BOUND + 1-st time it is executed, that is, all the statements after it
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 are executed at most BOUND times. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 bool is_exit;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
67
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 /* The next bound in the list. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 class nb_iter_bound *next;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 /* Description of the loop exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
111
kono
parents: 67
diff changeset
74 struct GTY ((for_user)) loop_exit {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 /* The exit edge. */
111
kono
parents: 67
diff changeset
76 edge e;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 /* Previous and next exit in the list of the exits of the loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 struct loop_exit *prev;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 struct loop_exit *next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 /* Next element in the list of loops from that E exits. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 struct loop_exit *next_e;
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
111
kono
parents: 67
diff changeset
86 struct loop_exit_hasher : ggc_ptr_hash<loop_exit>
kono
parents: 67
diff changeset
87 {
kono
parents: 67
diff changeset
88 typedef edge compare_type;
kono
parents: 67
diff changeset
89
kono
parents: 67
diff changeset
90 static hashval_t hash (loop_exit *);
kono
parents: 67
diff changeset
91 static bool equal (loop_exit *, edge);
kono
parents: 67
diff changeset
92 static void remove (loop_exit *);
kono
parents: 67
diff changeset
93 };
kono
parents: 67
diff changeset
94
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
95 typedef class loop *loop_p;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 /* An integer estimation of the number of iterations. Estimate_state
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 describes what is the state of the estimation. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 enum loop_estimation
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 /* Estimate was not computed yet. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 EST_NOT_COMPUTED,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 /* Estimate is ready. */
111
kono
parents: 67
diff changeset
104 EST_AVAILABLE,
kono
parents: 67
diff changeset
105 EST_LAST
kono
parents: 67
diff changeset
106 };
kono
parents: 67
diff changeset
107
kono
parents: 67
diff changeset
108 /* The structure describing non-overflow control induction variable for
kono
parents: 67
diff changeset
109 loop's exit edge. */
kono
parents: 67
diff changeset
110 struct GTY ((chain_next ("%h.next"))) control_iv {
kono
parents: 67
diff changeset
111 tree base;
kono
parents: 67
diff changeset
112 tree step;
kono
parents: 67
diff changeset
113 struct control_iv *next;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 };
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 /* Structure to hold information for each natural loop. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
117 class GTY ((chain_next ("%h.next"))) loop {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
118 public:
111
kono
parents: 67
diff changeset
119 /* Index into loops array. Note indices will never be reused after loop
kono
parents: 67
diff changeset
120 is destroyed. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
121 int num;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
122
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
123 /* Number of loop insns. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 unsigned ninsns;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
126 /* Basic block of loop header. */
111
kono
parents: 67
diff changeset
127 basic_block header;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 /* Basic block of loop latch. */
111
kono
parents: 67
diff changeset
130 basic_block latch;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
131
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
132 /* For loop unrolling/peeling decision. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 struct lpt_decision lpt_decision;
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 /* Average number of executed insns per iteration. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
136 unsigned av_ninsns;
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 /* Number of blocks contained within the loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 unsigned num_nodes;
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 /* Superloops of the loop, starting with the outermost loop. */
111
kono
parents: 67
diff changeset
142 vec<loop_p, va_gc> *superloops;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
143
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
144 /* The first inner (child) loop or NULL if innermost loop. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
145 class loop *inner;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
146
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
147 /* Link to the next (sibling) loop. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
148 class loop *next;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
149
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
150 /* Auxiliary info specific to a pass. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 PTR GTY ((skip (""))) aux;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
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
153 /* The number of times the latch of the loop is executed. This can be an
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
154 INTEGER_CST, or a symbolic expression representing the number of
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
155 iterations like "N - 1", or a COND_EXPR containing the runtime
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
156 conditions under which the number of iterations is non zero.
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
157
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
158 Don't access this field directly: number_of_latch_executions
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
159 computes and caches the computed information in this field. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
160 tree nb_iterations;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
161
111
kono
parents: 67
diff changeset
162 /* An integer guaranteed to be greater or equal to nb_iterations. Only
kono
parents: 67
diff changeset
163 valid if any_upper_bound is true. */
kono
parents: 67
diff changeset
164 widest_int nb_iterations_upper_bound;
kono
parents: 67
diff changeset
165
kono
parents: 67
diff changeset
166 widest_int nb_iterations_likely_upper_bound;
kono
parents: 67
diff changeset
167
kono
parents: 67
diff changeset
168 /* An integer giving an estimate on nb_iterations. Unlike
kono
parents: 67
diff changeset
169 nb_iterations_upper_bound, there is no guarantee that it is at least
kono
parents: 67
diff changeset
170 nb_iterations. */
kono
parents: 67
diff changeset
171 widest_int nb_iterations_estimate;
kono
parents: 67
diff changeset
172
kono
parents: 67
diff changeset
173 /* If > 0, an integer, where the user asserted that for any
kono
parents: 67
diff changeset
174 I in [ 0, nb_iterations ) and for any J in
kono
parents: 67
diff changeset
175 [ I, min ( I + safelen, nb_iterations ) ), the Ith and Jth iterations
kono
parents: 67
diff changeset
176 of the loop can be safely evaluated concurrently. */
kono
parents: 67
diff changeset
177 int safelen;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
178
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
179 /* Preferred vectorization factor for the loop if non-zero. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
180 int simdlen;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
181
111
kono
parents: 67
diff changeset
182 /* Constraints are generally set by consumers and affect certain
kono
parents: 67
diff changeset
183 semantics of niter analyzer APIs. Currently the APIs affected are
kono
parents: 67
diff changeset
184 number_of_iterations_exit* functions and their callers. One typical
kono
parents: 67
diff changeset
185 use case of constraints is to vectorize possibly infinite loop:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
186
111
kono
parents: 67
diff changeset
187 1) Compute niter->assumptions by calling niter analyzer API and
kono
parents: 67
diff changeset
188 record it as possible condition for loop versioning.
kono
parents: 67
diff changeset
189 2) Clear buffered result of niter/scev analyzer.
kono
parents: 67
diff changeset
190 3) Set constraint LOOP_C_FINITE assuming the loop is finite.
kono
parents: 67
diff changeset
191 4) Analyze data references. Since data reference analysis depends
kono
parents: 67
diff changeset
192 on niter/scev analyzer, the point is that niter/scev analysis
kono
parents: 67
diff changeset
193 is done under circumstance of LOOP_C_FINITE constraint.
kono
parents: 67
diff changeset
194 5) Version the loop with niter->assumptions computed in step 1).
kono
parents: 67
diff changeset
195 6) Vectorize the versioned loop in which niter->assumptions is
kono
parents: 67
diff changeset
196 checked to be true.
kono
parents: 67
diff changeset
197 7) Update constraints in versioned loops so that niter analyzer
kono
parents: 67
diff changeset
198 in following passes can use it.
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
199
111
kono
parents: 67
diff changeset
200 Note consumers are usually the loop optimizers and it is consumers'
kono
parents: 67
diff changeset
201 responsibility to set/clear constraints correctly. Failing to do
kono
parents: 67
diff changeset
202 that might result in hard to track down bugs in niter/scev consumers. */
kono
parents: 67
diff changeset
203 unsigned constraints;
63
b7f97abdc517 update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 55
diff changeset
204
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
205 /* An integer estimation of the number of iterations. Estimate_state
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 describes what is the state of the estimation. */
111
kono
parents: 67
diff changeset
207 ENUM_BITFIELD(loop_estimation) estimate_state : 8;
kono
parents: 67
diff changeset
208
kono
parents: 67
diff changeset
209 unsigned any_upper_bound : 1;
kono
parents: 67
diff changeset
210 unsigned any_estimate : 1;
kono
parents: 67
diff changeset
211 unsigned any_likely_upper_bound : 1;
kono
parents: 67
diff changeset
212
kono
parents: 67
diff changeset
213 /* True if the loop can be parallel. */
kono
parents: 67
diff changeset
214 unsigned can_be_parallel : 1;
kono
parents: 67
diff changeset
215
kono
parents: 67
diff changeset
216 /* True if -Waggressive-loop-optimizations warned about this loop
kono
parents: 67
diff changeset
217 already. */
kono
parents: 67
diff changeset
218 unsigned warned_aggressive_loop_optimizations : 1;
kono
parents: 67
diff changeset
219
kono
parents: 67
diff changeset
220 /* True if this loop should never be vectorized. */
kono
parents: 67
diff changeset
221 unsigned dont_vectorize : 1;
kono
parents: 67
diff changeset
222
kono
parents: 67
diff changeset
223 /* True if we should try harder to vectorize this loop. */
kono
parents: 67
diff changeset
224 unsigned force_vectorize : 1;
kono
parents: 67
diff changeset
225
kono
parents: 67
diff changeset
226 /* True if the loop is part of an oacc kernels region. */
kono
parents: 67
diff changeset
227 unsigned in_oacc_kernels_region : 1;
kono
parents: 67
diff changeset
228
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
229 /* The number of times to unroll the loop. 0 means no information given,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
230 just do what we always do. A value of 1 means do not unroll the loop.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
231 A value of USHRT_MAX means unroll with no specific unrolling factor.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
232 Other values means unroll with the given unrolling factor. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
233 unsigned short unroll;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
235 /* If this loop was inlined the main clique of the callee which does
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 not need remapping when copying the loop body. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
237 unsigned short owned_clique;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238
111
kono
parents: 67
diff changeset
239 /* For SIMD loops, this is a unique identifier of the loop, referenced
kono
parents: 67
diff changeset
240 by IFN_GOMP_SIMD_VF, IFN_GOMP_SIMD_LANE and IFN_GOMP_SIMD_LAST_LANE
kono
parents: 67
diff changeset
241 builtins. */
kono
parents: 67
diff changeset
242 tree simduid;
kono
parents: 67
diff changeset
243
kono
parents: 67
diff changeset
244 /* In loop optimization, it's common to generate loops from the original
kono
parents: 67
diff changeset
245 loop. This field records the index of the original loop which can be
kono
parents: 67
diff changeset
246 used to track the original loop from newly generated loops. This can
kono
parents: 67
diff changeset
247 be done by calling function get_loop (cfun, orig_loop_num). Note the
kono
parents: 67
diff changeset
248 original loop could be destroyed for various reasons thus no longer
kono
parents: 67
diff changeset
249 exists, as a result, function call to get_loop returns NULL pointer.
kono
parents: 67
diff changeset
250 In this case, this field should not be used and needs to be cleared
kono
parents: 67
diff changeset
251 whenever possible. */
kono
parents: 67
diff changeset
252 int orig_loop_num;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
253
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 /* Upper bound on number of iterations of a loop. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
255 class nb_iter_bound *bounds;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
111
kono
parents: 67
diff changeset
257 /* Non-overflow control ivs of a loop. */
kono
parents: 67
diff changeset
258 struct control_iv *control_ivs;
kono
parents: 67
diff changeset
259
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 /* Head of the cyclic list of the exits of the loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
261 struct loop_exit *exits;
111
kono
parents: 67
diff changeset
262
kono
parents: 67
diff changeset
263 /* Number of iteration analysis data for RTL. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
264 class niter_desc *simple_loop_desc;
111
kono
parents: 67
diff changeset
265
kono
parents: 67
diff changeset
266 /* For sanity checking during loop fixup we record here the former
kono
parents: 67
diff changeset
267 loop header for loops marked for removal. Note that this prevents
kono
parents: 67
diff changeset
268 the basic-block from being collected but its index can still be
kono
parents: 67
diff changeset
269 reused. */
kono
parents: 67
diff changeset
270 basic_block former_header;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
271 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
272
111
kono
parents: 67
diff changeset
273 /* Set if the loop is known to be infinite. */
kono
parents: 67
diff changeset
274 #define LOOP_C_INFINITE (1 << 0)
kono
parents: 67
diff changeset
275 /* Set if the loop is known to be finite without any assumptions. */
kono
parents: 67
diff changeset
276 #define LOOP_C_FINITE (1 << 1)
kono
parents: 67
diff changeset
277
kono
parents: 67
diff changeset
278 /* Set C to the LOOP constraint. */
kono
parents: 67
diff changeset
279 static inline void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
280 loop_constraint_set (class loop *loop, unsigned c)
111
kono
parents: 67
diff changeset
281 {
kono
parents: 67
diff changeset
282 loop->constraints |= c;
kono
parents: 67
diff changeset
283 }
kono
parents: 67
diff changeset
284
kono
parents: 67
diff changeset
285 /* Clear C from the LOOP constraint. */
kono
parents: 67
diff changeset
286 static inline void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
287 loop_constraint_clear (class loop *loop, unsigned c)
111
kono
parents: 67
diff changeset
288 {
kono
parents: 67
diff changeset
289 loop->constraints &= ~c;
kono
parents: 67
diff changeset
290 }
kono
parents: 67
diff changeset
291
kono
parents: 67
diff changeset
292 /* Check if C is set in the LOOP constraint. */
kono
parents: 67
diff changeset
293 static inline bool
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
294 loop_constraint_set_p (class loop *loop, unsigned c)
111
kono
parents: 67
diff changeset
295 {
kono
parents: 67
diff changeset
296 return (loop->constraints & c) == c;
kono
parents: 67
diff changeset
297 }
kono
parents: 67
diff changeset
298
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 /* Flags for state of loop structure. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
300 enum
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
302 LOOPS_HAVE_PREHEADERS = 1,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
303 LOOPS_HAVE_SIMPLE_LATCHES = 2,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS = 4,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 LOOPS_HAVE_RECORDED_EXITS = 8,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
306 LOOPS_MAY_HAVE_MULTIPLE_LATCHES = 16,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 LOOP_CLOSED_SSA = 32,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
308 LOOPS_NEED_FIXUP = 64,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
309 LOOPS_HAVE_FALLTHRU_PREHEADERS = 128
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
311
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 #define LOOPS_NORMAL (LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES \
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
313 | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
314 #define AVOID_CFG_MODIFICATIONS (LOOPS_MAY_HAVE_MULTIPLE_LATCHES)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
315
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
316 /* Structure to hold CFG information about natural loops within a function. */
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
317 struct GTY (()) loops {
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
318 /* State of loops. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
319 int state;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
320
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
321 /* Array of the loops. */
111
kono
parents: 67
diff changeset
322 vec<loop_p, va_gc> *larray;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
324 /* Maps edges to the list of their descriptions as loop exits. Edges
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
325 whose sources or destinations have loop_father == NULL (which may
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
326 happen during the cfg manipulations) should not appear in EXITS. */
111
kono
parents: 67
diff changeset
327 hash_table<loop_exit_hasher> *GTY(()) exits;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
328
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
329 /* Pointer to root of loop hierarchy tree. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 class loop *tree_root;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
331 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
332
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
333 /* Loop recognition. */
111
kono
parents: 67
diff changeset
334 bool bb_loop_header_p (basic_block);
kono
parents: 67
diff changeset
335 void init_loops_structure (struct function *, struct loops *, unsigned);
kono
parents: 67
diff changeset
336 extern struct loops *flow_loops_find (struct loops *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
337 extern void disambiguate_loops_with_multiple_latches (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
338 extern void flow_loops_free (struct loops *);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
339 extern void flow_loops_dump (FILE *,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 void (*)(const class loop *, FILE *, int), int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341 extern void flow_loop_dump (const class loop *, FILE *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 void (*)(const class loop *, FILE *, int), int);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 class loop *alloc_loop (void);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 extern void flow_loop_free (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 int flow_loop_nodes_find (basic_block, class loop *);
111
kono
parents: 67
diff changeset
346 unsigned fix_loop_structure (bitmap changed_bbs);
55
77e2b8dfacca update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents: 0
diff changeset
347 bool mark_irreducible_loops (void);
111
kono
parents: 67
diff changeset
348 void release_recorded_exits (function *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
349 void record_loop_exits (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
350 void rescan_loop_exit (edge, bool, bool);
111
kono
parents: 67
diff changeset
351 void sort_sibling_loops (function *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
352
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
353 /* Loop data structure manipulation/querying. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
354 extern void flow_loop_tree_node_add (class loop *, class loop *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
355 class loop * = NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
356 extern void flow_loop_tree_node_remove (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357 extern bool flow_loop_nested_p (const class loop *, const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 extern bool flow_bb_inside_loop_p (const class loop *, const_basic_block);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359 extern class loop * find_common_loop (class loop *, class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360 class loop *superloop_at_depth (class loop *, unsigned);
111
kono
parents: 67
diff changeset
361 struct eni_weights;
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362 extern int num_loop_insns (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 extern int average_num_loop_insns (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 extern unsigned get_loop_level (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365 extern bool loop_exit_edge_p (const class loop *, const_edge);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 extern bool loop_exits_to_bb_p (class loop *, basic_block);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
367 extern bool loop_exits_from_bb_p (class loop *, basic_block);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
368 extern void mark_loop_exit_edges (void);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
369 extern dump_user_location_t get_loop_location (class loop *loop);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
370
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
371 /* Loops & cfg manipulation. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 extern basic_block *get_loop_body (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
373 extern unsigned get_loop_body_with_size (const class loop *, basic_block *,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
374 unsigned);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
375 extern basic_block *get_loop_body_in_dom_order (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 extern basic_block *get_loop_body_in_bfs_order (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
377 extern basic_block *get_loop_body_in_custom_order (const class loop *,
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
378 int (*) (const void *, const void *));
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
379 extern basic_block *get_loop_body_in_custom_order (const class loop *, void *,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
380 int (*) (const void *, const void *, void *));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
381
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
382 extern vec<edge> get_loop_exit_edges (const class loop *, basic_block * = NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 extern edge single_exit (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384 extern edge single_likely_exit (class loop *loop, vec<edge>);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 extern unsigned num_loop_branches (const class loop *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
386
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
387 extern edge loop_preheader_edge (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
388 extern edge loop_latch_edge (const class loop *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
389
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 extern void add_bb_to_loop (basic_block, class loop *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
391 extern void remove_bb_from_loops (basic_block);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
392
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 extern void cancel_loop_tree (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394 extern void delete_loop (class loop *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
395
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
396
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
397 extern void verify_loop_structure (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
398
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
399 /* Loop analysis. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
400 extern bool just_once_each_iteration_p (const class loop *, const_basic_block);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
401 gcov_type expected_loop_iterations_unbounded (const class loop *,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
402 bool *read_profile_p = NULL, bool by_profile_only = false);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 extern unsigned expected_loop_iterations (class loop *);
111
kono
parents: 67
diff changeset
404 extern rtx doloop_condition_get (rtx_insn *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
405
111
kono
parents: 67
diff changeset
406 void mark_loop_for_removal (loop_p);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
407
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
408 /* Induction variable analysis. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
409
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
410 /* The description of induction variable. The things are a bit complicated
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
411 due to need to handle subregs and extends. The value of the object described
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
412 by it can be obtained as follows (all computations are done in extend_mode):
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
413
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
414 Value in i-th iteration is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
415 delta + mult * extend_{extend_mode} (subreg_{mode} (base + i * step)).
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
416
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 If first_special is true, the value in the first iteration is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 delta + mult * base
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
419
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 If extend = UNKNOWN, first_special must be false, delta 0, mult 1 and value is
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
421 subreg_{mode} (base + i * step)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
422
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 The get_iv_value function can be used to obtain these expressions.
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
424
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
425 ??? Add a third mode field that would specify the mode in that inner
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
426 computation is done, which would enable it to be different from the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
427 outer one? */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
428
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
429 class rtx_iv
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
430 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431 public:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
432 /* Its base and step (mode of base and step is supposed to be extend_mode,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 see the description above). */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 rtx base, step;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
435
111
kono
parents: 67
diff changeset
436 /* The type of extend applied to it (IV_SIGN_EXTEND, IV_ZERO_EXTEND,
kono
parents: 67
diff changeset
437 or IV_UNKNOWN_EXTEND). */
kono
parents: 67
diff changeset
438 enum iv_extend_code extend;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
439
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 /* Operations applied in the extended mode. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 rtx delta, mult;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
442
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
443 /* The mode it is extended to. */
111
kono
parents: 67
diff changeset
444 scalar_int_mode extend_mode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
445
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
446 /* The mode the variable iterates in. */
111
kono
parents: 67
diff changeset
447 scalar_int_mode mode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
448
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 /* Whether the first iteration needs to be handled specially. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 unsigned first_special : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 };
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 /* The description of an exit from the loop and of the number of iterations
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 till we take the exit. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
455
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
456 class GTY(()) niter_desc
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
457 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
458 public:
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
459 /* The edge out of the loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
460 edge out_edge;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
461
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
462 /* The other edge leading from the condition. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
463 edge in_edge;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
464
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
465 /* True if we are able to say anything about number of iterations of the
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
466 loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
467 bool simple_p;
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 /* True if the loop iterates the constant number of times. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
470 bool const_iter;
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 /* Number of iterations if constant. */
111
kono
parents: 67
diff changeset
473 uint64_t niter;
0
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 /* Assumptions under that the rest of the information is valid. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
476 rtx assumptions;
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 /* Assumptions under that the loop ends before reaching the latch,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
479 even if value of niter_expr says otherwise. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
480 rtx noloop_assumptions;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
481
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
482 /* Condition under that the loop is infinite. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
483 rtx infinite;
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 /* Whether the comparison is signed. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
486 bool signed_p;
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 /* The mode in that niter_expr should be computed. */
111
kono
parents: 67
diff changeset
489 scalar_int_mode mode;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
490
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
491 /* The number of iterations of the loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
492 rtx niter_expr;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
493 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
494
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
495 extern void iv_analysis_loop_init (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
496 extern bool iv_analyze (rtx_insn *, scalar_int_mode, rtx, class rtx_iv *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
497 extern bool iv_analyze_result (rtx_insn *, rtx, class rtx_iv *);
111
kono
parents: 67
diff changeset
498 extern bool iv_analyze_expr (rtx_insn *, scalar_int_mode, rtx,
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
499 class rtx_iv *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
500 extern rtx get_iv_value (class rtx_iv *, rtx);
111
kono
parents: 67
diff changeset
501 extern bool biv_p (rtx_insn *, scalar_int_mode, rtx);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
502 extern void find_simple_exit (class loop *, class niter_desc *);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
503 extern void iv_analysis_done (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
504
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
505 extern class niter_desc *get_simple_loop_desc (class loop *loop);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
506 extern void free_simple_loop_desc (class loop *loop);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
507
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
508 static inline class niter_desc *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
509 simple_loop_desc (class loop *loop)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
510 {
111
kono
parents: 67
diff changeset
511 return loop->simple_loop_desc;
0
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 /* Accessors for the loop structures. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
515
111
kono
parents: 67
diff changeset
516 /* Returns the loop with index NUM from FNs loop tree. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
517
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
518 static inline class loop *
111
kono
parents: 67
diff changeset
519 get_loop (struct function *fn, unsigned num)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
520 {
111
kono
parents: 67
diff changeset
521 return (*loops_for_fn (fn)->larray)[num];
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
522 }
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 /* Returns the number of superloops of LOOP. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
525
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
526 static inline unsigned
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
527 loop_depth (const class loop *loop)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
528 {
111
kono
parents: 67
diff changeset
529 return vec_safe_length (loop->superloops);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
530 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
531
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
532 /* Returns the immediate superloop of LOOP, or NULL if LOOP is the outermost
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
533 loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
534
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
535 static inline class loop *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
536 loop_outer (const class loop *loop)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
537 {
111
kono
parents: 67
diff changeset
538 unsigned n = vec_safe_length (loop->superloops);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
539
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
540 if (n == 0)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
541 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
542
111
kono
parents: 67
diff changeset
543 return (*loop->superloops)[n - 1];
kono
parents: 67
diff changeset
544 }
kono
parents: 67
diff changeset
545
kono
parents: 67
diff changeset
546 /* Returns true if LOOP has at least one exit edge. */
kono
parents: 67
diff changeset
547
kono
parents: 67
diff changeset
548 static inline bool
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 loop_has_exit_edges (const class loop *loop)
111
kono
parents: 67
diff changeset
550 {
kono
parents: 67
diff changeset
551 return loop->exits->next->e != NULL;
0
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
111
kono
parents: 67
diff changeset
554 /* Returns the list of loops in FN. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
555
111
kono
parents: 67
diff changeset
556 inline vec<loop_p, va_gc> *
kono
parents: 67
diff changeset
557 get_loops (struct function *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
558 {
111
kono
parents: 67
diff changeset
559 struct loops *loops = loops_for_fn (fn);
kono
parents: 67
diff changeset
560 if (!loops)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
561 return NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
562
111
kono
parents: 67
diff changeset
563 return loops->larray;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
564 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
565
111
kono
parents: 67
diff changeset
566 /* Returns the number of loops in FN (including the removed
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
567 ones and the fake loop that forms the root of the loop tree). */
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 static inline unsigned
111
kono
parents: 67
diff changeset
570 number_of_loops (struct function *fn)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
571 {
111
kono
parents: 67
diff changeset
572 struct loops *loops = loops_for_fn (fn);
kono
parents: 67
diff changeset
573 if (!loops)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
574 return 0;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
575
111
kono
parents: 67
diff changeset
576 return vec_safe_length (loops->larray);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
577 }
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 /* Returns true if state of the loops satisfies all properties
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
580 described by FLAGS. */
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 static inline bool
111
kono
parents: 67
diff changeset
583 loops_state_satisfies_p (function *fn, unsigned flags)
kono
parents: 67
diff changeset
584 {
kono
parents: 67
diff changeset
585 return (loops_for_fn (fn)->state & flags) == flags;
kono
parents: 67
diff changeset
586 }
kono
parents: 67
diff changeset
587
kono
parents: 67
diff changeset
588 static inline bool
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
589 loops_state_satisfies_p (unsigned flags)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
590 {
111
kono
parents: 67
diff changeset
591 return loops_state_satisfies_p (cfun, flags);
0
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 /* Sets FLAGS to the loops state. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
595
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
596 static inline void
111
kono
parents: 67
diff changeset
597 loops_state_set (function *fn, unsigned flags)
kono
parents: 67
diff changeset
598 {
kono
parents: 67
diff changeset
599 loops_for_fn (fn)->state |= flags;
kono
parents: 67
diff changeset
600 }
kono
parents: 67
diff changeset
601
kono
parents: 67
diff changeset
602 static inline void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
603 loops_state_set (unsigned flags)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
604 {
111
kono
parents: 67
diff changeset
605 loops_state_set (cfun, flags);
0
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
608 /* Clears FLAGS from the loops state. */
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 static inline void
111
kono
parents: 67
diff changeset
611 loops_state_clear (function *fn, unsigned flags)
kono
parents: 67
diff changeset
612 {
kono
parents: 67
diff changeset
613 loops_for_fn (fn)->state &= ~flags;
kono
parents: 67
diff changeset
614 }
kono
parents: 67
diff changeset
615
kono
parents: 67
diff changeset
616 static inline void
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
617 loops_state_clear (unsigned flags)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
618 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
619 if (!current_loops)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
620 return;
111
kono
parents: 67
diff changeset
621 loops_state_clear (cfun, flags);
kono
parents: 67
diff changeset
622 }
kono
parents: 67
diff changeset
623
kono
parents: 67
diff changeset
624 /* Check loop structure invariants, if internal consistency checks are
kono
parents: 67
diff changeset
625 enabled. */
kono
parents: 67
diff changeset
626
kono
parents: 67
diff changeset
627 static inline void
kono
parents: 67
diff changeset
628 checking_verify_loop_structure (void)
kono
parents: 67
diff changeset
629 {
kono
parents: 67
diff changeset
630 /* VERIFY_LOOP_STRUCTURE essentially asserts that no loops need fixups.
kono
parents: 67
diff changeset
631
kono
parents: 67
diff changeset
632 The loop optimizers should never make changes to the CFG which
kono
parents: 67
diff changeset
633 require loop fixups. But the low level CFG manipulation code may
kono
parents: 67
diff changeset
634 set the flag conservatively.
kono
parents: 67
diff changeset
635
kono
parents: 67
diff changeset
636 Go ahead and clear the flag here. That avoids the assert inside
kono
parents: 67
diff changeset
637 VERIFY_LOOP_STRUCTURE, and if there is an inconsistency in the loop
kono
parents: 67
diff changeset
638 structures VERIFY_LOOP_STRUCTURE will detect it.
kono
parents: 67
diff changeset
639
kono
parents: 67
diff changeset
640 This also avoid the compile time cost of excessive fixups. */
kono
parents: 67
diff changeset
641 loops_state_clear (LOOPS_NEED_FIXUP);
kono
parents: 67
diff changeset
642 if (flag_checking)
kono
parents: 67
diff changeset
643 verify_loop_structure ();
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
644 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
645
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
646 /* Loop iterators. */
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 /* Flags for loop iteration. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
649
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
650 enum li_flags
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
651 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
652 LI_INCLUDE_ROOT = 1, /* Include the fake root of the loop tree. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
653 LI_FROM_INNERMOST = 2, /* Iterate over the loops in the reverse order,
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
654 starting from innermost ones. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
655 LI_ONLY_INNERMOST = 4 /* Iterate only over innermost loops. */
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
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
658 /* The iterator for loops. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
659
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
660 class loop_iterator
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
661 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
662 public:
111
kono
parents: 67
diff changeset
663 loop_iterator (function *fn, loop_p *loop, unsigned flags);
kono
parents: 67
diff changeset
664
kono
parents: 67
diff changeset
665 inline loop_p next ();
kono
parents: 67
diff changeset
666
kono
parents: 67
diff changeset
667 /* The function we are visiting. */
kono
parents: 67
diff changeset
668 function *fn;
kono
parents: 67
diff changeset
669
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
670 /* The list of loops to visit. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
671 auto_vec<int, 16> to_visit;
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 /* The index of the actual loop. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
674 unsigned idx;
111
kono
parents: 67
diff changeset
675 };
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
676
111
kono
parents: 67
diff changeset
677 inline loop_p
kono
parents: 67
diff changeset
678 loop_iterator::next ()
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
679 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
680 int anum;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
681
111
kono
parents: 67
diff changeset
682 while (this->to_visit.iterate (this->idx, &anum))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
683 {
111
kono
parents: 67
diff changeset
684 this->idx++;
kono
parents: 67
diff changeset
685 loop_p loop = get_loop (fn, anum);
kono
parents: 67
diff changeset
686 if (loop)
kono
parents: 67
diff changeset
687 return loop;
0
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
111
kono
parents: 67
diff changeset
690 return NULL;
0
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
111
kono
parents: 67
diff changeset
693 inline
kono
parents: 67
diff changeset
694 loop_iterator::loop_iterator (function *fn, loop_p *loop, unsigned flags)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
695 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
696 class loop *aloop;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
697 unsigned i;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
698 int mn;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
699
111
kono
parents: 67
diff changeset
700 this->idx = 0;
kono
parents: 67
diff changeset
701 this->fn = fn;
kono
parents: 67
diff changeset
702 if (!loops_for_fn (fn))
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
703 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
704 *loop = NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
705 return;
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
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
708 this->to_visit.reserve_exact (number_of_loops (fn));
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
709 mn = (flags & LI_INCLUDE_ROOT) ? 0 : 1;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
710
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
711 if (flags & LI_ONLY_INNERMOST)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
712 {
111
kono
parents: 67
diff changeset
713 for (i = 0; vec_safe_iterate (loops_for_fn (fn)->larray, i, &aloop); i++)
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
714 if (aloop != NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
715 && aloop->inner == NULL
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
716 && aloop->num >= mn)
111
kono
parents: 67
diff changeset
717 this->to_visit.quick_push (aloop->num);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
718 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
719 else if (flags & LI_FROM_INNERMOST)
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 /* Push the loops to LI->TO_VISIT in postorder. */
111
kono
parents: 67
diff changeset
722 for (aloop = loops_for_fn (fn)->tree_root;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
723 aloop->inner != NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
724 aloop = aloop->inner)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
725 continue;
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 while (1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
728 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
729 if (aloop->num >= mn)
111
kono
parents: 67
diff changeset
730 this->to_visit.quick_push (aloop->num);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
731
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
732 if (aloop->next)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
733 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
734 for (aloop = aloop->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
735 aloop->inner != NULL;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
736 aloop = aloop->inner)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
737 continue;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
738 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
739 else if (!loop_outer (aloop))
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
740 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
741 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
742 aloop = loop_outer (aloop);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
743 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
744 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
745 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
746 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
747 /* Push the loops to LI->TO_VISIT in preorder. */
111
kono
parents: 67
diff changeset
748 aloop = loops_for_fn (fn)->tree_root;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
749 while (1)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
750 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
751 if (aloop->num >= mn)
111
kono
parents: 67
diff changeset
752 this->to_visit.quick_push (aloop->num);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
753
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
754 if (aloop->inner != NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
755 aloop = aloop->inner;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
756 else
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
757 {
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
758 while (aloop != NULL && aloop->next == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
759 aloop = loop_outer (aloop);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
760 if (aloop == NULL)
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
761 break;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
762 aloop = aloop->next;
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
763 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
764 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
765 }
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
766
111
kono
parents: 67
diff changeset
767 *loop = this->next ();
kono
parents: 67
diff changeset
768 }
kono
parents: 67
diff changeset
769
kono
parents: 67
diff changeset
770 #define FOR_EACH_LOOP(LOOP, FLAGS) \
kono
parents: 67
diff changeset
771 for (loop_iterator li(cfun, &(LOOP), FLAGS); \
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
772 (LOOP); \
111
kono
parents: 67
diff changeset
773 (LOOP) = li.next ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
774
111
kono
parents: 67
diff changeset
775 #define FOR_EACH_LOOP_FN(FN, LOOP, FLAGS) \
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
776 for (loop_iterator li(FN, &(LOOP), FLAGS); \
111
kono
parents: 67
diff changeset
777 (LOOP); \
kono
parents: 67
diff changeset
778 (LOOP) = li.next ())
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
779
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
780 /* The properties of the target. */
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
781 struct target_cfgloop {
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
782 /* Number of available registers. */
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
783 unsigned x_target_avail_regs;
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
784
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
785 /* Number of available registers that are call-clobbered. */
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
786 unsigned x_target_clobbered_regs;
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
787
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
788 /* Number of registers reserved for temporary expressions. */
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
789 unsigned x_target_res_regs;
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
790
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
791 /* The cost for register when there still is some reserve, but we are
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
792 approaching the number of available registers. */
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
793 unsigned x_target_reg_cost[2];
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
794
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
795 /* The cost for register when we need to spill. */
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
796 unsigned x_target_spill_cost[2];
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
797 };
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
798
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
799 extern struct target_cfgloop default_target_cfgloop;
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
800 #if SWITCHABLE_TARGET
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
801 extern struct target_cfgloop *this_target_cfgloop;
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
802 #else
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
803 #define this_target_cfgloop (&default_target_cfgloop)
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
804 #endif
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
805
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
806 #define target_avail_regs \
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
807 (this_target_cfgloop->x_target_avail_regs)
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
808 #define target_clobbered_regs \
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
809 (this_target_cfgloop->x_target_clobbered_regs)
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
810 #define target_res_regs \
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
811 (this_target_cfgloop->x_target_res_regs)
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
812 #define target_reg_cost \
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
813 (this_target_cfgloop->x_target_reg_cost)
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
814 #define target_spill_cost \
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
815 (this_target_cfgloop->x_target_spill_cost)
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 /* Register pressure estimation for induction variable optimizations & loop
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
818 invariant motion. */
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
819 extern unsigned estimate_reg_pressure_cost (unsigned, unsigned, bool, bool);
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
820 extern void init_set_costs (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
821
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
822 /* Loop optimizer initialization. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
823 extern void loop_optimizer_init (unsigned);
111
kono
parents: 67
diff changeset
824 extern void loop_optimizer_finalize (function *);
kono
parents: 67
diff changeset
825 inline void
kono
parents: 67
diff changeset
826 loop_optimizer_finalize ()
kono
parents: 67
diff changeset
827 {
kono
parents: 67
diff changeset
828 loop_optimizer_finalize (cfun);
kono
parents: 67
diff changeset
829 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
830
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
831 /* Optimization passes. */
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
832 enum
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
833 {
111
kono
parents: 67
diff changeset
834 UAP_UNROLL = 1, /* Enables unrolling of loops if it seems profitable. */
kono
parents: 67
diff changeset
835 UAP_UNROLL_ALL = 2 /* Enables unrolling of all loops. */
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
836 };
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
837
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
838 extern void doloop_optimize_loops (void);
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
839 extern void move_loop_invariants (void);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840 extern vec<basic_block> get_loop_hot_path (const class loop *loop);
111
kono
parents: 67
diff changeset
841
kono
parents: 67
diff changeset
842 /* Returns the outermost loop of the loop nest that contains LOOP.*/
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 static inline class loop *
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 loop_outermost (class loop *loop)
111
kono
parents: 67
diff changeset
845 {
kono
parents: 67
diff changeset
846 unsigned n = vec_safe_length (loop->superloops);
kono
parents: 67
diff changeset
847
kono
parents: 67
diff changeset
848 if (n <= 1)
kono
parents: 67
diff changeset
849 return loop;
kono
parents: 67
diff changeset
850
kono
parents: 67
diff changeset
851 return (*loop->superloops)[1];
kono
parents: 67
diff changeset
852 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
853
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
854 extern void record_niter_bound (class loop *, const widest_int &, bool, bool);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
855 extern HOST_WIDE_INT get_estimated_loop_iterations_int (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
856 extern HOST_WIDE_INT get_max_loop_iterations_int (const class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
857 extern HOST_WIDE_INT get_likely_max_loop_iterations_int (class loop *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
858 extern bool get_estimated_loop_iterations (class loop *loop, widest_int *nit);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
859 extern bool get_max_loop_iterations (const class loop *loop, widest_int *nit);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
860 extern bool get_likely_max_loop_iterations (class loop *loop, widest_int *nit);
111
kono
parents: 67
diff changeset
861 extern int bb_loop_depth (const_basic_block);
kono
parents: 67
diff changeset
862
kono
parents: 67
diff changeset
863 /* Converts VAL to widest_int. */
kono
parents: 67
diff changeset
864
kono
parents: 67
diff changeset
865 static inline widest_int
kono
parents: 67
diff changeset
866 gcov_type_to_wide_int (gcov_type val)
kono
parents: 67
diff changeset
867 {
kono
parents: 67
diff changeset
868 HOST_WIDE_INT a[2];
kono
parents: 67
diff changeset
869
kono
parents: 67
diff changeset
870 a[0] = (unsigned HOST_WIDE_INT) val;
kono
parents: 67
diff changeset
871 /* If HOST_BITS_PER_WIDE_INT == HOST_BITS_PER_WIDEST_INT, avoid shifting by
kono
parents: 67
diff changeset
872 the size of type. */
kono
parents: 67
diff changeset
873 val >>= HOST_BITS_PER_WIDE_INT - 1;
kono
parents: 67
diff changeset
874 val >>= 1;
kono
parents: 67
diff changeset
875 a[1] = (unsigned HOST_WIDE_INT) val;
kono
parents: 67
diff changeset
876
kono
parents: 67
diff changeset
877 return widest_int::from_array (a, 2);
kono
parents: 67
diff changeset
878 }
0
a06113de4d67 first commit
kent <kent@cr.ie.u-ryukyu.ac.jp>
parents:
diff changeset
879 #endif /* GCC_CFGLOOP_H */