1 | /* Loop optimization definitions for GNU C-Compiler
|
---|
2 | Copyright (C) 1991, 1995, 1998, 1999, 2000, 2001, 2002
|
---|
3 | Free Software Foundation, Inc.
|
---|
4 |
|
---|
5 | This file is part of GCC.
|
---|
6 |
|
---|
7 | GCC is free software; you can redistribute it and/or modify it under
|
---|
8 | the terms of the GNU General Public License as published by the Free
|
---|
9 | Software Foundation; either version 2, or (at your option) any later
|
---|
10 | version.
|
---|
11 |
|
---|
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
---|
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
---|
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
---|
15 | for more details.
|
---|
16 |
|
---|
17 | You should have received a copy of the GNU General Public License
|
---|
18 | along with GCC; see the file COPYING. If not, write to the Free
|
---|
19 | Software Foundation, 59 Temple Place - Suite 330, Boston, MA
|
---|
20 | 02111-1307, USA. */
|
---|
21 |
|
---|
22 | #include "bitmap.h"
|
---|
23 | #include "sbitmap.h"
|
---|
24 | #include "hard-reg-set.h"
|
---|
25 | #include "basic-block.h"
|
---|
26 |
|
---|
27 | /* Flags passed to loop_optimize. */
|
---|
28 | #define LOOP_UNROLL 1
|
---|
29 | #define LOOP_BCT 2
|
---|
30 | #define LOOP_PREFETCH 4
|
---|
31 | #define LOOP_AUTO_UNROLL 8
|
---|
32 |
|
---|
33 | /* Get the loop info pointer of a loop. */
|
---|
34 | #define LOOP_INFO(LOOP) ((struct loop_info *) (LOOP)->aux)
|
---|
35 |
|
---|
36 | /* Get a pointer to the loop movables structure. */
|
---|
37 | #define LOOP_MOVABLES(LOOP) (&LOOP_INFO (LOOP)->movables)
|
---|
38 |
|
---|
39 | /* Get a pointer to the loop registers structure. */
|
---|
40 | #define LOOP_REGS(LOOP) (&LOOP_INFO (LOOP)->regs)
|
---|
41 |
|
---|
42 | /* Get a pointer to the loop induction variables structure. */
|
---|
43 | #define LOOP_IVS(LOOP) (&LOOP_INFO (LOOP)->ivs)
|
---|
44 |
|
---|
45 | /* Get the luid of an insn. Catch the error of trying to reference the LUID
|
---|
46 | of an insn added during loop, since these don't have LUIDs. */
|
---|
47 |
|
---|
48 | #define INSN_LUID(INSN) \
|
---|
49 | (INSN_UID (INSN) < max_uid_for_loop ? uid_luid[INSN_UID (INSN)] \
|
---|
50 | : (abort (), -1))
|
---|
51 |
|
---|
52 | #define REGNO_FIRST_LUID(REGNO) uid_luid[REGNO_FIRST_UID (REGNO)]
|
---|
53 | #define REGNO_LAST_LUID(REGNO) uid_luid[REGNO_LAST_UID (REGNO)]
|
---|
54 |
|
---|
55 |
|
---|
56 | /* A "basic induction variable" or biv is a pseudo reg that is set
|
---|
57 | (within this loop) only by incrementing or decrementing it. */
|
---|
58 | /* A "general induction variable" or giv is a pseudo reg whose
|
---|
59 | value is a linear function of a biv. */
|
---|
60 |
|
---|
61 | /* Bivs are recognized by `basic_induction_var';
|
---|
62 | Givs by `general_induction_var'. */
|
---|
63 |
|
---|
64 | /* An enum for the two different types of givs, those that are used
|
---|
65 | as memory addresses and those that are calculated into registers. */
|
---|
66 | enum g_types
|
---|
67 | {
|
---|
68 | DEST_ADDR,
|
---|
69 | DEST_REG
|
---|
70 | };
|
---|
71 |
|
---|
72 |
|
---|
73 | /* A `struct induction' is created for every instruction that sets
|
---|
74 | an induction variable (either a biv or a giv). */
|
---|
75 |
|
---|
76 | struct induction
|
---|
77 | {
|
---|
78 | rtx insn; /* The insn that sets a biv or giv */
|
---|
79 | rtx new_reg; /* New register, containing strength reduced
|
---|
80 | version of this giv. */
|
---|
81 | rtx src_reg; /* Biv from which this giv is computed.
|
---|
82 | (If this is a biv, then this is the biv.) */
|
---|
83 | enum g_types giv_type; /* Indicate whether DEST_ADDR or DEST_REG */
|
---|
84 | rtx dest_reg; /* Destination register for insn: this is the
|
---|
85 | register which was the biv or giv.
|
---|
86 | For a biv, this equals src_reg.
|
---|
87 | For a DEST_ADDR type giv, this is 0. */
|
---|
88 | rtx *location; /* Place in the insn where this giv occurs.
|
---|
89 | If GIV_TYPE is DEST_REG, this is 0. */
|
---|
90 | /* For a biv, this is the place where add_val
|
---|
91 | was found. */
|
---|
92 | enum machine_mode mode; /* The mode of this biv or giv */
|
---|
93 | rtx mem; /* For DEST_ADDR, the memory object. */
|
---|
94 | rtx mult_val; /* Multiplicative factor for src_reg. */
|
---|
95 | rtx add_val; /* Additive constant for that product. */
|
---|
96 | int benefit; /* Gain from eliminating this insn. */
|
---|
97 | rtx final_value; /* If the giv is used outside the loop, and its
|
---|
98 | final value could be calculated, it is put
|
---|
99 | here, and the giv is made replaceable. Set
|
---|
100 | the giv to this value before the loop. */
|
---|
101 | unsigned combined_with; /* The number of givs this giv has been
|
---|
102 | combined with. If nonzero, this giv
|
---|
103 | cannot combine with any other giv. */
|
---|
104 | unsigned replaceable : 1; /* 1 if we can substitute the strength-reduced
|
---|
105 | variable for the original variable.
|
---|
106 | 0 means they must be kept separate and the
|
---|
107 | new one must be copied into the old pseudo
|
---|
108 | reg each time the old one is set. */
|
---|
109 | unsigned not_replaceable : 1; /* Used to prevent duplicating work. This is
|
---|
110 | 1 if we know that the giv definitely can
|
---|
111 | not be made replaceable, in which case we
|
---|
112 | don't bother checking the variable again
|
---|
113 | even if further info is available.
|
---|
114 | Both this and the above can be zero. */
|
---|
115 | unsigned ignore : 1; /* 1 prohibits further processing of giv */
|
---|
116 | unsigned always_computable : 1;/* 1 if this value is computable every
|
---|
117 | iteration. */
|
---|
118 | unsigned always_executed : 1; /* 1 if this set occurs each iteration. */
|
---|
119 | unsigned maybe_multiple : 1; /* Only used for a biv and 1 if this biv
|
---|
120 | update may be done multiple times per
|
---|
121 | iteration. */
|
---|
122 | unsigned cant_derive : 1; /* For giv's, 1 if this giv cannot derive
|
---|
123 | another giv. This occurs in many cases
|
---|
124 | where a giv's lifetime spans an update to
|
---|
125 | a biv. */
|
---|
126 | unsigned maybe_dead : 1; /* 1 if this giv might be dead. In that case,
|
---|
127 | we won't use it to eliminate a biv, it
|
---|
128 | would probably lose. */
|
---|
129 | unsigned auto_inc_opt : 1; /* 1 if this giv had its increment output next
|
---|
130 | to it to try to form an auto-inc address. */
|
---|
131 | unsigned unrolled : 1; /* 1 if new register has been allocated and
|
---|
132 | initialized in unrolled loop. */
|
---|
133 | unsigned shared : 1;
|
---|
134 | unsigned no_const_addval : 1; /* 1 if add_val does not contain a const. */
|
---|
135 | int lifetime; /* Length of life of this giv */
|
---|
136 | rtx derive_adjustment; /* If nonzero, is an adjustment to be
|
---|
137 | subtracted from add_val when this giv
|
---|
138 | derives another. This occurs when the
|
---|
139 | giv spans a biv update by incrementation. */
|
---|
140 | rtx ext_dependent; /* If nonzero, is a sign or zero extension
|
---|
141 | if a biv on which this giv is dependent. */
|
---|
142 | struct induction *next_iv; /* For givs, links together all givs that are
|
---|
143 | based on the same biv. For bivs, links
|
---|
144 | together all biv entries that refer to the
|
---|
145 | same biv register. */
|
---|
146 | struct induction *same; /* For givs, if the giv has been combined with
|
---|
147 | another giv, this points to the base giv.
|
---|
148 | The base giv will have COMBINED_WITH nonzero.
|
---|
149 | For bivs, if the biv has the same LOCATION
|
---|
150 | than another biv, this points to the base
|
---|
151 | biv. */
|
---|
152 | HOST_WIDE_INT const_adjust; /* Used by loop unrolling, when an address giv
|
---|
153 | is split, and a constant is eliminated from
|
---|
154 | the address, the -constant is stored here
|
---|
155 | for later use. */
|
---|
156 | struct induction *same_insn; /* If there are multiple identical givs in
|
---|
157 | the same insn, then all but one have this
|
---|
158 | field set, and they all point to the giv
|
---|
159 | that doesn't have this field set. */
|
---|
160 | rtx last_use; /* For a giv made from a biv increment, this is
|
---|
161 | a substitute for the lifetime information. */
|
---|
162 | };
|
---|
163 |
|
---|
164 |
|
---|
165 | /* A `struct iv_class' is created for each biv. */
|
---|
166 |
|
---|
167 | struct iv_class
|
---|
168 | {
|
---|
169 | unsigned int regno; /* Pseudo reg which is the biv. */
|
---|
170 | int biv_count; /* Number of insns setting this reg. */
|
---|
171 | struct induction *biv; /* List of all insns that set this reg. */
|
---|
172 | int giv_count; /* Number of DEST_REG givs computed from this
|
---|
173 | biv. The resulting count is only used in
|
---|
174 | check_dbra_loop. */
|
---|
175 | struct induction *giv; /* List of all insns that compute a giv
|
---|
176 | from this reg. */
|
---|
177 | int total_benefit; /* Sum of BENEFITs of all those givs. */
|
---|
178 | rtx initial_value; /* Value of reg at loop start. */
|
---|
179 | rtx initial_test; /* Test performed on BIV before loop. */
|
---|
180 | rtx final_value; /* Value of reg at loop end, if known. */
|
---|
181 | struct iv_class *next; /* Links all class structures together. */
|
---|
182 | rtx init_insn; /* insn which initializes biv, 0 if none. */
|
---|
183 | rtx init_set; /* SET of INIT_INSN, if any. */
|
---|
184 | unsigned incremented : 1; /* 1 if somewhere incremented/decremented */
|
---|
185 | unsigned eliminable : 1; /* 1 if plausible candidate for
|
---|
186 | elimination. */
|
---|
187 | unsigned nonneg : 1; /* 1 if we added a REG_NONNEG note for
|
---|
188 | this. */
|
---|
189 | unsigned reversed : 1; /* 1 if we reversed the loop that this
|
---|
190 | biv controls. */
|
---|
191 | unsigned all_reduced : 1; /* 1 if all givs using this biv have
|
---|
192 | been reduced. */
|
---|
193 | };
|
---|
194 |
|
---|
195 |
|
---|
196 | /* Definitions used by the basic induction variable discovery code. */
|
---|
197 | enum iv_mode
|
---|
198 | {
|
---|
199 | UNKNOWN_INDUCT,
|
---|
200 | BASIC_INDUCT,
|
---|
201 | NOT_BASIC_INDUCT,
|
---|
202 | GENERAL_INDUCT
|
---|
203 | };
|
---|
204 |
|
---|
205 |
|
---|
206 | /* A `struct iv' is created for every register. */
|
---|
207 |
|
---|
208 | struct iv
|
---|
209 | {
|
---|
210 | enum iv_mode type;
|
---|
211 | union
|
---|
212 | {
|
---|
213 | struct iv_class *class;
|
---|
214 | struct induction *info;
|
---|
215 | } iv;
|
---|
216 | };
|
---|
217 |
|
---|
218 |
|
---|
219 | #define REG_IV_TYPE(ivs, n) ivs->regs[n].type
|
---|
220 | #define REG_IV_INFO(ivs, n) ivs->regs[n].iv.info
|
---|
221 | #define REG_IV_CLASS(ivs, n) ivs->regs[n].iv.class
|
---|
222 |
|
---|
223 |
|
---|
224 | struct loop_ivs
|
---|
225 | {
|
---|
226 | /* Indexed by register number, contains pointer to `struct
|
---|
227 | iv' if register is an induction variable. */
|
---|
228 | struct iv *regs;
|
---|
229 |
|
---|
230 | /* Size of regs array. */
|
---|
231 | unsigned int n_regs;
|
---|
232 |
|
---|
233 | /* The head of a list which links together (via the next field)
|
---|
234 | every iv class for the current loop. */
|
---|
235 | struct iv_class *list;
|
---|
236 | };
|
---|
237 |
|
---|
238 |
|
---|
239 | typedef struct loop_mem_info
|
---|
240 | {
|
---|
241 | rtx mem; /* The MEM itself. */
|
---|
242 | rtx reg; /* Corresponding pseudo, if any. */
|
---|
243 | int optimize; /* Nonzero if we can optimize access to this MEM. */
|
---|
244 | } loop_mem_info;
|
---|
245 |
|
---|
246 |
|
---|
247 |
|
---|
248 | struct loop_reg
|
---|
249 | {
|
---|
250 | /* Number of times the reg is set during the loop being scanned.
|
---|
251 | During code motion, a negative value indicates a reg that has
|
---|
252 | been made a candidate; in particular -2 means that it is an
|
---|
253 | candidate that we know is equal to a constant and -1 means that
|
---|
254 | it is a candidate not known equal to a constant. After code
|
---|
255 | motion, regs moved have 0 (which is accurate now) while the
|
---|
256 | failed candidates have the original number of times set.
|
---|
257 |
|
---|
258 | Therefore, at all times, == 0 indicates an invariant register;
|
---|
259 | < 0 a conditionally invariant one. */
|
---|
260 | int set_in_loop;
|
---|
261 |
|
---|
262 | /* Original value of set_in_loop; same except that this value
|
---|
263 | is not set negative for a reg whose sets have been made candidates
|
---|
264 | and not set to 0 for a reg that is moved. */
|
---|
265 | int n_times_set;
|
---|
266 |
|
---|
267 | /* Contains the insn in which a register was used if it was used
|
---|
268 | exactly once; contains const0_rtx if it was used more than once. */
|
---|
269 | rtx single_usage;
|
---|
270 |
|
---|
271 | /* Nonzero indicates that the register cannot be moved or strength
|
---|
272 | reduced. */
|
---|
273 | char may_not_optimize;
|
---|
274 |
|
---|
275 | /* Nonzero means reg N has already been moved out of one loop.
|
---|
276 | This reduces the desire to move it out of another. */
|
---|
277 | char moved_once;
|
---|
278 | };
|
---|
279 |
|
---|
280 |
|
---|
281 | struct loop_regs
|
---|
282 | {
|
---|
283 | int num; /* Number of regs used in table. */
|
---|
284 | int size; /* Size of table. */
|
---|
285 | struct loop_reg *array; /* Register usage info. array. */
|
---|
286 | int multiple_uses; /* Nonzero if a reg has multiple uses. */
|
---|
287 | };
|
---|
288 |
|
---|
289 |
|
---|
290 |
|
---|
291 | struct loop_movables
|
---|
292 | {
|
---|
293 | /* Head of movable chain. */
|
---|
294 | struct movable *head;
|
---|
295 | /* Last movable in chain. */
|
---|
296 | struct movable *last;
|
---|
297 | };
|
---|
298 |
|
---|
299 |
|
---|
300 | /* Information pertaining to a loop. */
|
---|
301 |
|
---|
302 | struct loop_info
|
---|
303 | {
|
---|
304 | /* Nonzero if there is a subroutine call in the current loop. */
|
---|
305 | int has_call;
|
---|
306 | /* Nonzero if there is a libcall in the current loop. */
|
---|
307 | int has_libcall;
|
---|
308 | /* Nonzero if there is a non constant call in the current loop. */
|
---|
309 | int has_nonconst_call;
|
---|
310 | /* Nonzero if there is a prefetch instruction in the current loop. */
|
---|
311 | int has_prefetch;
|
---|
312 | /* Nonzero if there is a volatile memory reference in the current
|
---|
313 | loop. */
|
---|
314 | int has_volatile;
|
---|
315 | /* Nonzero if there is a tablejump in the current loop. */
|
---|
316 | int has_tablejump;
|
---|
317 | /* Nonzero if there are ways to leave the loop other than falling
|
---|
318 | off the end. */
|
---|
319 | int has_multiple_exit_targets;
|
---|
320 | /* Nonzero if there is an indirect jump in the current function. */
|
---|
321 | int has_indirect_jump;
|
---|
322 | /* Whether loop unrolling has emitted copies of the loop body so
|
---|
323 | that the main loop needs no exit tests. */
|
---|
324 | int preconditioned;
|
---|
325 | /* Register or constant initial loop value. */
|
---|
326 | rtx initial_value;
|
---|
327 | /* Register or constant value used for comparison test. */
|
---|
328 | rtx comparison_value;
|
---|
329 | /* Register or constant approximate final value. */
|
---|
330 | rtx final_value;
|
---|
331 | /* Register or constant initial loop value with term common to
|
---|
332 | final_value removed. */
|
---|
333 | rtx initial_equiv_value;
|
---|
334 | /* Register or constant final loop value with term common to
|
---|
335 | initial_value removed. */
|
---|
336 | rtx final_equiv_value;
|
---|
337 | /* Register corresponding to iteration variable. */
|
---|
338 | rtx iteration_var;
|
---|
339 | /* Constant loop increment. */
|
---|
340 | rtx increment;
|
---|
341 | enum rtx_code comparison_code;
|
---|
342 | /* Holds the number of loop iterations. It is zero if the number
|
---|
343 | could not be calculated. Must be unsigned since the number of
|
---|
344 | iterations can be as high as 2^wordsize - 1. For loops with a
|
---|
345 | wider iterator, this number will be zero if the number of loop
|
---|
346 | iterations is too large for an unsigned integer to hold. */
|
---|
347 | unsigned HOST_WIDE_INT n_iterations;
|
---|
348 | /* The number of times the loop body was unrolled. */
|
---|
349 | unsigned int unroll_number;
|
---|
350 | int used_count_register;
|
---|
351 | /* The loop iterator induction variable. */
|
---|
352 | struct iv_class *iv;
|
---|
353 | /* List of MEMs that are stored in this loop. */
|
---|
354 | rtx store_mems;
|
---|
355 | /* Array of MEMs that are used (read or written) in this loop, but
|
---|
356 | cannot be aliased by anything in this loop, except perhaps
|
---|
357 | themselves. In other words, if mems[i] is altered during
|
---|
358 | the loop, it is altered by an expression that is rtx_equal_p to
|
---|
359 | it. */
|
---|
360 | loop_mem_info *mems;
|
---|
361 | /* The index of the next available slot in MEMS. */
|
---|
362 | int mems_idx;
|
---|
363 | /* The number of elements allocated in MEMS. */
|
---|
364 | int mems_allocated;
|
---|
365 | /* Nonzero if we don't know what MEMs were changed in the current
|
---|
366 | loop. This happens if the loop contains a call (in which case
|
---|
367 | `has_call' will also be set) or if we store into more than
|
---|
368 | NUM_STORES MEMs. */
|
---|
369 | int unknown_address_altered;
|
---|
370 | /* The above doesn't count any readonly memory locations that are
|
---|
371 | stored. This does. */
|
---|
372 | int unknown_constant_address_altered;
|
---|
373 | /* Count of memory write instructions discovered in the loop. */
|
---|
374 | int num_mem_sets;
|
---|
375 | /* The insn where the first of these was found. */
|
---|
376 | rtx first_loop_store_insn;
|
---|
377 | /* The chain of movable insns in loop. */
|
---|
378 | struct loop_movables movables;
|
---|
379 | /* The registers used the in loop. */
|
---|
380 | struct loop_regs regs;
|
---|
381 | /* The induction variable information in loop. */
|
---|
382 | struct loop_ivs ivs;
|
---|
383 | /* Nonzero if call is in pre_header extended basic block. */
|
---|
384 | int pre_header_has_call;
|
---|
385 | };
|
---|
386 |
|
---|
387 |
|
---|
388 | /* Variables declared in loop.c, but also needed in unroll.c. */
|
---|
389 |
|
---|
390 | extern int *uid_luid;
|
---|
391 | extern int max_uid_for_loop;
|
---|
392 | extern unsigned int max_reg_before_loop;
|
---|
393 | extern struct loop **uid_loop;
|
---|
394 | extern FILE *loop_dump_stream;
|
---|
395 |
|
---|
396 |
|
---|
397 | /* Forward declarations for non-static functions declared in loop.c and
|
---|
398 | unroll.c. */
|
---|
399 | int loop_invariant_p PARAMS ((const struct loop *, rtx));
|
---|
400 | rtx get_condition_for_loop PARAMS ((const struct loop *, rtx));
|
---|
401 | void loop_iv_add_mult_hoist PARAMS ((const struct loop *, rtx, rtx, rtx, rtx));
|
---|
402 | void loop_iv_add_mult_sink PARAMS ((const struct loop *, rtx, rtx, rtx, rtx));
|
---|
403 | void loop_iv_add_mult_emit_before PARAMS ((const struct loop *, rtx,
|
---|
404 | rtx, rtx, rtx,
|
---|
405 | basic_block, rtx));
|
---|
406 | rtx express_from PARAMS ((struct induction *, struct induction *));
|
---|
407 | rtx extend_value_for_giv PARAMS ((struct induction *, rtx));
|
---|
408 |
|
---|
409 | void unroll_loop PARAMS ((struct loop *, int, int));
|
---|
410 | rtx biv_total_increment PARAMS ((const struct iv_class *));
|
---|
411 | unsigned HOST_WIDE_INT loop_iterations PARAMS ((struct loop *));
|
---|
412 | int precondition_loop_p PARAMS ((const struct loop *,
|
---|
413 | rtx *, rtx *, rtx *,
|
---|
414 | enum machine_mode *mode));
|
---|
415 | rtx final_biv_value PARAMS ((const struct loop *, struct iv_class *));
|
---|
416 | rtx final_giv_value PARAMS ((const struct loop *, struct induction *));
|
---|
417 | void emit_unrolled_add PARAMS ((rtx, rtx, rtx));
|
---|
418 | int back_branch_in_range_p PARAMS ((const struct loop *, rtx));
|
---|
419 |
|
---|
420 | int loop_insn_first_p PARAMS ((rtx, rtx));
|
---|
421 | typedef rtx (*loop_insn_callback) PARAMS ((struct loop *, rtx, int, int));
|
---|
422 | void for_each_insn_in_loop PARAMS ((struct loop *, loop_insn_callback));
|
---|
423 | rtx loop_insn_emit_before PARAMS((const struct loop *, basic_block,
|
---|
424 | rtx, rtx));
|
---|
425 | rtx loop_insn_sink PARAMS((const struct loop *, rtx));
|
---|
426 | rtx loop_insn_hoist PARAMS((const struct loop *, rtx));
|
---|
427 |
|
---|
428 | /* Forward declarations for non-static functions declared in doloop.c. */
|
---|
429 | int doloop_optimize PARAMS ((const struct loop *));
|
---|