Branch data Line data Source code
1 : : /* RTL-level loop invariant motion.
2 : : Copyright (C) 2004-2024 Free Software Foundation, Inc.
3 : :
4 : : This file is part of GCC.
5 : :
6 : : GCC is free software; you can redistribute it and/or modify it
7 : : under the terms of the GNU General Public License as published by the
8 : : Free Software Foundation; either version 3, or (at your option) any
9 : : later version.
10 : :
11 : : GCC is distributed in the hope that it will be useful, but WITHOUT
12 : : ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 : : for more details.
15 : :
16 : : You should have received a copy of the GNU General Public License
17 : : along with GCC; see the file COPYING3. If not see
18 : : <http://www.gnu.org/licenses/>. */
19 : :
20 : : /* This implements the loop invariant motion pass. It is very simple
21 : : (no calls, no loads/stores, etc.). This should be sufficient to cleanup
22 : : things like address arithmetics -- other more complicated invariants should
23 : : be eliminated on GIMPLE either in tree-ssa-loop-im.cc or in tree-ssa-pre.cc.
24 : :
25 : : We proceed loop by loop -- it is simpler than trying to handle things
26 : : globally and should not lose much. First we inspect all sets inside loop
27 : : and create a dependency graph on insns (saying "to move this insn, you must
28 : : also move the following insns").
29 : :
30 : : We then need to determine what to move. We estimate the number of registers
31 : : used and move as many invariants as possible while we still have enough free
32 : : registers. We prefer the expensive invariants.
33 : :
34 : : Then we move the selected invariants out of the loop, creating a new
35 : : temporaries for them if necessary. */
36 : :
37 : : #include "config.h"
38 : : #include "system.h"
39 : : #include "coretypes.h"
40 : : #include "backend.h"
41 : : #include "target.h"
42 : : #include "rtl.h"
43 : : #include "tree.h"
44 : : #include "cfghooks.h"
45 : : #include "df.h"
46 : : #include "memmodel.h"
47 : : #include "tm_p.h"
48 : : #include "insn-config.h"
49 : : #include "regs.h"
50 : : #include "ira.h"
51 : : #include "recog.h"
52 : : #include "cfgrtl.h"
53 : : #include "cfgloop.h"
54 : : #include "expr.h"
55 : : #include "rtl-iter.h"
56 : : #include "dumpfile.h"
57 : :
58 : : /* The data stored for the loop. */
59 : :
60 : : class loop_data
61 : : {
62 : : public:
63 : : class loop *outermost_exit; /* The outermost exit of the loop. */
64 : : bool has_call; /* True if the loop contains a call. */
65 : : /* Maximal register pressure inside loop for given register class
66 : : (defined only for the pressure classes). */
67 : : int max_reg_pressure[N_REG_CLASSES];
68 : : /* Loop regs referenced and live pseudo-registers. */
69 : : bitmap_head regs_ref;
70 : : bitmap_head regs_live;
71 : : };
72 : :
73 : : #define LOOP_DATA(LOOP) ((class loop_data *) (LOOP)->aux)
74 : :
75 : : /* The description of an use. */
76 : :
77 : : struct use
78 : : {
79 : : rtx *pos; /* Position of the use. */
80 : : rtx_insn *insn; /* The insn in that the use occurs. */
81 : : unsigned addr_use_p; /* Whether the use occurs in an address. */
82 : : struct use *next; /* Next use in the list. */
83 : : };
84 : :
85 : : /* The description of a def. */
86 : :
87 : : struct def
88 : : {
89 : : struct use *uses; /* The list of uses that are uniquely reached
90 : : by it. */
91 : : unsigned n_uses; /* Number of such uses. */
92 : : unsigned n_addr_uses; /* Number of uses in addresses. */
93 : : unsigned invno; /* The corresponding invariant. */
94 : : bool can_prop_to_addr_uses; /* True if the corresponding inv can be
95 : : propagated into its address uses. */
96 : : };
97 : :
98 : : /* The data stored for each invariant. */
99 : :
100 : : struct invariant
101 : : {
102 : : /* The number of the invariant. */
103 : : unsigned invno;
104 : :
105 : : /* The number of the invariant with the same value. */
106 : : unsigned eqto;
107 : :
108 : : /* The number of invariants which eqto this. */
109 : : unsigned eqno;
110 : :
111 : : /* If we moved the invariant out of the loop, the original regno
112 : : that contained its value. */
113 : : int orig_regno;
114 : :
115 : : /* If we moved the invariant out of the loop, the register that contains its
116 : : value. */
117 : : rtx reg;
118 : :
119 : : /* The definition of the invariant. */
120 : : struct def *def;
121 : :
122 : : /* The insn in that it is defined. */
123 : : rtx_insn *insn;
124 : :
125 : : /* Whether it is always executed. */
126 : : bool always_executed;
127 : :
128 : : /* Whether to move the invariant. */
129 : : bool move;
130 : :
131 : : /* Whether the invariant is cheap when used as an address. */
132 : : bool cheap_address;
133 : :
134 : : /* Cost of the invariant. */
135 : : unsigned cost;
136 : :
137 : : /* Used for detecting already visited invariants during determining
138 : : costs of movements. */
139 : : unsigned stamp;
140 : :
141 : : /* The invariants it depends on. */
142 : : bitmap depends_on;
143 : : };
144 : :
145 : : /* Currently processed loop. */
146 : : static class loop *curr_loop;
147 : :
148 : : /* Table of invariants indexed by the df_ref uid field. */
149 : :
150 : : static unsigned int invariant_table_size = 0;
151 : : static struct invariant ** invariant_table;
152 : :
153 : : /* Entry for hash table of invariant expressions. */
154 : :
155 : : struct invariant_expr_entry
156 : : {
157 : : /* The invariant. */
158 : : struct invariant *inv;
159 : :
160 : : /* Its value. */
161 : : rtx expr;
162 : :
163 : : /* Its mode. */
164 : : machine_mode mode;
165 : :
166 : : /* Its hash. */
167 : : hashval_t hash;
168 : : };
169 : :
170 : : /* The actual stamp for marking already visited invariants during determining
171 : : costs of movements. */
172 : :
173 : : static unsigned actual_stamp;
174 : :
175 : : typedef struct invariant *invariant_p;
176 : :
177 : :
178 : : /* The invariants. */
179 : :
180 : : static vec<invariant_p> invariants;
181 : :
182 : : /* Check the size of the invariant table and realloc if necessary. */
183 : :
184 : : static void
185 : 22383511 : check_invariant_table_size (void)
186 : : {
187 : 22383511 : if (invariant_table_size < DF_DEFS_TABLE_SIZE ())
188 : : {
189 : 263616 : unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
190 : 263616 : invariant_table = XRESIZEVEC (struct invariant *, invariant_table, new_size);
191 : 263616 : memset (&invariant_table[invariant_table_size], 0,
192 : 263616 : (new_size - invariant_table_size) * sizeof (struct invariant *));
193 : 263616 : invariant_table_size = new_size;
194 : : }
195 : 22383511 : }
196 : :
197 : : /* Test for possibility of invariantness of X. */
198 : :
199 : : static bool
200 : 17649140 : check_maybe_invariant (rtx x)
201 : : {
202 : 17649140 : enum rtx_code code = GET_CODE (x);
203 : 17649140 : int i, j;
204 : 17649140 : const char *fmt;
205 : :
206 : 17649140 : switch (code)
207 : : {
208 : : CASE_CONST_ANY:
209 : : case SYMBOL_REF:
210 : : case CONST:
211 : : case LABEL_REF:
212 : : return true;
213 : :
214 : : case PC:
215 : : case UNSPEC_VOLATILE:
216 : : case CALL:
217 : : return false;
218 : :
219 : : case REG:
220 : : return true;
221 : :
222 : 1659454 : case MEM:
223 : : /* Load/store motion is done elsewhere. ??? Perhaps also add it here?
224 : : It should not be hard, and might be faster than "elsewhere". */
225 : :
226 : : /* Just handle the most trivial case where we load from an unchanging
227 : : location (most importantly, pic tables). */
228 : 1659454 : if (MEM_READONLY_P (x) && !MEM_VOLATILE_P (x))
229 : : break;
230 : :
231 : : return false;
232 : :
233 : 508 : case ASM_OPERANDS:
234 : : /* Don't mess with insns declared volatile. */
235 : 508 : if (MEM_VOLATILE_P (x))
236 : : return false;
237 : : break;
238 : :
239 : : default:
240 : : break;
241 : : }
242 : :
243 : 4623548 : fmt = GET_RTX_FORMAT (code);
244 : 12991472 : for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
245 : : {
246 : 8500808 : if (fmt[i] == 'e')
247 : : {
248 : 7561923 : if (!check_maybe_invariant (XEXP (x, i)))
249 : : return false;
250 : : }
251 : 938885 : else if (fmt[i] == 'E')
252 : : {
253 : 1557688 : for (j = 0; j < XVECLEN (x, i); j++)
254 : 1201185 : if (!check_maybe_invariant (XVECEXP (x, i, j)))
255 : : return false;
256 : : }
257 : : }
258 : :
259 : : return true;
260 : : }
261 : :
262 : : /* Returns the invariant definition for USE, or NULL if USE is not
263 : : invariant. */
264 : :
265 : : static struct invariant *
266 : 22175866 : invariant_for_use (df_ref use)
267 : : {
268 : 22175866 : struct df_link *defs;
269 : 22175866 : df_ref def;
270 : 22175866 : basic_block bb = DF_REF_BB (use), def_bb;
271 : :
272 : 22175866 : if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
273 : : return NULL;
274 : :
275 : 22127392 : defs = DF_REF_CHAIN (use);
276 : 22127392 : if (!defs || defs->next)
277 : : return NULL;
278 : 15790961 : def = defs->ref;
279 : 15790961 : check_invariant_table_size ();
280 : 15790961 : if (!invariant_table[DF_REF_ID (def)])
281 : : return NULL;
282 : :
283 : 1528061 : def_bb = DF_REF_BB (def);
284 : 1528061 : if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
285 : : return NULL;
286 : 1527735 : return invariant_table[DF_REF_ID (def)];
287 : : }
288 : :
289 : : /* Computes hash value for invariant expression X in INSN. */
290 : :
291 : : static hashval_t
292 : 1773625 : hash_invariant_expr_1 (rtx_insn *insn, rtx x)
293 : : {
294 : 1773625 : enum rtx_code code = GET_CODE (x);
295 : 1773625 : int i, j;
296 : 1773625 : const char *fmt;
297 : 1773625 : hashval_t val = code;
298 : 1773625 : int do_not_record_p;
299 : 1773625 : df_ref use;
300 : 1773625 : struct invariant *inv;
301 : :
302 : 1773625 : switch (code)
303 : : {
304 : 756699 : CASE_CONST_ANY:
305 : 756699 : case SYMBOL_REF:
306 : 756699 : case CONST:
307 : 756699 : case LABEL_REF:
308 : 756699 : return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
309 : :
310 : 707181 : case REG:
311 : 707181 : use = df_find_use (insn, x);
312 : 707181 : if (!use)
313 : 0 : return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
314 : 707181 : inv = invariant_for_use (use);
315 : 707181 : if (!inv)
316 : 458114 : return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
317 : :
318 : 249067 : gcc_assert (inv->eqto != ~0u);
319 : : return inv->eqto;
320 : :
321 : 309745 : default:
322 : 309745 : break;
323 : : }
324 : :
325 : 309745 : fmt = GET_RTX_FORMAT (code);
326 : 883171 : for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
327 : : {
328 : 573426 : if (fmt[i] == 'e')
329 : 520969 : val ^= hash_invariant_expr_1 (insn, XEXP (x, i));
330 : : else if (fmt[i] == 'E')
331 : : {
332 : 7143 : for (j = 0; j < XVECLEN (x, i); j++)
333 : 5970 : val ^= hash_invariant_expr_1 (insn, XVECEXP (x, i, j));
334 : : }
335 : : else if (fmt[i] == 'i' || fmt[i] == 'n')
336 : 268 : val ^= XINT (x, i);
337 : : else if (fmt[i] == 'p')
338 : 8014 : val ^= constant_lower_bound (SUBREG_BYTE (x));
339 : : }
340 : :
341 : : return val;
342 : : }
343 : :
344 : : /* Returns true if the invariant expressions E1 and E2 used in insns INSN1
345 : : and INSN2 have always the same value. */
346 : :
347 : : static bool
348 : 2432918 : invariant_expr_equal_p (rtx_insn *insn1, rtx e1, rtx_insn *insn2, rtx e2)
349 : : {
350 : 2432918 : enum rtx_code code = GET_CODE (e1);
351 : 2432918 : int i, j;
352 : 2432918 : const char *fmt;
353 : 2432918 : df_ref use1, use2;
354 : 2432918 : struct invariant *inv1 = NULL, *inv2 = NULL;
355 : 2432918 : rtx sub1, sub2;
356 : :
357 : : /* If mode of only one of the operands is VOIDmode, it is not equivalent to
358 : : the other one. If both are VOIDmode, we rely on the caller of this
359 : : function to verify that their modes are the same. */
360 : 2432918 : if (code != GET_CODE (e2) || GET_MODE (e1) != GET_MODE (e2))
361 : : return false;
362 : :
363 : 1273088 : switch (code)
364 : : {
365 : 496496 : CASE_CONST_ANY:
366 : 496496 : case SYMBOL_REF:
367 : 496496 : case CONST:
368 : 496496 : case LABEL_REF:
369 : 496496 : return rtx_equal_p (e1, e2);
370 : :
371 : 580017 : case REG:
372 : 580017 : use1 = df_find_use (insn1, e1);
373 : 580017 : use2 = df_find_use (insn2, e2);
374 : 580017 : if (use1)
375 : 580017 : inv1 = invariant_for_use (use1);
376 : 580017 : if (use2)
377 : 580017 : inv2 = invariant_for_use (use2);
378 : :
379 : 580017 : if (!inv1 && !inv2)
380 : 206344 : return rtx_equal_p (e1, e2);
381 : :
382 : 373673 : if (!inv1 || !inv2)
383 : : return false;
384 : :
385 : 275454 : gcc_assert (inv1->eqto != ~0u);
386 : 275454 : gcc_assert (inv2->eqto != ~0u);
387 : 275454 : return inv1->eqto == inv2->eqto;
388 : :
389 : 196575 : default:
390 : 196575 : break;
391 : : }
392 : :
393 : 196575 : fmt = GET_RTX_FORMAT (code);
394 : 251959 : for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
395 : : {
396 : 227658 : if (fmt[i] == 'e')
397 : : {
398 : 195824 : sub1 = XEXP (e1, i);
399 : 195824 : sub2 = XEXP (e2, i);
400 : :
401 : 195824 : if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
402 : : return false;
403 : : }
404 : :
405 : : else if (fmt[i] == 'E')
406 : : {
407 : 750 : if (XVECLEN (e1, i) != XVECLEN (e2, i))
408 : : return false;
409 : :
410 : 2614 : for (j = 0; j < XVECLEN (e1, i); j++)
411 : : {
412 : 2288 : sub1 = XVECEXP (e1, i, j);
413 : 2288 : sub2 = XVECEXP (e2, i, j);
414 : :
415 : 2288 : if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
416 : : return false;
417 : : }
418 : : }
419 : : else if (fmt[i] == 'i' || fmt[i] == 'n')
420 : : {
421 : 106 : if (XINT (e1, i) != XINT (e2, i))
422 : : return false;
423 : : }
424 : : else if (fmt[i] == 'p')
425 : : {
426 : 5232 : if (maybe_ne (SUBREG_BYTE (e1), SUBREG_BYTE (e2)))
427 : : return false;
428 : : }
429 : : /* Unhandled type of subexpression, we fail conservatively. */
430 : : else
431 : : return false;
432 : : }
433 : :
434 : : return true;
435 : : }
436 : :
437 : : struct invariant_expr_hasher : free_ptr_hash <invariant_expr_entry>
438 : : {
439 : : static inline hashval_t hash (const invariant_expr_entry *);
440 : : static inline bool equal (const invariant_expr_entry *,
441 : : const invariant_expr_entry *);
442 : : };
443 : :
444 : : /* Returns hash value for invariant expression entry ENTRY. */
445 : :
446 : : inline hashval_t
447 : 2998841 : invariant_expr_hasher::hash (const invariant_expr_entry *entry)
448 : : {
449 : 2998841 : return entry->hash;
450 : : }
451 : :
452 : : /* Compares invariant expression entries ENTRY1 and ENTRY2. */
453 : :
454 : : inline bool
455 : 3472226 : invariant_expr_hasher::equal (const invariant_expr_entry *entry1,
456 : : const invariant_expr_entry *entry2)
457 : : {
458 : 3472226 : if (entry1->mode != entry2->mode)
459 : : return 0;
460 : :
461 : 2234806 : return invariant_expr_equal_p (entry1->inv->insn, entry1->expr,
462 : 2234806 : entry2->inv->insn, entry2->expr);
463 : : }
464 : :
465 : : typedef hash_table<invariant_expr_hasher> invariant_htab_type;
466 : :
467 : : /* Checks whether invariant with value EXPR in machine mode MODE is
468 : : recorded in EQ. If this is the case, return the invariant. Otherwise
469 : : insert INV to the table for this expression and return INV. */
470 : :
471 : : static struct invariant *
472 : 1246686 : find_or_insert_inv (invariant_htab_type *eq, rtx expr, machine_mode mode,
473 : : struct invariant *inv)
474 : : {
475 : 1246686 : hashval_t hash = hash_invariant_expr_1 (inv->insn, expr);
476 : 1246686 : struct invariant_expr_entry *entry;
477 : 1246686 : struct invariant_expr_entry pentry;
478 : 1246686 : invariant_expr_entry **slot;
479 : :
480 : 1246686 : pentry.expr = expr;
481 : 1246686 : pentry.inv = inv;
482 : 1246686 : pentry.mode = mode;
483 : 1246686 : slot = eq->find_slot_with_hash (&pentry, hash, INSERT);
484 : 1246686 : entry = *slot;
485 : :
486 : 1246686 : if (entry)
487 : 355307 : return entry->inv;
488 : :
489 : 891379 : entry = XNEW (struct invariant_expr_entry);
490 : 891379 : entry->inv = inv;
491 : 891379 : entry->expr = expr;
492 : 891379 : entry->mode = mode;
493 : 891379 : entry->hash = hash;
494 : 891379 : *slot = entry;
495 : :
496 : 891379 : return inv;
497 : : }
498 : :
499 : : /* Finds invariants identical to INV and records the equivalence. EQ is the
500 : : hash table of the invariants. */
501 : :
502 : : static void
503 : 1496127 : find_identical_invariants (invariant_htab_type *eq, struct invariant *inv)
504 : : {
505 : 1496127 : unsigned depno;
506 : 1496127 : bitmap_iterator bi;
507 : 1496127 : struct invariant *dep;
508 : 1496127 : rtx expr, set;
509 : 1496127 : machine_mode mode;
510 : 1496127 : struct invariant *tmp;
511 : :
512 : 1496127 : if (inv->eqto != ~0u)
513 : 249441 : return;
514 : :
515 : 1496127 : EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
516 : : {
517 : 249441 : dep = invariants[depno];
518 : 249441 : find_identical_invariants (eq, dep);
519 : : }
520 : :
521 : 1246686 : set = single_set (inv->insn);
522 : 1246686 : expr = SET_SRC (set);
523 : 1246686 : mode = GET_MODE (expr);
524 : 1246686 : if (mode == VOIDmode)
525 : 361533 : mode = GET_MODE (SET_DEST (set));
526 : :
527 : 1246686 : tmp = find_or_insert_inv (eq, expr, mode, inv);
528 : 1246686 : inv->eqto = tmp->invno;
529 : :
530 : 1246686 : if (tmp->invno != inv->invno && inv->always_executed)
531 : 61769 : tmp->eqno++;
532 : :
533 : 1246686 : if (dump_file && inv->eqto != inv->invno)
534 : 0 : fprintf (dump_file,
535 : : "Invariant %d is equivalent to invariant %d.\n",
536 : : inv->invno, inv->eqto);
537 : : }
538 : :
539 : : /* Find invariants with the same value and record the equivalences. */
540 : :
541 : : static void
542 : 561371 : merge_identical_invariants (void)
543 : : {
544 : 561371 : unsigned i;
545 : 561371 : struct invariant *inv;
546 : 561371 : invariant_htab_type eq (invariants.length ());
547 : :
548 : 2369428 : FOR_EACH_VEC_ELT (invariants, i, inv)
549 : 1246686 : find_identical_invariants (&eq, inv);
550 : 561371 : }
551 : :
552 : : /* Determines the basic blocks inside LOOP that are always executed and
553 : : stores their bitmap to ALWAYS_REACHED. MAY_EXIT is a bitmap of
554 : : basic blocks that may either exit the loop, or contain the call that
555 : : does not have to return. BODY is body of the loop obtained by
556 : : get_loop_body_in_dom_order. */
557 : :
558 : : static void
559 : 1122742 : compute_always_reached (class loop *loop, basic_block *body,
560 : : bitmap may_exit, bitmap always_reached)
561 : : {
562 : 1122742 : unsigned i;
563 : :
564 : 2094088 : for (i = 0; i < loop->num_nodes; i++)
565 : : {
566 : 2080842 : if (dominated_by_p (CDI_DOMINATORS, loop->latch, body[i]))
567 : 1346252 : bitmap_set_bit (always_reached, i);
568 : :
569 : 2080842 : if (bitmap_bit_p (may_exit, i))
570 : : return;
571 : : }
572 : : }
573 : :
574 : : /* Finds exits out of the LOOP with body BODY. Marks blocks in that we may
575 : : exit the loop by cfg edge to HAS_EXIT and MAY_EXIT. In MAY_EXIT
576 : : additionally mark blocks that may exit due to a call. */
577 : :
578 : : static void
579 : 561371 : find_exits (class loop *loop, basic_block *body,
580 : : bitmap may_exit, bitmap has_exit)
581 : : {
582 : 561371 : unsigned i;
583 : 561371 : edge_iterator ei;
584 : 561371 : edge e;
585 : 561371 : class loop *outermost_exit = loop, *aexit;
586 : 561371 : bool has_call = false;
587 : 561371 : rtx_insn *insn;
588 : :
589 : 4066536 : for (i = 0; i < loop->num_nodes; i++)
590 : : {
591 : 3505165 : if (body[i]->loop_father == loop)
592 : : {
593 : 24927452 : FOR_BB_INSNS (body[i], insn)
594 : : {
595 : 22711318 : if (CALL_P (insn)
596 : 22711318 : && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
597 : 468572 : || !RTL_CONST_OR_PURE_CALL_P (insn)))
598 : : {
599 : 425712 : has_call = true;
600 : 425712 : bitmap_set_bit (may_exit, i);
601 : 425712 : break;
602 : : }
603 : : }
604 : :
605 : 6783098 : FOR_EACH_EDGE (e, ei, body[i]->succs)
606 : : {
607 : 4141252 : if (! flow_bb_inside_loop_p (loop, e->dest))
608 : : {
609 : 995519 : bitmap_set_bit (may_exit, i);
610 : 995519 : bitmap_set_bit (has_exit, i);
611 : 995519 : outermost_exit = find_common_loop (outermost_exit,
612 : 995519 : e->dest->loop_father);
613 : : }
614 : : /* If we enter a subloop that might never terminate treat
615 : : it like a possible exit. */
616 : 4141252 : if (flow_loop_nested_p (loop, e->dest->loop_father))
617 : 126310 : bitmap_set_bit (may_exit, i);
618 : : }
619 : 2641846 : continue;
620 : 2641846 : }
621 : :
622 : : /* Use the data stored for the subloop to decide whether we may exit
623 : : through it. It is sufficient to do this for header of the loop,
624 : : as other basic blocks inside it must be dominated by it. */
625 : 863319 : if (body[i]->loop_father->header != body[i])
626 : 670231 : continue;
627 : :
628 : 193088 : if (LOOP_DATA (body[i]->loop_father)->has_call)
629 : : {
630 : 56143 : has_call = true;
631 : 56143 : bitmap_set_bit (may_exit, i);
632 : : }
633 : 193088 : aexit = LOOP_DATA (body[i]->loop_father)->outermost_exit;
634 : 193088 : if (aexit != loop)
635 : : {
636 : 102721 : bitmap_set_bit (may_exit, i);
637 : 102721 : bitmap_set_bit (has_exit, i);
638 : :
639 : 102721 : if (flow_loop_nested_p (aexit, outermost_exit))
640 : 3505165 : outermost_exit = aexit;
641 : : }
642 : : }
643 : :
644 : 561371 : if (loop->aux == NULL)
645 : : {
646 : 561370 : loop->aux = xcalloc (1, sizeof (class loop_data));
647 : 561370 : bitmap_initialize (&LOOP_DATA (loop)->regs_ref, ®_obstack);
648 : 561370 : bitmap_initialize (&LOOP_DATA (loop)->regs_live, ®_obstack);
649 : : }
650 : 561371 : LOOP_DATA (loop)->outermost_exit = outermost_exit;
651 : 561371 : LOOP_DATA (loop)->has_call = has_call;
652 : 561371 : }
653 : :
654 : : /* Check whether we may assign a value to X from a register. */
655 : :
656 : : static bool
657 : 12171706 : may_assign_reg_p (rtx x)
658 : : {
659 : 12171706 : return (GET_MODE (x) != VOIDmode
660 : 12169607 : && GET_MODE (x) != BLKmode
661 : 12149106 : && can_copy_p (GET_MODE (x))
662 : : /* Do not mess with the frame pointer adjustments that can
663 : : be generated e.g. by expand_builtin_setjmp_receiver. */
664 : 10447355 : && x != frame_pointer_rtx
665 : 22619061 : && (!REG_P (x)
666 : 8853064 : || !HARD_REGISTER_P (x)
667 : 1593078 : || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
668 : : }
669 : :
670 : : /* Finds definitions that may correspond to invariants in LOOP with body
671 : : BODY. */
672 : :
673 : : static void
674 : 561371 : find_defs (class loop *loop)
675 : : {
676 : 561371 : if (dump_file)
677 : : {
678 : 21 : fprintf (dump_file,
679 : : "*****starting processing of loop %d ******\n",
680 : : loop->num);
681 : : }
682 : :
683 : 561371 : df_chain_add_problem (DF_UD_CHAIN);
684 : 561371 : df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
685 : 561371 : df_analyze_loop (loop);
686 : 561371 : check_invariant_table_size ();
687 : :
688 : 561371 : if (dump_file)
689 : : {
690 : 21 : df_dump_region (dump_file);
691 : 21 : fprintf (dump_file,
692 : : "*****ending processing of loop %d ******\n",
693 : : loop->num);
694 : : }
695 : 561371 : }
696 : :
697 : : /* Creates a new invariant for definition DEF in INSN, depending on invariants
698 : : in DEPENDS_ON. ALWAYS_EXECUTED is true if the insn is always executed,
699 : : unless the program ends due to a function call. The newly created invariant
700 : : is returned. */
701 : :
702 : : static struct invariant *
703 : 1246686 : create_new_invariant (struct def *def, rtx_insn *insn, bitmap depends_on,
704 : : bool always_executed)
705 : : {
706 : 1246686 : struct invariant *inv = XNEW (struct invariant);
707 : 1246686 : rtx set = single_set (insn);
708 : 1246686 : bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
709 : :
710 : 1246686 : inv->def = def;
711 : 1246686 : inv->always_executed = always_executed;
712 : 1246686 : inv->depends_on = depends_on;
713 : :
714 : : /* If the set is simple, usually by moving it we move the whole store out of
715 : : the loop. Otherwise we save only cost of the computation. */
716 : 1246686 : if (def)
717 : : {
718 : 596784 : inv->cost = set_rtx_cost (set, speed);
719 : : /* ??? Try to determine cheapness of address computation. Unfortunately
720 : : the address cost is only a relative measure, we can't really compare
721 : : it with any absolute number, but only with other address costs.
722 : : But here we don't have any other addresses, so compare with a magic
723 : : number anyway. It has to be large enough to not regress PR33928
724 : : (by avoiding to move reg+8,reg+16,reg+24 invariants), but small
725 : : enough to not regress 410.bwaves either (by still moving reg+reg
726 : : invariants).
727 : : See http://gcc.gnu.org/ml/gcc-patches/2009-10/msg01210.html . */
728 : 596784 : if (SCALAR_INT_MODE_P (GET_MODE (SET_DEST (set))))
729 : 456128 : inv->cheap_address = address_cost (SET_SRC (set), word_mode,
730 : 456128 : ADDR_SPACE_GENERIC, speed) < 3;
731 : : else
732 : 140656 : inv->cheap_address = false;
733 : : }
734 : : else
735 : : {
736 : 649902 : inv->cost = set_src_cost (SET_SRC (set), GET_MODE (SET_DEST (set)),
737 : : speed);
738 : 649902 : inv->cheap_address = false;
739 : : }
740 : :
741 : 1246686 : inv->move = false;
742 : 1246686 : inv->reg = NULL_RTX;
743 : 1246686 : inv->orig_regno = -1;
744 : 1246686 : inv->stamp = 0;
745 : 1246686 : inv->insn = insn;
746 : :
747 : 1246686 : inv->invno = invariants.length ();
748 : 1246686 : inv->eqto = ~0u;
749 : :
750 : : /* Itself. */
751 : 1246686 : inv->eqno = 1;
752 : :
753 : 1246686 : if (def)
754 : 596784 : def->invno = inv->invno;
755 : 1246686 : invariants.safe_push (inv);
756 : :
757 : 1246686 : if (dump_file)
758 : : {
759 : 13 : fprintf (dump_file,
760 : : "Set in insn %d is invariant (%d), cost %d, depends on ",
761 : 13 : INSN_UID (insn), inv->invno, inv->cost);
762 : 13 : dump_bitmap (dump_file, inv->depends_on);
763 : : }
764 : :
765 : 1246686 : return inv;
766 : : }
767 : :
768 : : /* Return a canonical version of X for the address, from the point of view,
769 : : that all multiplications are represented as MULT instead of the multiply
770 : : by a power of 2 being represented as ASHIFT.
771 : :
772 : : Callers should prepare a copy of X because this function may modify it
773 : : in place. */
774 : :
775 : : static void
776 : 24874 : canonicalize_address_mult (rtx x)
777 : : {
778 : 24874 : subrtx_var_iterator::array_type array;
779 : 176320 : FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
780 : : {
781 : 151446 : rtx sub = *iter;
782 : 151446 : scalar_int_mode sub_mode;
783 : 262022 : if (is_a <scalar_int_mode> (GET_MODE (sub), &sub_mode)
784 : 110576 : && GET_CODE (sub) == ASHIFT
785 : 187 : && CONST_INT_P (XEXP (sub, 1))
786 : 374 : && INTVAL (XEXP (sub, 1)) < GET_MODE_BITSIZE (sub_mode)
787 : 187 : && INTVAL (XEXP (sub, 1)) >= 0)
788 : : {
789 : 187 : HOST_WIDE_INT shift = INTVAL (XEXP (sub, 1));
790 : 187 : PUT_CODE (sub, MULT);
791 : 187 : XEXP (sub, 1) = gen_int_mode (HOST_WIDE_INT_1 << shift, sub_mode);
792 : 187 : iter.skip_subrtxes ();
793 : : }
794 : : }
795 : 24874 : }
796 : :
797 : : /* Maximum number of sub expressions in address. We set it to
798 : : a small integer since it's unlikely to have a complicated
799 : : address expression. */
800 : :
801 : : #define MAX_CANON_ADDR_PARTS (5)
802 : :
803 : : /* Collect sub expressions in address X with PLUS as the seperator.
804 : : Sub expressions are stored in vector ADDR_PARTS. */
805 : :
806 : : static void
807 : 24874 : collect_address_parts (rtx x, vec<rtx> *addr_parts)
808 : : {
809 : 24874 : subrtx_var_iterator::array_type array;
810 : 143412 : FOR_EACH_SUBRTX_VAR (iter, array, x, NONCONST)
811 : : {
812 : 118538 : rtx sub = *iter;
813 : :
814 : 118538 : if (GET_CODE (sub) != PLUS)
815 : : {
816 : 71706 : addr_parts->safe_push (sub);
817 : 71706 : iter.skip_subrtxes ();
818 : : }
819 : : }
820 : 24874 : }
821 : :
822 : : /* Compare function for sorting sub expressions X and Y based on
823 : : precedence defined for communitive operations. */
824 : :
825 : : static int
826 : 253643 : compare_address_parts (const void *x, const void *y)
827 : : {
828 : 253643 : const rtx *rx = (const rtx *)x;
829 : 253643 : const rtx *ry = (const rtx *)y;
830 : 253643 : int px = commutative_operand_precedence (*rx);
831 : 253643 : int py = commutative_operand_precedence (*ry);
832 : :
833 : 253643 : return (py - px);
834 : : }
835 : :
836 : : /* Return a canonical version address for X by following steps:
837 : : 1) Rewrite ASHIFT into MULT recursively.
838 : : 2) Divide address into sub expressions with PLUS as the
839 : : separator.
840 : : 3) Sort sub expressions according to precedence defined
841 : : for communative operations.
842 : : 4) Simplify CONST_INT_P sub expressions.
843 : : 5) Create new canonicalized address and return.
844 : : Callers should prepare a copy of X because this function may
845 : : modify it in place. */
846 : :
847 : : static rtx
848 : 24874 : canonicalize_address (rtx x)
849 : : {
850 : 24874 : rtx res;
851 : 24874 : unsigned int i, j;
852 : 24874 : machine_mode mode = GET_MODE (x);
853 : 24874 : auto_vec<rtx, MAX_CANON_ADDR_PARTS> addr_parts;
854 : :
855 : : /* Rewrite ASHIFT into MULT. */
856 : 24874 : canonicalize_address_mult (x);
857 : : /* Divide address into sub expressions. */
858 : 24874 : collect_address_parts (x, &addr_parts);
859 : : /* Unlikely to have very complicated address. */
860 : 49748 : if (addr_parts.length () < 2
861 : 24874 : || addr_parts.length () > MAX_CANON_ADDR_PARTS)
862 : : return x;
863 : :
864 : : /* Sort sub expressions according to canonicalization precedence. */
865 : 24838 : addr_parts.qsort (compare_address_parts);
866 : :
867 : : /* Simplify all constant int summary if possible. */
868 : 167824 : for (i = 0; i < addr_parts.length (); i++)
869 : 69717 : if (CONST_INT_P (addr_parts[i]))
870 : : break;
871 : :
872 : 53582 : for (j = i + 1; j < addr_parts.length (); j++)
873 : : {
874 : 1953 : gcc_assert (CONST_INT_P (addr_parts[j]));
875 : 1953 : addr_parts[i] = simplify_gen_binary (PLUS, mode,
876 : 1953 : addr_parts[i],
877 : 1953 : addr_parts[j]);
878 : : }
879 : :
880 : : /* Chain PLUS operators to the left for !CONST_INT_P sub expressions. */
881 : 24838 : res = addr_parts[0];
882 : 46669 : for (j = 1; j < i; j++)
883 : 21831 : res = simplify_gen_binary (PLUS, mode, res, addr_parts[j]);
884 : :
885 : : /* Pickup the last CONST_INT_P sub expression. */
886 : 49676 : if (i < addr_parts.length ())
887 : 23062 : res = simplify_gen_binary (PLUS, mode, res, addr_parts[i]);
888 : :
889 : : return res;
890 : 24874 : }
891 : :
892 : : /* Given invariant DEF and its address USE, check if the corresponding
893 : : invariant expr can be propagated into the use or not. */
894 : :
895 : : static bool
896 : 45530 : inv_can_prop_to_addr_use (struct def *def, df_ref use)
897 : : {
898 : 45530 : struct invariant *inv;
899 : 45530 : rtx *pos = DF_REF_REAL_LOC (use), def_set, use_set;
900 : 45530 : rtx_insn *use_insn = DF_REF_INSN (use);
901 : 45530 : rtx_insn *def_insn;
902 : 45530 : bool ok;
903 : :
904 : 45530 : inv = invariants[def->invno];
905 : : /* No need to check if address expression is expensive. */
906 : 45530 : if (!inv->cheap_address)
907 : : return false;
908 : :
909 : 39843 : def_insn = inv->insn;
910 : 39843 : def_set = single_set (def_insn);
911 : 39843 : if (!def_set)
912 : : return false;
913 : :
914 : 39843 : validate_unshare_change (use_insn, pos, SET_SRC (def_set), true);
915 : 39843 : ok = verify_changes (0);
916 : : /* Try harder with canonicalization in address expression. */
917 : 39843 : if (!ok && (use_set = single_set (use_insn)) != NULL_RTX)
918 : : {
919 : 28750 : rtx src, dest, mem = NULL_RTX;
920 : :
921 : 28750 : src = SET_SRC (use_set);
922 : 28750 : dest = SET_DEST (use_set);
923 : 28750 : if (MEM_P (src))
924 : : mem = src;
925 : 7709 : else if (MEM_P (dest))
926 : : mem = dest;
927 : :
928 : : if (mem != NULL_RTX
929 : 54222 : && !memory_address_addr_space_p (GET_MODE (mem),
930 : : XEXP (mem, 0),
931 : 25472 : MEM_ADDR_SPACE (mem)))
932 : : {
933 : 24874 : rtx addr = canonicalize_address (copy_rtx (XEXP (mem, 0)));
934 : 49748 : if (memory_address_addr_space_p (GET_MODE (mem),
935 : 24874 : addr, MEM_ADDR_SPACE (mem)))
936 : 39843 : ok = true;
937 : : }
938 : : }
939 : 39843 : cancel_changes (0);
940 : 39843 : return ok;
941 : : }
942 : :
943 : : /* Record USE at DEF. */
944 : :
945 : : static void
946 : 629541 : record_use (struct def *def, df_ref use)
947 : : {
948 : 629541 : struct use *u = XNEW (struct use);
949 : :
950 : 629541 : u->pos = DF_REF_REAL_LOC (use);
951 : 629541 : u->insn = DF_REF_INSN (use);
952 : 629541 : u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
953 : 629541 : || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
954 : 629541 : u->next = def->uses;
955 : 629541 : def->uses = u;
956 : 629541 : def->n_uses++;
957 : 629541 : if (u->addr_use_p)
958 : : {
959 : : /* Initialize propagation information if this is the first addr
960 : : use of the inv def. */
961 : 49132 : if (def->n_addr_uses == 0)
962 : 41100 : def->can_prop_to_addr_uses = true;
963 : :
964 : 49132 : def->n_addr_uses++;
965 : 49132 : if (def->can_prop_to_addr_uses && !inv_can_prop_to_addr_use (def, use))
966 : 11571 : def->can_prop_to_addr_uses = false;
967 : : }
968 : 629541 : }
969 : :
970 : : /* Finds the invariants USE depends on and store them to the DEPENDS_ON
971 : : bitmap. Returns true if all dependencies of USE are known to be
972 : : loop invariants, false otherwise. */
973 : :
974 : : static bool
975 : 6599842 : check_dependency (basic_block bb, df_ref use, bitmap depends_on)
976 : : {
977 : 6599842 : df_ref def;
978 : 6599842 : basic_block def_bb;
979 : 6599842 : struct df_link *defs;
980 : 6599842 : struct def *def_data;
981 : 6599842 : struct invariant *inv;
982 : :
983 : 6599842 : if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
984 : : return false;
985 : :
986 : 6563342 : defs = DF_REF_CHAIN (use);
987 : 6563342 : if (!defs)
988 : : {
989 : 1211550 : unsigned int regno = DF_REF_REGNO (use);
990 : :
991 : : /* If this is the use of an uninitialized argument register that is
992 : : likely to be spilled, do not move it lest this might extend its
993 : : lifetime and cause reload to die. This can occur for a call to
994 : : a function taking complex number arguments and moving the insns
995 : : preparing the arguments without moving the call itself wouldn't
996 : : gain much in practice. */
997 : 1211550 : if ((DF_REF_FLAGS (use) & DF_HARD_REG_LIVE)
998 : 553 : && FUNCTION_ARG_REGNO_P (regno)
999 : 1211555 : && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
1000 : : return false;
1001 : :
1002 : 1211549 : return true;
1003 : : }
1004 : :
1005 : 5351792 : if (defs->next)
1006 : : return false;
1007 : :
1008 : 4873024 : def = defs->ref;
1009 : 4873024 : check_invariant_table_size ();
1010 : 4873024 : inv = invariant_table[DF_REF_ID (def)];
1011 : 4873024 : if (!inv)
1012 : : return false;
1013 : :
1014 : 273640 : def_data = inv->def;
1015 : 273640 : gcc_assert (def_data != NULL);
1016 : :
1017 : 273640 : def_bb = DF_REF_BB (def);
1018 : : /* Note that in case bb == def_bb, we know that the definition
1019 : : dominates insn, because def has invariant_table[DF_REF_ID(def)]
1020 : : defined and we process the insns in the basic block bb
1021 : : sequentially. */
1022 : 273640 : if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
1023 : : return false;
1024 : :
1025 : 273551 : bitmap_set_bit (depends_on, def_data->invno);
1026 : 273551 : return true;
1027 : : }
1028 : :
1029 : :
1030 : : /* Finds the invariants INSN depends on and store them to the DEPENDS_ON
1031 : : bitmap. Returns true if all dependencies of INSN are known to be
1032 : : loop invariants, false otherwise. */
1033 : :
1034 : : static bool
1035 : 6361428 : check_dependencies (rtx_insn *insn, bitmap depends_on)
1036 : : {
1037 : 6361428 : struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
1038 : 6361428 : df_ref use;
1039 : 6361428 : basic_block bb = BLOCK_FOR_INSN (insn);
1040 : :
1041 : 7714867 : FOR_EACH_INSN_INFO_USE (use, insn_info)
1042 : 6468181 : if (!check_dependency (bb, use, depends_on))
1043 : : return false;
1044 : 1378347 : FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
1045 : 131661 : if (!check_dependency (bb, use, depends_on))
1046 : : return false;
1047 : :
1048 : : return true;
1049 : : }
1050 : :
1051 : : /* Pre-check candidate DEST to skip the one which cannot make a valid insn
1052 : : during move_invariant_reg. SIMPLE is to skip HARD_REGISTER. */
1053 : : static bool
1054 : 10447355 : pre_check_invariant_p (bool simple, rtx dest)
1055 : : {
1056 : 10447355 : if (simple && REG_P (dest) && DF_REG_DEF_COUNT (REGNO (dest)) > 1)
1057 : : {
1058 : 2305838 : df_ref use;
1059 : 2305838 : unsigned int i = REGNO (dest);
1060 : 2305838 : struct df_insn_info *insn_info;
1061 : 2305838 : df_ref def_rec;
1062 : :
1063 : 10646092 : for (use = DF_REG_USE_CHAIN (i); use; use = DF_REF_NEXT_REG (use))
1064 : : {
1065 : 9931797 : rtx_insn *ref = DF_REF_INSN (use);
1066 : 9931797 : insn_info = DF_INSN_INFO_GET (ref);
1067 : :
1068 : 17595848 : FOR_EACH_INSN_INFO_DEF (def_rec, insn_info)
1069 : 9255594 : if (DF_REF_REGNO (def_rec) == i)
1070 : : {
1071 : : /* Multi definitions at this stage, most likely are due to
1072 : : instruction constraints, which requires both read and write
1073 : : on the same register. Since move_invariant_reg is not
1074 : : powerful enough to handle such cases, just ignore the INV
1075 : : and leave the chance to others. */
1076 : : return false;
1077 : : }
1078 : : }
1079 : : }
1080 : : return true;
1081 : : }
1082 : :
1083 : : /* Finds invariant in INSN. ALWAYS_REACHED is true if the insn is always
1084 : : executed. ALWAYS_EXECUTED is true if the insn is always executed,
1085 : : unless the program ends due to a function call. */
1086 : :
1087 : : static void
1088 : 14133172 : find_invariant_insn (rtx_insn *insn, bool always_reached, bool always_executed)
1089 : : {
1090 : 14133172 : df_ref ref;
1091 : 14133172 : struct def *def;
1092 : 14133172 : bitmap depends_on;
1093 : 14133172 : rtx set, dest;
1094 : 14133172 : bool simple = true;
1095 : 14133172 : struct invariant *inv;
1096 : :
1097 : : /* Jumps have control flow side-effects. */
1098 : 14133172 : if (JUMP_P (insn))
1099 : : return;
1100 : :
1101 : 12521901 : set = single_set (insn);
1102 : 12521901 : if (!set)
1103 : : return;
1104 : 12171706 : dest = SET_DEST (set);
1105 : :
1106 : 12171706 : if (!REG_P (dest)
1107 : 12171706 : || HARD_REGISTER_P (dest))
1108 : : simple = false;
1109 : :
1110 : 12171706 : if (!may_assign_reg_p (dest)
1111 : 10447355 : || !pre_check_invariant_p (simple, dest)
1112 : 21027518 : || !check_maybe_invariant (SET_SRC (set)))
1113 : : return;
1114 : :
1115 : : /* If the insn can throw exception, we cannot move it at all without changing
1116 : : cfg. */
1117 : 6964782 : if (can_throw_internal (insn))
1118 : : return;
1119 : :
1120 : : /* We cannot make trapping insn executed, unless it was executed before. */
1121 : 6957580 : if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
1122 : : return;
1123 : :
1124 : 6361428 : depends_on = BITMAP_ALLOC (NULL);
1125 : 6361428 : if (!check_dependencies (insn, depends_on))
1126 : : {
1127 : 5114742 : BITMAP_FREE (depends_on);
1128 : 5114742 : return;
1129 : : }
1130 : :
1131 : 1246686 : if (simple)
1132 : 596784 : def = XCNEW (struct def);
1133 : : else
1134 : : def = NULL;
1135 : :
1136 : 1246686 : inv = create_new_invariant (def, insn, depends_on, always_executed);
1137 : :
1138 : 1246686 : if (simple)
1139 : : {
1140 : 596784 : ref = df_find_def (insn, dest);
1141 : 596784 : check_invariant_table_size ();
1142 : 596784 : invariant_table[DF_REF_ID (ref)] = inv;
1143 : : }
1144 : : }
1145 : :
1146 : : /* Record registers used in INSN that have a unique invariant definition. */
1147 : :
1148 : : static void
1149 : 14133172 : record_uses (rtx_insn *insn)
1150 : : {
1151 : 14133172 : struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
1152 : 14133172 : df_ref use;
1153 : 14133172 : struct invariant *inv;
1154 : :
1155 : 34027512 : FOR_EACH_INSN_INFO_USE (use, insn_info)
1156 : : {
1157 : 19894340 : inv = invariant_for_use (use);
1158 : 19894340 : if (inv)
1159 : 628761 : record_use (inv->def, use);
1160 : : }
1161 : 14547483 : FOR_EACH_INSN_INFO_EQ_USE (use, insn_info)
1162 : : {
1163 : 414311 : inv = invariant_for_use (use);
1164 : 414311 : if (inv)
1165 : 780 : record_use (inv->def, use);
1166 : : }
1167 : 14133172 : }
1168 : :
1169 : : /* Finds invariants in INSN. ALWAYS_REACHED is true if the insn is always
1170 : : executed. ALWAYS_EXECUTED is true if the insn is always executed,
1171 : : unless the program ends due to a function call. */
1172 : :
1173 : : static void
1174 : 14133172 : find_invariants_insn (rtx_insn *insn, bool always_reached, bool always_executed)
1175 : : {
1176 : 0 : find_invariant_insn (insn, always_reached, always_executed);
1177 : 14133172 : record_uses (insn);
1178 : 0 : }
1179 : :
1180 : : /* Finds invariants in basic block BB. ALWAYS_REACHED is true if the
1181 : : basic block is always executed. ALWAYS_EXECUTED is true if the basic
1182 : : block is always executed, unless the program ends due to a function
1183 : : call. */
1184 : :
1185 : : static void
1186 : 3505165 : find_invariants_bb (class loop *loop, basic_block bb, bool always_reached,
1187 : : bool always_executed)
1188 : : {
1189 : 3505165 : rtx_insn *insn;
1190 : 3505165 : basic_block preheader = loop_preheader_edge (loop)->src;
1191 : :
1192 : : /* Don't move insn of cold BB out of loop to preheader to reduce calculations
1193 : : and register live range in hot loop with cold BB. */
1194 : 3505165 : if (!always_executed && preheader->count > bb->count)
1195 : : {
1196 : 545007 : if (dump_file)
1197 : 2 : fprintf (dump_file, "Don't move invariant from bb: %d out of loop %d\n",
1198 : : bb->index, loop->num);
1199 : 545007 : return;
1200 : : }
1201 : :
1202 : 32734592 : FOR_BB_INSNS (bb, insn)
1203 : : {
1204 : 29774434 : if (!NONDEBUG_INSN_P (insn))
1205 : 15641262 : continue;
1206 : :
1207 : 14133172 : find_invariants_insn (insn, always_reached, always_executed);
1208 : :
1209 : 14133172 : if (always_reached
1210 : 3452726 : && CALL_P (insn)
1211 : 14240239 : && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
1212 : 106600 : || ! RTL_CONST_OR_PURE_CALL_P (insn)))
1213 : : always_reached = false;
1214 : : }
1215 : : }
1216 : :
1217 : : /* Finds invariants in LOOP with body BODY. ALWAYS_REACHED is the bitmap of
1218 : : basic blocks in BODY that are always executed. ALWAYS_EXECUTED is the
1219 : : bitmap of basic blocks in BODY that are always executed unless the program
1220 : : ends due to a function call. */
1221 : :
1222 : : static void
1223 : 561371 : find_invariants_body (class loop *loop, basic_block *body,
1224 : : bitmap always_reached, bitmap always_executed)
1225 : : {
1226 : 561371 : unsigned i;
1227 : :
1228 : 4066536 : for (i = 0; i < loop->num_nodes; i++)
1229 : 3505165 : find_invariants_bb (loop, body[i], bitmap_bit_p (always_reached, i),
1230 : 3505165 : bitmap_bit_p (always_executed, i));
1231 : 561371 : }
1232 : :
1233 : : /* Finds invariants in LOOP. */
1234 : :
1235 : : static void
1236 : 561371 : find_invariants (class loop *loop)
1237 : : {
1238 : 561371 : auto_bitmap may_exit;
1239 : 561371 : auto_bitmap always_reached;
1240 : 561371 : auto_bitmap has_exit;
1241 : 561371 : auto_bitmap always_executed;
1242 : 561371 : basic_block *body = get_loop_body_in_dom_order (loop);
1243 : :
1244 : 561371 : find_exits (loop, body, may_exit, has_exit);
1245 : 561371 : compute_always_reached (loop, body, may_exit, always_reached);
1246 : 561371 : compute_always_reached (loop, body, has_exit, always_executed);
1247 : :
1248 : 561371 : find_defs (loop);
1249 : 561371 : find_invariants_body (loop, body, always_reached, always_executed);
1250 : 561371 : merge_identical_invariants ();
1251 : :
1252 : 561371 : free (body);
1253 : 561371 : }
1254 : :
1255 : : /* Frees a list of uses USE. */
1256 : :
1257 : : static void
1258 : 596784 : free_use_list (struct use *use)
1259 : : {
1260 : 596784 : struct use *next;
1261 : :
1262 : 1226325 : for (; use; use = next)
1263 : : {
1264 : 629541 : next = use->next;
1265 : 629541 : free (use);
1266 : : }
1267 : 0 : }
1268 : :
1269 : : /* Return pressure class and number of hard registers (through *NREGS)
1270 : : for destination of INSN. */
1271 : : static enum reg_class
1272 : 19 : get_pressure_class_and_nregs (rtx_insn *insn, int *nregs)
1273 : : {
1274 : 19 : rtx reg;
1275 : 19 : enum reg_class pressure_class;
1276 : 19 : rtx set = single_set (insn);
1277 : :
1278 : : /* Considered invariant insns have only one set. */
1279 : 19 : gcc_assert (set != NULL_RTX);
1280 : 19 : reg = SET_DEST (set);
1281 : 19 : if (GET_CODE (reg) == SUBREG)
1282 : 0 : reg = SUBREG_REG (reg);
1283 : 19 : if (MEM_P (reg))
1284 : : {
1285 : 2 : *nregs = 0;
1286 : 2 : pressure_class = NO_REGS;
1287 : : }
1288 : : else
1289 : : {
1290 : 17 : if (! REG_P (reg))
1291 : : reg = NULL_RTX;
1292 : 17 : if (reg == NULL_RTX)
1293 : : pressure_class = GENERAL_REGS;
1294 : : else
1295 : : {
1296 : 17 : pressure_class = reg_allocno_class (REGNO (reg));
1297 : 17 : pressure_class = ira_pressure_class_translate[pressure_class];
1298 : : }
1299 : 17 : *nregs
1300 : 17 : = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
1301 : : }
1302 : 19 : return pressure_class;
1303 : : }
1304 : :
1305 : : /* Calculates cost and number of registers needed for moving invariant INV
1306 : : out of the loop and stores them to *COST and *REGS_NEEDED. *CL will be
1307 : : the REG_CLASS of INV. Return
1308 : : -1: if INV is invalid.
1309 : : 0: if INV and its depends_on have same reg_class
1310 : : 1: if INV and its depends_on have different reg_classes. */
1311 : :
1312 : : static int
1313 : 2890713 : get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed,
1314 : : enum reg_class *cl)
1315 : : {
1316 : 2890713 : int i, acomp_cost;
1317 : 2890713 : unsigned aregs_needed[N_REG_CLASSES];
1318 : 2890713 : unsigned depno;
1319 : 2890713 : struct invariant *dep;
1320 : 2890713 : bitmap_iterator bi;
1321 : 2890713 : int ret = 1;
1322 : :
1323 : : /* Find the representative of the class of the equivalent invariants. */
1324 : 2890713 : inv = invariants[inv->eqto];
1325 : :
1326 : 2890713 : *comp_cost = 0;
1327 : 2890713 : if (! flag_ira_loop_pressure)
1328 : 2890694 : regs_needed[0] = 0;
1329 : : else
1330 : : {
1331 : 95 : for (i = 0; i < ira_pressure_classes_num; i++)
1332 : 76 : regs_needed[ira_pressure_classes[i]] = 0;
1333 : : }
1334 : :
1335 : 2890713 : if (inv->move
1336 : 2887751 : || inv->stamp == actual_stamp)
1337 : : return -1;
1338 : 2885745 : inv->stamp = actual_stamp;
1339 : :
1340 : 2885745 : if (! flag_ira_loop_pressure)
1341 : 2885726 : regs_needed[0]++;
1342 : : else
1343 : : {
1344 : 19 : int nregs;
1345 : 19 : enum reg_class pressure_class;
1346 : :
1347 : 19 : pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1348 : 19 : regs_needed[pressure_class] += nregs;
1349 : 19 : *cl = pressure_class;
1350 : 19 : ret = 0;
1351 : : }
1352 : :
1353 : 2885745 : if (!inv->cheap_address
1354 : 1000145 : || inv->def->n_uses == 0
1355 : 796206 : || inv->def->n_addr_uses < inv->def->n_uses
1356 : : /* Count cost if the inv can't be propagated into address uses. */
1357 : 64597 : || !inv->def->can_prop_to_addr_uses)
1358 : 2828537 : (*comp_cost) += inv->cost * inv->eqno;
1359 : :
1360 : : #ifdef STACK_REGS
1361 : 2885745 : {
1362 : : /* Hoisting constant pool constants into stack regs may cost more than
1363 : : just single register. On x87, the balance is affected both by the
1364 : : small number of FP registers, and by its register stack organization,
1365 : : that forces us to add compensation code in and around the loop to
1366 : : shuffle the operands to the top of stack before use, and pop them
1367 : : from the stack after the loop finishes.
1368 : :
1369 : : To model this effect, we increase the number of registers needed for
1370 : : stack registers by two: one register push, and one register pop.
1371 : : This usually has the effect that FP constant loads from the constant
1372 : : pool are not moved out of the loop.
1373 : :
1374 : : Note that this also means that dependent invariants cannot be moved.
1375 : : However, the primary purpose of this pass is to move loop invariant
1376 : : address arithmetic out of loops, and address arithmetic that depends
1377 : : on floating point constants is unlikely to ever occur. */
1378 : 2885745 : rtx set = single_set (inv->insn);
1379 : 2885745 : if (set
1380 : 2885745 : && IS_STACK_MODE (GET_MODE (SET_SRC (set)))
1381 : 2897075 : && constant_pool_constant_p (SET_SRC (set)))
1382 : : {
1383 : 7137 : if (flag_ira_loop_pressure)
1384 : 0 : regs_needed[ira_stack_reg_pressure_class] += 2;
1385 : : else
1386 : 7137 : regs_needed[0] += 2;
1387 : : }
1388 : : }
1389 : : #endif
1390 : :
1391 : 3647597 : EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
1392 : : {
1393 : 761852 : bool check_p;
1394 : 761852 : enum reg_class dep_cl = ALL_REGS;
1395 : 761852 : int dep_ret;
1396 : :
1397 : 761852 : dep = invariants[depno];
1398 : :
1399 : : /* If DEP is moved out of the loop, it is not a depends_on any more. */
1400 : 761852 : if (dep->move)
1401 : 172550 : continue;
1402 : :
1403 : 589302 : dep_ret = get_inv_cost (dep, &acomp_cost, aregs_needed, &dep_cl);
1404 : :
1405 : 589302 : if (! flag_ira_loop_pressure)
1406 : 589300 : check_p = aregs_needed[0] != 0;
1407 : : else
1408 : : {
1409 : 2 : for (i = 0; i < ira_pressure_classes_num; i++)
1410 : 2 : if (aregs_needed[ira_pressure_classes[i]] != 0)
1411 : : break;
1412 : 2 : check_p = i < ira_pressure_classes_num;
1413 : :
1414 : 2 : if ((dep_ret == 1) || ((dep_ret == 0) && (*cl != dep_cl)))
1415 : : {
1416 : 2 : *cl = ALL_REGS;
1417 : 2 : ret = 1;
1418 : : }
1419 : : }
1420 : 589302 : if (check_p
1421 : : /* We need to check always_executed, since if the original value of
1422 : : the invariant may be preserved, we may need to keep it in a
1423 : : separate register. TODO check whether the register has an
1424 : : use outside of the loop. */
1425 : 584334 : && dep->always_executed
1426 : 144780 : && !dep->def->uses->next)
1427 : : {
1428 : : /* If this is a single use, after moving the dependency we will not
1429 : : need a new register. */
1430 : 90015 : if (! flag_ira_loop_pressure)
1431 : 90015 : aregs_needed[0]--;
1432 : : else
1433 : : {
1434 : 0 : int nregs;
1435 : 0 : enum reg_class pressure_class;
1436 : :
1437 : 0 : pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1438 : 0 : aregs_needed[pressure_class] -= nregs;
1439 : : }
1440 : : }
1441 : :
1442 : 589302 : if (! flag_ira_loop_pressure)
1443 : 589300 : regs_needed[0] += aregs_needed[0];
1444 : : else
1445 : : {
1446 : 10 : for (i = 0; i < ira_pressure_classes_num; i++)
1447 : 8 : regs_needed[ira_pressure_classes[i]]
1448 : 8 : += aregs_needed[ira_pressure_classes[i]];
1449 : : }
1450 : 589302 : (*comp_cost) += acomp_cost;
1451 : : }
1452 : : return ret;
1453 : : }
1454 : :
1455 : : /* Calculates gain for eliminating invariant INV. REGS_USED is the number
1456 : : of registers used in the loop, NEW_REGS is the number of new variables
1457 : : already added due to the invariant motion. The number of registers needed
1458 : : for it is stored in *REGS_NEEDED. SPEED and CALL_P are flags passed
1459 : : through to estimate_reg_pressure_cost. */
1460 : :
1461 : : static int
1462 : 2301411 : gain_for_invariant (struct invariant *inv, unsigned *regs_needed,
1463 : : unsigned *new_regs, unsigned regs_used,
1464 : : bool speed, bool call_p)
1465 : : {
1466 : 2301411 : int comp_cost, size_cost;
1467 : : /* Workaround -Wmaybe-uninitialized false positive during
1468 : : profiledbootstrap by initializing it. */
1469 : 2301411 : enum reg_class cl = NO_REGS;
1470 : 2301411 : int ret;
1471 : :
1472 : 2301411 : actual_stamp++;
1473 : :
1474 : 2301411 : ret = get_inv_cost (inv, &comp_cost, regs_needed, &cl);
1475 : :
1476 : 2301411 : if (! flag_ira_loop_pressure)
1477 : : {
1478 : 2301394 : size_cost = (estimate_reg_pressure_cost (new_regs[0] + regs_needed[0],
1479 : : regs_used, speed, call_p)
1480 : 2301394 : - estimate_reg_pressure_cost (new_regs[0],
1481 : : regs_used, speed, call_p));
1482 : : }
1483 : 17 : else if (ret < 0)
1484 : : return -1;
1485 : 17 : else if ((ret == 0) && (cl == NO_REGS))
1486 : : /* Hoist it anyway since it does not impact register pressure. */
1487 : : return 1;
1488 : : else
1489 : : {
1490 : : int i;
1491 : : enum reg_class pressure_class;
1492 : :
1493 : 21 : for (i = 0; i < ira_pressure_classes_num; i++)
1494 : : {
1495 : 20 : pressure_class = ira_pressure_classes[i];
1496 : :
1497 : 20 : if (!reg_classes_intersect_p (pressure_class, cl))
1498 : 3 : continue;
1499 : :
1500 : 17 : if ((int) new_regs[pressure_class]
1501 : 17 : + (int) regs_needed[pressure_class]
1502 : 17 : + LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1503 : 17 : + param_ira_loop_reserved_regs
1504 : 17 : > ira_class_hard_regs_num[pressure_class])
1505 : : break;
1506 : : }
1507 : 17 : if (i < ira_pressure_classes_num)
1508 : : /* There will be register pressure excess and we want not to
1509 : : make this loop invariant motion. All loop invariants with
1510 : : non-positive gains will be rejected in function
1511 : : find_invariants_to_move. Therefore we return the negative
1512 : : number here.
1513 : :
1514 : : One could think that this rejects also expensive loop
1515 : : invariant motions and this will hurt code performance.
1516 : : However numerous experiments with different heuristics
1517 : : taking invariant cost into account did not confirm this
1518 : : assumption. There are possible explanations for this
1519 : : result:
1520 : : o probably all expensive invariants were already moved out
1521 : : of the loop by PRE and gimple invariant motion pass.
1522 : : o expensive invariant execution will be hidden by insn
1523 : : scheduling or OOO processor hardware because usually such
1524 : : invariants have a lot of freedom to be executed
1525 : : out-of-order.
1526 : : Another reason for ignoring invariant cost vs spilling cost
1527 : : heuristics is also in difficulties to evaluate accurately
1528 : : spill cost at this stage. */
1529 : : return -1;
1530 : : else
1531 : : size_cost = 0;
1532 : : }
1533 : :
1534 : 2301395 : return comp_cost - size_cost;
1535 : : }
1536 : :
1537 : : /* Finds invariant with best gain for moving. Returns the gain, stores
1538 : : the invariant in *BEST and number of registers needed for it to
1539 : : *REGS_NEEDED. REGS_USED is the number of registers used in the loop.
1540 : : NEW_REGS is the number of new variables already added due to invariant
1541 : : motion. */
1542 : :
1543 : : static int
1544 : 447443 : best_gain_for_invariant (struct invariant **best, unsigned *regs_needed,
1545 : : unsigned *new_regs, unsigned regs_used,
1546 : : bool speed, bool call_p)
1547 : : {
1548 : 447443 : struct invariant *inv;
1549 : 447443 : int i, gain = 0, again;
1550 : 447443 : unsigned aregs_needed[N_REG_CLASSES], invno;
1551 : :
1552 : 4767551 : FOR_EACH_VEC_ELT (invariants, invno, inv)
1553 : : {
1554 : 4320108 : if (inv->move)
1555 : 705093 : continue;
1556 : :
1557 : : /* Only consider the "representatives" of equivalent invariants. */
1558 : 3615015 : if (inv->eqto != inv->invno)
1559 : 1313604 : continue;
1560 : :
1561 : 2301411 : again = gain_for_invariant (inv, aregs_needed, new_regs, regs_used,
1562 : : speed, call_p);
1563 : 2301411 : if (again > gain)
1564 : : {
1565 : 316639 : gain = again;
1566 : 316639 : *best = inv;
1567 : 316639 : if (! flag_ira_loop_pressure)
1568 : 316638 : regs_needed[0] = aregs_needed[0];
1569 : : else
1570 : : {
1571 : 5 : for (i = 0; i < ira_pressure_classes_num; i++)
1572 : 4 : regs_needed[ira_pressure_classes[i]]
1573 : 4 : = aregs_needed[ira_pressure_classes[i]];
1574 : : }
1575 : : }
1576 : : }
1577 : :
1578 : 447443 : return gain;
1579 : : }
1580 : :
1581 : : /* Marks invariant INVNO and all its dependencies for moving. */
1582 : :
1583 : : static void
1584 : 304647 : set_move_mark (unsigned invno, int gain)
1585 : : {
1586 : 304647 : struct invariant *inv = invariants[invno];
1587 : 304647 : bitmap_iterator bi;
1588 : :
1589 : : /* Find the representative of the class of the equivalent invariants. */
1590 : 304647 : inv = invariants[inv->eqto];
1591 : :
1592 : 304647 : if (inv->move)
1593 : 2150 : return;
1594 : 302497 : inv->move = true;
1595 : :
1596 : 302497 : if (dump_file)
1597 : : {
1598 : 3 : if (gain >= 0)
1599 : 3 : fprintf (dump_file, "Decided to move invariant %d -- gain %d\n",
1600 : : invno, gain);
1601 : : else
1602 : 0 : fprintf (dump_file, "Decided to move dependent invariant %d\n",
1603 : : invno);
1604 : 302497 : };
1605 : :
1606 : 374590 : EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, invno, bi)
1607 : : {
1608 : 72093 : set_move_mark (invno, -1);
1609 : : }
1610 : : }
1611 : :
1612 : : /* Determines which invariants to move. */
1613 : :
1614 : : static void
1615 : 561371 : find_invariants_to_move (bool speed, bool call_p)
1616 : : {
1617 : 561371 : int gain;
1618 : 561371 : unsigned i, regs_used, regs_needed[N_REG_CLASSES], new_regs[N_REG_CLASSES];
1619 : 561371 : struct invariant *inv = NULL;
1620 : :
1621 : 561371 : if (!invariants.length ())
1622 : 346482 : return;
1623 : :
1624 : 214889 : if (flag_ira_loop_pressure)
1625 : : /* REGS_USED is actually never used when the flag is on. */
1626 : : regs_used = 0;
1627 : : else
1628 : : /* We do not really do a good job in estimating number of
1629 : : registers used; we put some initial bound here to stand for
1630 : : induction variables etc. that we do not detect. */
1631 : : {
1632 : 214888 : unsigned int n_regs = DF_REG_SIZE (df);
1633 : :
1634 : 214888 : regs_used = 2;
1635 : :
1636 : 123128516 : for (i = 0; i < n_regs; i++)
1637 : : {
1638 : 122913628 : if (!DF_REGNO_FIRST_DEF (i) && DF_REGNO_LAST_USE (i))
1639 : : {
1640 : : /* This is a value that is used but not changed inside loop. */
1641 : 0 : regs_used++;
1642 : : }
1643 : : }
1644 : : }
1645 : :
1646 : 214889 : if (! flag_ira_loop_pressure)
1647 : 214888 : new_regs[0] = regs_needed[0] = 0;
1648 : : else
1649 : : {
1650 : 5 : for (i = 0; (int) i < ira_pressure_classes_num; i++)
1651 : 4 : new_regs[ira_pressure_classes[i]] = 0;
1652 : : }
1653 : 894886 : while ((gain = best_gain_for_invariant (&inv, regs_needed,
1654 : : new_regs, regs_used,
1655 : 447443 : speed, call_p)) > 0)
1656 : : {
1657 : 232554 : set_move_mark (inv->invno, gain);
1658 : 232554 : if (! flag_ira_loop_pressure)
1659 : 232553 : new_regs[0] += regs_needed[0];
1660 : : else
1661 : : {
1662 : 5 : for (i = 0; (int) i < ira_pressure_classes_num; i++)
1663 : 4 : new_regs[ira_pressure_classes[i]]
1664 : 4 : += regs_needed[ira_pressure_classes[i]];
1665 : : }
1666 : : }
1667 : : }
1668 : :
1669 : : /* Replace the uses, reached by the definition of invariant INV, by REG.
1670 : :
1671 : : IN_GROUP is nonzero if this is part of a group of changes that must be
1672 : : performed as a group. In that case, the changes will be stored. The
1673 : : function `apply_change_group' will validate and apply the changes. */
1674 : :
1675 : : static int
1676 : 227695 : replace_uses (struct invariant *inv, rtx reg, bool in_group)
1677 : : {
1678 : : /* Replace the uses we know to be dominated. It saves work for copy
1679 : : propagation, and also it is necessary so that dependent invariants
1680 : : are computed right. */
1681 : 227695 : if (inv->def)
1682 : : {
1683 : 222368 : struct use *use;
1684 : 437573 : for (use = inv->def->uses; use; use = use->next)
1685 : 215205 : validate_change (use->insn, use->pos, reg, true);
1686 : :
1687 : : /* If we aren't part of a larger group, apply the changes now. */
1688 : 222368 : if (!in_group)
1689 : 42519 : return apply_change_group ();
1690 : : }
1691 : :
1692 : : return 1;
1693 : : }
1694 : :
1695 : : /* Whether invariant INV setting REG can be moved out of LOOP, at the end of
1696 : : the block preceding its header. */
1697 : :
1698 : : static bool
1699 : 302497 : can_move_invariant_reg (class loop *loop, struct invariant *inv, rtx reg)
1700 : : {
1701 : 302497 : df_ref def, use;
1702 : 302497 : unsigned int dest_regno, defs_in_loop_count = 0;
1703 : 302497 : rtx_insn *insn = inv->insn;
1704 : 302497 : basic_block bb = BLOCK_FOR_INSN (inv->insn);
1705 : 302497 : auto_vec <rtx_insn *, 16> debug_insns_to_reset;
1706 : :
1707 : : /* We ignore hard register and memory access for cost and complexity reasons.
1708 : : Hard register are few at this stage and expensive to consider as they
1709 : : require building a separate data flow. Memory access would require using
1710 : : df_simulate_* and can_move_insns_across functions and is more complex. */
1711 : 302497 : if (!REG_P (reg) || HARD_REGISTER_P (reg))
1712 : : return false;
1713 : :
1714 : : /* Check whether the set is always executed. We could omit this condition if
1715 : : we know that the register is unused outside of the loop, but it does not
1716 : : seem worth finding out. */
1717 : 301739 : if (!inv->always_executed)
1718 : : return false;
1719 : :
1720 : : /* Check that all uses that would be dominated by def are already dominated
1721 : : by it. */
1722 : 130576 : dest_regno = REGNO (reg);
1723 : 327612 : for (use = DF_REG_USE_CHAIN (dest_regno); use; use = DF_REF_NEXT_REG (use))
1724 : : {
1725 : 198481 : rtx_insn *use_insn;
1726 : 198481 : basic_block use_bb;
1727 : :
1728 : 198481 : use_insn = DF_REF_INSN (use);
1729 : 198481 : use_bb = BLOCK_FOR_INSN (use_insn);
1730 : :
1731 : : /* Ignore instruction considered for moving. */
1732 : 198481 : if (use_insn == insn)
1733 : 11199 : continue;
1734 : :
1735 : : /* Don't consider uses outside loop. */
1736 : 198481 : if (!flow_bb_inside_loop_p (loop, use_bb))
1737 : 11199 : continue;
1738 : :
1739 : : /* Don't move if a use is not dominated by def in insn. */
1740 : 130162 : if ((use_bb == bb && DF_INSN_LUID (insn) >= DF_INSN_LUID (use_insn))
1741 : 316197 : || !dominated_by_p (CDI_DOMINATORS, use_bb, bb))
1742 : : {
1743 : 1451 : if (!DEBUG_INSN_P (use_insn))
1744 : 1445 : return false;
1745 : 6 : debug_insns_to_reset.safe_push (use_insn);
1746 : : }
1747 : : }
1748 : :
1749 : : /* Check for other defs. Any other def in the loop might reach a use
1750 : : currently reached by the def in insn. */
1751 : 259219 : for (def = DF_REG_DEF_CHAIN (dest_regno); def; def = DF_REF_NEXT_REG (def))
1752 : : {
1753 : 137329 : basic_block def_bb = DF_REF_BB (def);
1754 : :
1755 : : /* Defs in exit block cannot reach a use they weren't already. */
1756 : 137329 : if (single_succ_p (def_bb))
1757 : : {
1758 : 40729 : basic_block def_bb_succ;
1759 : :
1760 : 40729 : def_bb_succ = single_succ (def_bb);
1761 : 40729 : if (!flow_bb_inside_loop_p (loop, def_bb_succ))
1762 : 957 : continue;
1763 : : }
1764 : :
1765 : 136372 : if (++defs_in_loop_count > 1)
1766 : : return false;
1767 : : }
1768 : :
1769 : : /* Reset debug uses if a use is not dominated by def in insn. */
1770 : 365672 : for (auto use_insn : debug_insns_to_reset)
1771 : : {
1772 : 2 : INSN_VAR_LOCATION_LOC (use_insn) = gen_rtx_UNKNOWN_VAR_LOC ();
1773 : 2 : df_insn_rescan (use_insn);
1774 : : }
1775 : :
1776 : : return true;
1777 : 302497 : }
1778 : :
1779 : : /* Move invariant INVNO out of the LOOP. Returns true if this succeeds, false
1780 : : otherwise. */
1781 : :
1782 : : static bool
1783 : 1365867 : move_invariant_reg (class loop *loop, unsigned invno)
1784 : : {
1785 : 1365867 : struct invariant *inv = invariants[invno];
1786 : 1365867 : struct invariant *repr = invariants[inv->eqto];
1787 : 1365867 : unsigned i;
1788 : 1365867 : basic_block preheader = loop_preheader_edge (loop)->src;
1789 : 1365867 : rtx reg, set, dest, note;
1790 : 1365867 : bitmap_iterator bi;
1791 : 1365867 : int regno = -1;
1792 : :
1793 : 1365867 : if (inv->reg)
1794 : : return true;
1795 : 1246686 : if (!repr->move)
1796 : : return false;
1797 : :
1798 : : /* If this is a representative of the class of equivalent invariants,
1799 : : really move the invariant. Otherwise just replace its use with
1800 : : the register used for the representative. */
1801 : 349585 : if (inv == repr)
1802 : : {
1803 : 302497 : if (inv->depends_on)
1804 : : {
1805 : 374590 : EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, i, bi)
1806 : : {
1807 : 72093 : if (!move_invariant_reg (loop, i))
1808 : 0 : goto fail;
1809 : : }
1810 : : }
1811 : :
1812 : : /* If possible, just move the set out of the loop. Otherwise, we
1813 : : need to create a temporary register. */
1814 : 302497 : set = single_set (inv->insn);
1815 : 302497 : reg = dest = SET_DEST (set);
1816 : 302497 : if (GET_CODE (reg) == SUBREG)
1817 : 42 : reg = SUBREG_REG (reg);
1818 : 302497 : if (REG_P (reg))
1819 : 302381 : regno = REGNO (reg);
1820 : :
1821 : 302497 : if (!can_move_invariant_reg (loop, inv, dest))
1822 : : {
1823 : 180607 : reg = gen_reg_rtx_and_attrs (dest);
1824 : :
1825 : : /* Try replacing the destination by a new pseudoregister. */
1826 : 180607 : validate_change (inv->insn, &SET_DEST (set), reg, true);
1827 : :
1828 : : /* As well as all the dominated uses. */
1829 : 180607 : replace_uses (inv, reg, true);
1830 : :
1831 : : /* And validate all the changes. */
1832 : 180607 : if (!apply_change_group ())
1833 : 41 : goto fail;
1834 : :
1835 : 180566 : emit_insn_after (gen_move_insn (dest, reg), inv->insn);
1836 : : }
1837 : 121890 : else if (dump_file)
1838 : 1 : fprintf (dump_file, "Invariant %d moved without introducing a new "
1839 : : "temporary register\n", invno);
1840 : 302456 : if (JUMP_P (BB_END (preheader)))
1841 : 6 : preheader = split_edge (loop_preheader_edge (loop));
1842 : 302456 : reorder_insns (inv->insn, inv->insn, BB_END (preheader));
1843 : 302456 : df_recompute_luids (preheader);
1844 : :
1845 : : /* If there is a REG_EQUAL note on the insn we just moved, and the
1846 : : insn is in a basic block that is not always executed or the note
1847 : : contains something for which we don't know the invariant status,
1848 : : the note may no longer be valid after we move the insn. Note that
1849 : : uses in REG_EQUAL notes are taken into account in the computation
1850 : : of invariants, so it is safe to retain the note even if it contains
1851 : : register references for which we know the invariant status. */
1852 : 302456 : if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))
1853 : 302456 : && (!inv->always_executed
1854 : 30220 : || !check_maybe_invariant (XEXP (note, 0))))
1855 : 24303 : remove_note (inv->insn, note);
1856 : : }
1857 : : else
1858 : : {
1859 : 47088 : if (!move_invariant_reg (loop, repr->invno))
1860 : 0 : goto fail;
1861 : 47088 : reg = repr->reg;
1862 : 47088 : regno = repr->orig_regno;
1863 : 47088 : if (!replace_uses (inv, reg, false))
1864 : 0 : goto fail;
1865 : 47088 : set = single_set (inv->insn);
1866 : 47088 : emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
1867 : 47088 : delete_insn (inv->insn);
1868 : : }
1869 : :
1870 : 349544 : inv->reg = reg;
1871 : 349544 : inv->orig_regno = regno;
1872 : :
1873 : 349544 : return true;
1874 : :
1875 : 41 : fail:
1876 : : /* If we failed, clear move flag, so that we do not try to move inv
1877 : : again. */
1878 : 41 : if (dump_file)
1879 : 0 : fprintf (dump_file, "Failed to move invariant %d\n", invno);
1880 : 41 : inv->move = false;
1881 : 41 : inv->reg = NULL_RTX;
1882 : 41 : inv->orig_regno = -1;
1883 : :
1884 : 41 : return false;
1885 : : }
1886 : :
1887 : : /* Move selected invariant out of the LOOP. Newly created regs are marked
1888 : : in TEMPORARY_REGS. */
1889 : :
1890 : : static void
1891 : 561371 : move_invariants (class loop *loop)
1892 : : {
1893 : 561371 : struct invariant *inv;
1894 : 561371 : unsigned i;
1895 : :
1896 : 1808057 : FOR_EACH_VEC_ELT (invariants, i, inv)
1897 : 1246686 : move_invariant_reg (loop, i);
1898 : 561371 : if (flag_ira_loop_pressure && resize_reg_info ())
1899 : : {
1900 : 10 : FOR_EACH_VEC_ELT (invariants, i, inv)
1901 : 9 : if (inv->reg != NULL_RTX)
1902 : : {
1903 : 1 : if (inv->orig_regno >= 0)
1904 : 1 : setup_reg_classes (REGNO (inv->reg),
1905 : : reg_preferred_class (inv->orig_regno),
1906 : : reg_alternate_class (inv->orig_regno),
1907 : : reg_allocno_class (inv->orig_regno));
1908 : : else
1909 : 0 : setup_reg_classes (REGNO (inv->reg),
1910 : : GENERAL_REGS, NO_REGS, GENERAL_REGS);
1911 : : }
1912 : : }
1913 : : /* Remove the DF_UD_CHAIN problem added in find_defs before rescanning,
1914 : : to save a bit of compile time. */
1915 : 561371 : df_remove_problem (df_chain);
1916 : 561371 : df_process_deferred_rescans ();
1917 : 561371 : }
1918 : :
1919 : : /* Initializes invariant motion data. */
1920 : :
1921 : : static void
1922 : 561371 : init_inv_motion_data (void)
1923 : : {
1924 : 561371 : actual_stamp = 1;
1925 : :
1926 : 561371 : invariants.create (100);
1927 : 561371 : }
1928 : :
1929 : : /* Frees the data allocated by invariant motion. */
1930 : :
1931 : : static void
1932 : 561371 : free_inv_motion_data (void)
1933 : : {
1934 : 561371 : unsigned i;
1935 : 561371 : struct def *def;
1936 : 561371 : struct invariant *inv;
1937 : :
1938 : 561371 : check_invariant_table_size ();
1939 : 77330829 : for (i = 0; i < DF_DEFS_TABLE_SIZE (); i++)
1940 : : {
1941 : 76208087 : inv = invariant_table[i];
1942 : 76208087 : if (inv)
1943 : : {
1944 : 596784 : def = inv->def;
1945 : 596784 : gcc_assert (def != NULL);
1946 : :
1947 : 596784 : free_use_list (def->uses);
1948 : 596784 : free (def);
1949 : 596784 : invariant_table[i] = NULL;
1950 : : }
1951 : : }
1952 : :
1953 : 1808057 : FOR_EACH_VEC_ELT (invariants, i, inv)
1954 : : {
1955 : 1246686 : BITMAP_FREE (inv->depends_on);
1956 : 1246686 : free (inv);
1957 : : }
1958 : 561371 : invariants.release ();
1959 : 561371 : }
1960 : :
1961 : : /* Move the invariants out of the LOOP. */
1962 : :
1963 : : static void
1964 : 561371 : move_single_loop_invariants (class loop *loop)
1965 : : {
1966 : 561371 : init_inv_motion_data ();
1967 : :
1968 : 561371 : find_invariants (loop);
1969 : 561371 : find_invariants_to_move (optimize_loop_for_speed_p (loop),
1970 : 561371 : LOOP_DATA (loop)->has_call);
1971 : 561371 : move_invariants (loop);
1972 : :
1973 : 561371 : free_inv_motion_data ();
1974 : 561371 : }
1975 : :
1976 : : /* Releases the auxiliary data for LOOP. */
1977 : :
1978 : : static void
1979 : 561371 : free_loop_data (class loop *loop)
1980 : : {
1981 : 561371 : class loop_data *data = LOOP_DATA (loop);
1982 : 561371 : if (!data)
1983 : : return;
1984 : :
1985 : 561371 : bitmap_clear (&LOOP_DATA (loop)->regs_ref);
1986 : 561371 : bitmap_clear (&LOOP_DATA (loop)->regs_live);
1987 : 561371 : free (data);
1988 : 561371 : loop->aux = NULL;
1989 : : }
1990 : :
1991 : :
1992 : :
1993 : : /* Registers currently living. */
1994 : : static bitmap_head curr_regs_live;
1995 : :
1996 : : /* Current reg pressure for each pressure class. */
1997 : : static int curr_reg_pressure[N_REG_CLASSES];
1998 : :
1999 : : /* Record all regs that are set in any one insn. Communication from
2000 : : mark_reg_{store,clobber} and global_conflicts. Asm can refer to
2001 : : all hard-registers. */
2002 : : static rtx regs_set[(FIRST_PSEUDO_REGISTER > MAX_RECOG_OPERANDS
2003 : : ? FIRST_PSEUDO_REGISTER : MAX_RECOG_OPERANDS) * 2];
2004 : : /* Number of regs stored in the previous array. */
2005 : : static int n_regs_set;
2006 : :
2007 : : /* Return pressure class and number of needed hard registers (through
2008 : : *NREGS) of register REGNO. */
2009 : : static enum reg_class
2010 : 152 : get_regno_pressure_class (int regno, int *nregs)
2011 : : {
2012 : 152 : if (regno >= FIRST_PSEUDO_REGISTER)
2013 : : {
2014 : 93 : enum reg_class pressure_class;
2015 : :
2016 : 93 : pressure_class = reg_allocno_class (regno);
2017 : 93 : pressure_class = ira_pressure_class_translate[pressure_class];
2018 : 93 : *nregs
2019 : 93 : = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
2020 : 93 : return pressure_class;
2021 : : }
2022 : 59 : else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
2023 : 59 : && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
2024 : : {
2025 : 12 : *nregs = 1;
2026 : 12 : return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
2027 : : }
2028 : : else
2029 : : {
2030 : 47 : *nregs = 0;
2031 : 47 : return NO_REGS;
2032 : : }
2033 : : }
2034 : :
2035 : : /* Increase (if INCR_P) or decrease current register pressure for
2036 : : register REGNO. */
2037 : : static void
2038 : 149 : change_pressure (int regno, bool incr_p)
2039 : : {
2040 : 149 : int nregs;
2041 : 149 : enum reg_class pressure_class;
2042 : :
2043 : 149 : pressure_class = get_regno_pressure_class (regno, &nregs);
2044 : 149 : if (! incr_p)
2045 : 33 : curr_reg_pressure[pressure_class] -= nregs;
2046 : : else
2047 : : {
2048 : 116 : curr_reg_pressure[pressure_class] += nregs;
2049 : 116 : if (LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
2050 : : < curr_reg_pressure[pressure_class])
2051 : 20 : LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
2052 : 20 : = curr_reg_pressure[pressure_class];
2053 : : }
2054 : 149 : }
2055 : :
2056 : : /* Mark REGNO birth. */
2057 : : static void
2058 : 48 : mark_regno_live (int regno)
2059 : : {
2060 : 48 : class loop *loop;
2061 : :
2062 : 48 : for (loop = curr_loop;
2063 : 96 : loop != current_loops->tree_root;
2064 : 48 : loop = loop_outer (loop))
2065 : 48 : bitmap_set_bit (&LOOP_DATA (loop)->regs_live, regno);
2066 : 48 : if (!bitmap_set_bit (&curr_regs_live, regno))
2067 : : return;
2068 : 37 : change_pressure (regno, true);
2069 : : }
2070 : :
2071 : : /* Mark REGNO death. */
2072 : : static void
2073 : 43 : mark_regno_death (int regno)
2074 : : {
2075 : 43 : if (! bitmap_clear_bit (&curr_regs_live, regno))
2076 : : return;
2077 : 33 : change_pressure (regno, false);
2078 : : }
2079 : :
2080 : : /* Mark setting register REG. */
2081 : : static void
2082 : 54 : mark_reg_store (rtx reg, const_rtx setter ATTRIBUTE_UNUSED,
2083 : : void *data ATTRIBUTE_UNUSED)
2084 : : {
2085 : 54 : if (GET_CODE (reg) == SUBREG)
2086 : 0 : reg = SUBREG_REG (reg);
2087 : :
2088 : 54 : if (! REG_P (reg))
2089 : : return;
2090 : :
2091 : 48 : regs_set[n_regs_set++] = reg;
2092 : :
2093 : 48 : unsigned int end_regno = END_REGNO (reg);
2094 : 96 : for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
2095 : 48 : mark_regno_live (regno);
2096 : : }
2097 : :
2098 : : /* Mark clobbering register REG. */
2099 : : static void
2100 : 44 : mark_reg_clobber (rtx reg, const_rtx setter, void *data)
2101 : : {
2102 : 44 : if (GET_CODE (setter) == CLOBBER)
2103 : 10 : mark_reg_store (reg, setter, data);
2104 : 44 : }
2105 : :
2106 : : /* Mark register REG death. */
2107 : : static void
2108 : 43 : mark_reg_death (rtx reg)
2109 : : {
2110 : 43 : unsigned int end_regno = END_REGNO (reg);
2111 : 86 : for (unsigned int regno = REGNO (reg); regno < end_regno; ++regno)
2112 : 43 : mark_regno_death (regno);
2113 : 43 : }
2114 : :
2115 : : /* Mark occurrence of registers in X for the current loop. */
2116 : : static void
2117 : 201 : mark_ref_regs (rtx x)
2118 : : {
2119 : 201 : RTX_CODE code;
2120 : 201 : int i;
2121 : 201 : const char *fmt;
2122 : :
2123 : 201 : if (!x)
2124 : : return;
2125 : :
2126 : 201 : code = GET_CODE (x);
2127 : 201 : if (code == REG)
2128 : : {
2129 : 83 : class loop *loop;
2130 : :
2131 : 83 : for (loop = curr_loop;
2132 : 166 : loop != current_loops->tree_root;
2133 : 83 : loop = loop_outer (loop))
2134 : 83 : bitmap_set_bit (&LOOP_DATA (loop)->regs_ref, REGNO (x));
2135 : : return;
2136 : : }
2137 : :
2138 : 118 : fmt = GET_RTX_FORMAT (code);
2139 : 314 : for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2140 : 196 : if (fmt[i] == 'e')
2141 : 146 : mark_ref_regs (XEXP (x, i));
2142 : 50 : else if (fmt[i] == 'E')
2143 : : {
2144 : : int j;
2145 : :
2146 : 30 : for (j = 0; j < XVECLEN (x, i); j++)
2147 : 20 : mark_ref_regs (XVECEXP (x, i, j));
2148 : : }
2149 : : }
2150 : :
2151 : : /* Calculate register pressure in the loops. */
2152 : : static void
2153 : 1 : calculate_loop_reg_pressure (void)
2154 : : {
2155 : 1 : int i;
2156 : 1 : unsigned int j;
2157 : 1 : bitmap_iterator bi;
2158 : 1 : basic_block bb;
2159 : 1 : rtx_insn *insn;
2160 : 1 : rtx link;
2161 : 1 : class loop *parent;
2162 : :
2163 : 4 : for (auto loop : loops_list (cfun, 0))
2164 : 1 : if (loop->aux == NULL)
2165 : : {
2166 : 1 : loop->aux = xcalloc (1, sizeof (class loop_data));
2167 : 1 : bitmap_initialize (&LOOP_DATA (loop)->regs_ref, ®_obstack);
2168 : 1 : bitmap_initialize (&LOOP_DATA (loop)->regs_live, ®_obstack);
2169 : 1 : }
2170 : 1 : ira_setup_eliminable_regset ();
2171 : 1 : bitmap_initialize (&curr_regs_live, ®_obstack);
2172 : 10 : FOR_EACH_BB_FN (bb, cfun)
2173 : : {
2174 : 9 : curr_loop = bb->loop_father;
2175 : 9 : if (curr_loop == current_loops->tree_root)
2176 : 4 : continue;
2177 : :
2178 : 5 : for (class loop *loop = curr_loop;
2179 : 10 : loop != current_loops->tree_root;
2180 : 5 : loop = loop_outer (loop))
2181 : 10 : bitmap_ior_into (&LOOP_DATA (loop)->regs_live, DF_LR_IN (bb));
2182 : :
2183 : 5 : bitmap_copy (&curr_regs_live, DF_LR_IN (bb));
2184 : 30 : for (i = 0; i < ira_pressure_classes_num; i++)
2185 : 20 : curr_reg_pressure[ira_pressure_classes[i]] = 0;
2186 : 84 : EXECUTE_IF_SET_IN_BITMAP (&curr_regs_live, 0, j, bi)
2187 : 79 : change_pressure (j, true);
2188 : :
2189 : 49 : FOR_BB_INSNS (bb, insn)
2190 : : {
2191 : 44 : if (! NONDEBUG_INSN_P (insn))
2192 : 9 : continue;
2193 : :
2194 : 35 : mark_ref_regs (PATTERN (insn));
2195 : 35 : n_regs_set = 0;
2196 : 35 : note_stores (insn, mark_reg_clobber, NULL);
2197 : :
2198 : : /* Mark any registers dead after INSN as dead now. */
2199 : :
2200 : 81 : for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
2201 : 46 : if (REG_NOTE_KIND (link) == REG_DEAD)
2202 : 23 : mark_reg_death (XEXP (link, 0));
2203 : :
2204 : : /* Mark any registers set in INSN as live,
2205 : : and mark them as conflicting with all other live regs.
2206 : : Clobbers are processed again, so they conflict with
2207 : : the registers that are set. */
2208 : :
2209 : 35 : note_stores (insn, mark_reg_store, NULL);
2210 : :
2211 : 35 : if (AUTO_INC_DEC)
2212 : : for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
2213 : : if (REG_NOTE_KIND (link) == REG_INC)
2214 : : mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
2215 : :
2216 : 118 : while (n_regs_set-- > 0)
2217 : : {
2218 : 96 : rtx note = find_regno_note (insn, REG_UNUSED,
2219 : 48 : REGNO (regs_set[n_regs_set]));
2220 : 48 : if (! note)
2221 : 28 : continue;
2222 : :
2223 : 20 : mark_reg_death (XEXP (note, 0));
2224 : : }
2225 : : }
2226 : : }
2227 : 1 : bitmap_release (&curr_regs_live);
2228 : 1 : if (flag_ira_region == IRA_REGION_MIXED
2229 : 1 : || flag_ira_region == IRA_REGION_ALL)
2230 : 4 : for (auto loop : loops_list (cfun, 0))
2231 : : {
2232 : 42 : EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
2233 : 41 : if (! bitmap_bit_p (&LOOP_DATA (loop)->regs_ref, j))
2234 : : {
2235 : 3 : enum reg_class pressure_class;
2236 : 3 : int nregs;
2237 : :
2238 : 3 : pressure_class = get_regno_pressure_class (j, &nregs);
2239 : 3 : LOOP_DATA (loop)->max_reg_pressure[pressure_class] -= nregs;
2240 : : }
2241 : 1 : }
2242 : 1 : if (dump_file == NULL)
2243 : 0 : return;
2244 : 4 : for (auto loop : loops_list (cfun, 0))
2245 : : {
2246 : 1 : parent = loop_outer (loop);
2247 : 2 : fprintf (dump_file, "\n Loop %d (parent %d, header bb%d, depth %d)\n",
2248 : : loop->num, (parent == NULL ? -1 : parent->num),
2249 : 1 : loop->header->index, loop_depth (loop));
2250 : 1 : fprintf (dump_file, "\n ref. regnos:");
2251 : 39 : EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_ref, 0, j, bi)
2252 : 38 : fprintf (dump_file, " %d", j);
2253 : 1 : fprintf (dump_file, "\n live regnos:");
2254 : 42 : EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
2255 : 41 : fprintf (dump_file, " %d", j);
2256 : 1 : fprintf (dump_file, "\n Pressure:");
2257 : 5 : for (i = 0; (int) i < ira_pressure_classes_num; i++)
2258 : : {
2259 : 4 : enum reg_class pressure_class;
2260 : :
2261 : 4 : pressure_class = ira_pressure_classes[i];
2262 : 4 : if (LOOP_DATA (loop)->max_reg_pressure[pressure_class] == 0)
2263 : 2 : continue;
2264 : 2 : fprintf (dump_file, " %s=%d", reg_class_names[pressure_class],
2265 : : LOOP_DATA (loop)->max_reg_pressure[pressure_class]);
2266 : : }
2267 : 1 : fprintf (dump_file, "\n");
2268 : 1 : }
2269 : : }
2270 : :
2271 : :
2272 : :
2273 : : /* Move the invariants out of the loops. */
2274 : :
2275 : : void
2276 : 222711 : move_loop_invariants (void)
2277 : : {
2278 : 222711 : if (optimize == 1)
2279 : 14490 : df_live_add_problem ();
2280 : : /* ??? This is a hack. We should only need to call df_live_set_all_dirty
2281 : : for optimize == 1, but can_move_invariant_reg relies on DF_INSN_LUID
2282 : : being up-to-date. That isn't always true (even after df_analyze)
2283 : : because df_process_deferred_rescans doesn't necessarily cause
2284 : : blocks to be rescanned. */
2285 : 222711 : df_live_set_all_dirty ();
2286 : 222711 : if (flag_ira_loop_pressure)
2287 : : {
2288 : 1 : df_analyze ();
2289 : 1 : regstat_init_n_sets_and_refs ();
2290 : 1 : ira_set_pseudo_classes (true, dump_file);
2291 : 1 : calculate_loop_reg_pressure ();
2292 : 1 : regstat_free_n_sets_and_refs ();
2293 : : }
2294 : 222711 : df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
2295 : : /* Process the loops, innermost first. */
2296 : 1229504 : for (auto loop : loops_list (cfun, LI_FROM_INNERMOST))
2297 : : {
2298 : 561371 : curr_loop = loop;
2299 : : /* move_single_loop_invariants for very large loops is time consuming
2300 : : and might need a lot of memory. For -O1 only do loop invariant
2301 : : motion for very small loops. */
2302 : 561371 : unsigned max_bbs = param_loop_invariant_max_bbs_in_loop;
2303 : 561371 : if (optimize < 2)
2304 : 35343 : max_bbs /= 10;
2305 : 561371 : if (loop->num_nodes <= max_bbs)
2306 : 561371 : move_single_loop_invariants (loop);
2307 : 222711 : }
2308 : :
2309 : 1229504 : for (auto loop : loops_list (cfun, 0))
2310 : 561371 : free_loop_data (loop);
2311 : :
2312 : 222711 : if (flag_ira_loop_pressure)
2313 : : /* There is no sense to keep this info because it was most
2314 : : probably outdated by subsequent passes. */
2315 : 1 : free_reg_info ();
2316 : 222711 : free (invariant_table);
2317 : 222711 : invariant_table = NULL;
2318 : 222711 : invariant_table_size = 0;
2319 : :
2320 : 222711 : if (optimize == 1)
2321 : 14490 : df_remove_problem (df_live);
2322 : :
2323 : 222711 : checking_verify_flow_info ();
2324 : 222711 : }
|