]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/loop-invariant.c
gcc/
[thirdparty/gcc.git] / gcc / loop-invariant.c
CommitLineData
c2aa3ceb 1/* RTL-level loop invariant motion.
7cf0dbf3 2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010
86482d6b 3 Free Software Foundation, Inc.
c2aa3ceb 4
3a0ecac2 5This file is part of GCC.
c2aa3ceb 6
3a0ecac2 7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by the
8c4c00c1 9Free Software Foundation; either version 3, or (at your option) any
3a0ecac2 10later version.
c2aa3ceb 11
3a0ecac2 12GCC is distributed in the hope that it will be useful, but WITHOUT
13ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
c2aa3ceb 16
3a0ecac2 17You should have received a copy of the GNU General Public License
8c4c00c1 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
3a0ecac2 20
21/* This implements the loop invariant motion pass. It is very simple
1e5b92fa 22 (no calls, no loads/stores, etc.). This should be sufficient to cleanup
23 things like address arithmetics -- other more complicated invariants should
24 be eliminated on GIMPLE either in tree-ssa-loop-im.c or in tree-ssa-pre.c.
c2aa3ceb 25
3a0ecac2 26 We proceed loop by loop -- it is simpler than trying to handle things
27 globally and should not lose much. First we inspect all sets inside loop
28 and create a dependency graph on insns (saying "to move this insn, you must
29 also move the following insns").
30
31 We then need to determine what to move. We estimate the number of registers
32 used and move as many invariants as possible while we still have enough free
33 registers. We prefer the expensive invariants.
c2aa3ceb 34
3a0ecac2 35 Then we move the selected invariants out of the loop, creating a new
36 temporaries for them if necessary. */
37
38#include "config.h"
39#include "system.h"
40#include "coretypes.h"
41#include "tm.h"
e8eed2f8 42#include "hard-reg-set.h"
3a0ecac2 43#include "rtl.h"
4a77dc8c 44#include "tm_p.h"
42fe97ed 45#include "obstack.h"
3a0ecac2 46#include "basic-block.h"
47#include "cfgloop.h"
48#include "expr.h"
3d6b8be7 49#include "recog.h"
3a0ecac2 50#include "output.h"
51#include "function.h"
52#include "flags.h"
53#include "df.h"
3d6b8be7 54#include "hashtab.h"
a39b96b6 55#include "except.h"
86482d6b 56#include "params.h"
e8eed2f8 57#include "regs.h"
58#include "ira.h"
3a0ecac2 59
60/* The data stored for the loop. */
61
62struct loop_data
63{
64 struct loop *outermost_exit; /* The outermost exit of the loop. */
65 bool has_call; /* True if the loop contains a call. */
e8eed2f8 66 /* Maximal register pressure inside loop for given register class
66d9a7b9 67 (defined only for the pressure classes). */
e8eed2f8 68 int max_reg_pressure[N_REG_CLASSES];
69 /* Loop regs referenced and live pseudo-registers. */
70 bitmap_head regs_ref;
71 bitmap_head regs_live;
3a0ecac2 72};
73
74#define LOOP_DATA(LOOP) ((struct loop_data *) (LOOP)->aux)
75
76/* The description of an use. */
77
78struct use
79{
80 rtx *pos; /* Position of the use. */
81 rtx insn; /* The insn in that the use occurs. */
68461c19 82 unsigned addr_use_p; /* Whether the use occurs in an address. */
3a0ecac2 83 struct use *next; /* Next use in the list. */
84};
85
86/* The description of a def. */
87
88struct def
89{
90 struct use *uses; /* The list of uses that are uniquely reached
91 by it. */
92 unsigned n_uses; /* Number of such uses. */
68461c19 93 unsigned n_addr_uses; /* Number of uses in addresses. */
3a0ecac2 94 unsigned invno; /* The corresponding invariant. */
95};
96
97/* The data stored for each invariant. */
98
99struct invariant
100{
101 /* The number of the invariant. */
102 unsigned invno;
103
3d6b8be7 104 /* The number of the invariant with the same value. */
105 unsigned eqto;
106
107 /* If we moved the invariant out of the loop, the register that contains its
108 value. */
109 rtx reg;
3a0ecac2 110
e8eed2f8 111 /* If we moved the invariant out of the loop, the original regno
112 that contained its value. */
113 int orig_regno;
114
3a0ecac2 115 /* The definition of the invariant. */
116 struct def *def;
117
118 /* The insn in that it is defined. */
119 rtx insn;
120
121 /* Whether it is always executed. */
122 bool always_executed;
123
124 /* Whether to move the invariant. */
125 bool move;
126
68461c19 127 /* Whether the invariant is cheap when used as an address. */
128 bool cheap_address;
129
c2aa3ceb 130 /* Cost of the invariant. */
3a0ecac2 131 unsigned cost;
132
133 /* The invariants it depends on. */
134 bitmap depends_on;
135
136 /* Used for detecting already visited invariants during determining
137 costs of movements. */
138 unsigned stamp;
139};
140
e8eed2f8 141/* Currently processed loop. */
142static struct loop *curr_loop;
143
3072d30e 144/* Table of invariants indexed by the df_ref uid field. */
145
146static unsigned int invariant_table_size = 0;
147static struct invariant ** invariant_table;
148
3d6b8be7 149/* Entry for hash table of invariant expressions. */
150
151struct invariant_expr_entry
152{
153 /* The invariant. */
154 struct invariant *inv;
155
156 /* Its value. */
157 rtx expr;
158
159 /* Its mode. */
160 enum machine_mode mode;
161
162 /* Its hash. */
163 hashval_t hash;
164};
165
3a0ecac2 166/* The actual stamp for marking already visited invariants during determining
167 costs of movements. */
168
169static unsigned actual_stamp;
170
703056c9 171typedef struct invariant *invariant_p;
172
173DEF_VEC_P(invariant_p);
174DEF_VEC_ALLOC_P(invariant_p, heap);
175
3a0ecac2 176/* The invariants. */
177
703056c9 178static VEC(invariant_p,heap) *invariants;
3a0ecac2 179
3072d30e 180/* Check the size of the invariant table and realloc if necessary. */
c2aa3ceb 181
48e1416a 182static void
3072d30e 183check_invariant_table_size (void)
184{
185 if (invariant_table_size < DF_DEFS_TABLE_SIZE())
186 {
187 unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
4077bf7a 188 invariant_table = XRESIZEVEC (struct invariant *, invariant_table, new_size);
48e1416a 189 memset (&invariant_table[invariant_table_size], 0,
3072d30e 190 (new_size - invariant_table_size) * sizeof (struct rtx_iv *));
191 invariant_table_size = new_size;
192 }
193}
c2aa3ceb 194
3a0ecac2 195/* Test for possibility of invariantness of X. */
196
197static bool
198check_maybe_invariant (rtx x)
199{
200 enum rtx_code code = GET_CODE (x);
201 int i, j;
202 const char *fmt;
203
204 switch (code)
205 {
206 case CONST_INT:
207 case CONST_DOUBLE:
e397ad8e 208 case CONST_FIXED:
3a0ecac2 209 case SYMBOL_REF:
210 case CONST:
211 case LABEL_REF:
212 return true;
213
214 case PC:
215 case CC0:
216 case UNSPEC_VOLATILE:
217 case CALL:
218 return false;
219
220 case REG:
221 return true;
222
223 case MEM:
224 /* Load/store motion is done elsewhere. ??? Perhaps also add it here?
225 It should not be hard, and might be faster than "elsewhere". */
226
227 /* Just handle the most trivial case where we load from an unchanging
228 location (most importantly, pic tables). */
13ecee21 229 if (MEM_READONLY_P (x) && !MEM_VOLATILE_P (x))
3a0ecac2 230 break;
231
232 return false;
233
234 case ASM_OPERANDS:
235 /* Don't mess with insns declared volatile. */
236 if (MEM_VOLATILE_P (x))
237 return false;
238 break;
239
240 default:
241 break;
242 }
243
244 fmt = GET_RTX_FORMAT (code);
245 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
246 {
247 if (fmt[i] == 'e')
248 {
249 if (!check_maybe_invariant (XEXP (x, i)))
250 return false;
251 }
252 else if (fmt[i] == 'E')
253 {
254 for (j = 0; j < XVECLEN (x, i); j++)
255 if (!check_maybe_invariant (XVECEXP (x, i, j)))
256 return false;
257 }
258 }
259
260 return true;
261}
262
3d6b8be7 263/* Returns the invariant definition for USE, or NULL if USE is not
264 invariant. */
265
266static struct invariant *
ed6e85ae 267invariant_for_use (df_ref use)
3d6b8be7 268{
269 struct df_link *defs;
ed6e85ae 270 df_ref def;
158b6cc9 271 basic_block bb = DF_REF_BB (use), def_bb;
3d6b8be7 272
ed6e85ae 273 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
2e33cac5 274 return NULL;
275
3d6b8be7 276 defs = DF_REF_CHAIN (use);
277 if (!defs || defs->next)
278 return NULL;
279 def = defs->ref;
3072d30e 280 check_invariant_table_size ();
281 if (!invariant_table[DF_REF_ID(def)])
3d6b8be7 282 return NULL;
283
284 def_bb = DF_REF_BB (def);
285 if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
286 return NULL;
3072d30e 287 return invariant_table[DF_REF_ID(def)];
3d6b8be7 288}
289
290/* Computes hash value for invariant expression X in INSN. */
291
292static hashval_t
293hash_invariant_expr_1 (rtx insn, rtx x)
294{
295 enum rtx_code code = GET_CODE (x);
296 int i, j;
297 const char *fmt;
298 hashval_t val = code;
299 int do_not_record_p;
ed6e85ae 300 df_ref use;
3d6b8be7 301 struct invariant *inv;
302
303 switch (code)
304 {
305 case CONST_INT:
306 case CONST_DOUBLE:
e397ad8e 307 case CONST_FIXED:
3d6b8be7 308 case SYMBOL_REF:
309 case CONST:
310 case LABEL_REF:
311 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
312
313 case REG:
3072d30e 314 use = df_find_use (insn, x);
3d6b8be7 315 if (!use)
316 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
317 inv = invariant_for_use (use);
318 if (!inv)
319 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
320
321 gcc_assert (inv->eqto != ~0u);
322 return inv->eqto;
323
324 default:
325 break;
326 }
327
328 fmt = GET_RTX_FORMAT (code);
329 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
330 {
331 if (fmt[i] == 'e')
332 val ^= hash_invariant_expr_1 (insn, XEXP (x, i));
333 else if (fmt[i] == 'E')
334 {
335 for (j = 0; j < XVECLEN (x, i); j++)
336 val ^= hash_invariant_expr_1 (insn, XVECEXP (x, i, j));
337 }
5df640f6 338 else if (fmt[i] == 'i' || fmt[i] == 'n')
339 val ^= XINT (x, i);
3d6b8be7 340 }
341
342 return val;
343}
344
345/* Returns true if the invariant expressions E1 and E2 used in insns INSN1
346 and INSN2 have always the same value. */
347
348static bool
349invariant_expr_equal_p (rtx insn1, rtx e1, rtx insn2, rtx e2)
350{
351 enum rtx_code code = GET_CODE (e1);
352 int i, j;
353 const char *fmt;
ed6e85ae 354 df_ref use1, use2;
3d6b8be7 355 struct invariant *inv1 = NULL, *inv2 = NULL;
356 rtx sub1, sub2;
357
358 /* If mode of only one of the operands is VOIDmode, it is not equivalent to
359 the other one. If both are VOIDmode, we rely on the caller of this
360 function to verify that their modes are the same. */
361 if (code != GET_CODE (e2) || GET_MODE (e1) != GET_MODE (e2))
362 return false;
363
364 switch (code)
365 {
366 case CONST_INT:
367 case CONST_DOUBLE:
e397ad8e 368 case CONST_FIXED:
3d6b8be7 369 case SYMBOL_REF:
370 case CONST:
371 case LABEL_REF:
372 return rtx_equal_p (e1, e2);
373
374 case REG:
3072d30e 375 use1 = df_find_use (insn1, e1);
376 use2 = df_find_use (insn2, e2);
3d6b8be7 377 if (use1)
378 inv1 = invariant_for_use (use1);
379 if (use2)
380 inv2 = invariant_for_use (use2);
381
382 if (!inv1 && !inv2)
383 return rtx_equal_p (e1, e2);
384
385 if (!inv1 || !inv2)
386 return false;
387
388 gcc_assert (inv1->eqto != ~0u);
389 gcc_assert (inv2->eqto != ~0u);
390 return inv1->eqto == inv2->eqto;
391
392 default:
393 break;
394 }
395
396 fmt = GET_RTX_FORMAT (code);
397 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
398 {
399 if (fmt[i] == 'e')
400 {
401 sub1 = XEXP (e1, i);
402 sub2 = XEXP (e2, i);
403
404 if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
405 return false;
406 }
407
408 else if (fmt[i] == 'E')
409 {
410 if (XVECLEN (e1, i) != XVECLEN (e2, i))
411 return false;
412
413 for (j = 0; j < XVECLEN (e1, i); j++)
414 {
415 sub1 = XVECEXP (e1, i, j);
416 sub2 = XVECEXP (e2, i, j);
417
418 if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
419 return false;
420 }
421 }
5df640f6 422 else if (fmt[i] == 'i' || fmt[i] == 'n')
423 {
424 if (XINT (e1, i) != XINT (e2, i))
425 return false;
426 }
427 /* Unhandled type of subexpression, we fail conservatively. */
428 else
429 return false;
3d6b8be7 430 }
431
432 return true;
433}
434
435/* Returns hash value for invariant expression entry E. */
436
437static hashval_t
438hash_invariant_expr (const void *e)
439{
4077bf7a 440 const struct invariant_expr_entry *const entry =
441 (const struct invariant_expr_entry *) e;
3d6b8be7 442
443 return entry->hash;
444}
445
446/* Compares invariant expression entries E1 and E2. */
447
448static int
449eq_invariant_expr (const void *e1, const void *e2)
450{
4077bf7a 451 const struct invariant_expr_entry *const entry1 =
452 (const struct invariant_expr_entry *) e1;
453 const struct invariant_expr_entry *const entry2 =
454 (const struct invariant_expr_entry *) e2;
3d6b8be7 455
456 if (entry1->mode != entry2->mode)
457 return 0;
458
459 return invariant_expr_equal_p (entry1->inv->insn, entry1->expr,
460 entry2->inv->insn, entry2->expr);
461}
462
463/* Checks whether invariant with value EXPR in machine mode MODE is
464 recorded in EQ. If this is the case, return the invariant. Otherwise
465 insert INV to the table for this expression and return INV. */
466
467static struct invariant *
468find_or_insert_inv (htab_t eq, rtx expr, enum machine_mode mode,
469 struct invariant *inv)
470{
471 hashval_t hash = hash_invariant_expr_1 (inv->insn, expr);
472 struct invariant_expr_entry *entry;
473 struct invariant_expr_entry pentry;
474 PTR *slot;
475
476 pentry.expr = expr;
477 pentry.inv = inv;
478 pentry.mode = mode;
479 slot = htab_find_slot_with_hash (eq, &pentry, hash, INSERT);
4077bf7a 480 entry = (struct invariant_expr_entry *) *slot;
3d6b8be7 481
482 if (entry)
483 return entry->inv;
484
4c36ffe6 485 entry = XNEW (struct invariant_expr_entry);
3d6b8be7 486 entry->inv = inv;
487 entry->expr = expr;
488 entry->mode = mode;
489 entry->hash = hash;
490 *slot = entry;
491
492 return inv;
493}
494
495/* Finds invariants identical to INV and records the equivalence. EQ is the
496 hash table of the invariants. */
497
498static void
499find_identical_invariants (htab_t eq, struct invariant *inv)
500{
501 unsigned depno;
502 bitmap_iterator bi;
503 struct invariant *dep;
504 rtx expr, set;
505 enum machine_mode mode;
506
507 if (inv->eqto != ~0u)
508 return;
509
510 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
511 {
512 dep = VEC_index (invariant_p, invariants, depno);
513 find_identical_invariants (eq, dep);
514 }
515
516 set = single_set (inv->insn);
517 expr = SET_SRC (set);
518 mode = GET_MODE (expr);
519 if (mode == VOIDmode)
520 mode = GET_MODE (SET_DEST (set));
521 inv->eqto = find_or_insert_inv (eq, expr, mode, inv)->invno;
522
523 if (dump_file && inv->eqto != inv->invno)
524 fprintf (dump_file,
5ed26a34 525 "Invariant %d is equivalent to invariant %d.\n",
3d6b8be7 526 inv->invno, inv->eqto);
527}
528
529/* Find invariants with the same value and record the equivalences. */
530
531static void
532merge_identical_invariants (void)
533{
534 unsigned i;
535 struct invariant *inv;
536 htab_t eq = htab_create (VEC_length (invariant_p, invariants),
537 hash_invariant_expr, eq_invariant_expr, free);
538
48148244 539 FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
3d6b8be7 540 find_identical_invariants (eq, inv);
541
542 htab_delete (eq);
543}
544
3a0ecac2 545/* Determines the basic blocks inside LOOP that are always executed and
546 stores their bitmap to ALWAYS_REACHED. MAY_EXIT is a bitmap of
547 basic blocks that may either exit the loop, or contain the call that
548 does not have to return. BODY is body of the loop obtained by
549 get_loop_body_in_dom_order. */
550
551static void
552compute_always_reached (struct loop *loop, basic_block *body,
553 bitmap may_exit, bitmap always_reached)
554{
555 unsigned i;
556
557 for (i = 0; i < loop->num_nodes; i++)
558 {
559 if (dominated_by_p (CDI_DOMINATORS, loop->latch, body[i]))
560 bitmap_set_bit (always_reached, i);
561
562 if (bitmap_bit_p (may_exit, i))
563 return;
564 }
565}
566
567/* Finds exits out of the LOOP with body BODY. Marks blocks in that we may
568 exit the loop by cfg edge to HAS_EXIT and MAY_EXIT. In MAY_EXIT
569 additionally mark blocks that may exit due to a call. */
570
571static void
572find_exits (struct loop *loop, basic_block *body,
573 bitmap may_exit, bitmap has_exit)
574{
575 unsigned i;
cd665a06 576 edge_iterator ei;
3a0ecac2 577 edge e;
578 struct loop *outermost_exit = loop, *aexit;
579 bool has_call = false;
580 rtx insn;
581
582 for (i = 0; i < loop->num_nodes; i++)
583 {
584 if (body[i]->loop_father == loop)
585 {
586 FOR_BB_INSNS (body[i], insn)
587 {
6d7dc5b9 588 if (CALL_P (insn)
9c2a0c05 589 && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
590 || !RTL_CONST_OR_PURE_CALL_P (insn)))
3a0ecac2 591 {
592 has_call = true;
593 bitmap_set_bit (may_exit, i);
594 break;
595 }
596 }
597
cd665a06 598 FOR_EACH_EDGE (e, ei, body[i]->succs)
3a0ecac2 599 {
600 if (flow_bb_inside_loop_p (loop, e->dest))
601 continue;
602
603 bitmap_set_bit (may_exit, i);
604 bitmap_set_bit (has_exit, i);
605 outermost_exit = find_common_loop (outermost_exit,
606 e->dest->loop_father);
607 }
608 continue;
609 }
c2aa3ceb 610
3a0ecac2 611 /* Use the data stored for the subloop to decide whether we may exit
612 through it. It is sufficient to do this for header of the loop,
613 as other basic blocks inside it must be dominated by it. */
614 if (body[i]->loop_father->header != body[i])
615 continue;
616
617 if (LOOP_DATA (body[i]->loop_father)->has_call)
618 {
619 has_call = true;
620 bitmap_set_bit (may_exit, i);
621 }
622 aexit = LOOP_DATA (body[i]->loop_father)->outermost_exit;
623 if (aexit != loop)
624 {
625 bitmap_set_bit (may_exit, i);
626 bitmap_set_bit (has_exit, i);
627
628 if (flow_loop_nested_p (aexit, outermost_exit))
629 outermost_exit = aexit;
630 }
631 }
632
e8eed2f8 633 if (loop->aux == NULL)
634 {
635 loop->aux = xcalloc (1, sizeof (struct loop_data));
636 bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
637 bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
638 }
3a0ecac2 639 LOOP_DATA (loop)->outermost_exit = outermost_exit;
640 LOOP_DATA (loop)->has_call = has_call;
641}
642
643/* Check whether we may assign a value to X from a register. */
644
645static bool
646may_assign_reg_p (rtx x)
647{
51fb5608 648 return (GET_MODE (x) != VOIDmode
a436996a 649 && GET_MODE (x) != BLKmode
51fb5608 650 && can_copy_p (GET_MODE (x))
2c5cdc40 651 && (!REG_P (x)
652 || !HARD_REGISTER_P (x)
653 || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
3a0ecac2 654}
655
c2aa3ceb 656/* Finds definitions that may correspond to invariants in LOOP with body
657 BODY. */
3a0ecac2 658
659static void
c2aa3ceb 660find_defs (struct loop *loop, basic_block *body)
3a0ecac2 661{
662 unsigned i;
27335ffd 663 bitmap blocks = BITMAP_ALLOC (NULL);
3a0ecac2 664
665 for (i = 0; i < loop->num_nodes; i++)
666 bitmap_set_bit (blocks, body[i]->index);
667
3072d30e 668 df_remove_problem (df_chain);
669 df_process_deferred_rescans ();
670 df_chain_add_problem (DF_UD_CHAIN);
671 df_set_blocks (blocks);
672 df_analyze ();
673
674 if (dump_file)
675 {
774f8797 676 df_dump_region (dump_file);
3072d30e 677 fprintf (dump_file, "*****starting processing of loop ******\n");
678 print_rtl_with_bb (dump_file, get_insns ());
679 fprintf (dump_file, "*****ending processing of loop ******\n");
680 }
681 check_invariant_table_size ();
682
27335ffd 683 BITMAP_FREE (blocks);
3a0ecac2 684}
685
686/* Creates a new invariant for definition DEF in INSN, depending on invariants
687 in DEPENDS_ON. ALWAYS_EXECUTED is true if the insn is always executed,
3d6b8be7 688 unless the program ends due to a function call. The newly created invariant
689 is returned. */
3a0ecac2 690
3d6b8be7 691static struct invariant *
3a0ecac2 692create_new_invariant (struct def *def, rtx insn, bitmap depends_on,
693 bool always_executed)
694{
4c36ffe6 695 struct invariant *inv = XNEW (struct invariant);
3a0ecac2 696 rtx set = single_set (insn);
f529eb25 697 bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
3a0ecac2 698
699 inv->def = def;
700 inv->always_executed = always_executed;
701 inv->depends_on = depends_on;
702
703 /* If the set is simple, usually by moving it we move the whole store out of
704 the loop. Otherwise we save only cost of the computation. */
705 if (def)
68461c19 706 {
b72d459f 707 inv->cost = set_rtx_cost (set, speed);
21a9b734 708 /* ??? Try to determine cheapness of address computation. Unfortunately
709 the address cost is only a relative measure, we can't really compare
710 it with any absolute number, but only with other address costs.
711 But here we don't have any other addresses, so compare with a magic
712 number anyway. It has to be large enough to not regress PR33928
713 (by avoiding to move reg+8,reg+16,reg+24 invariants), but small
714 enough to not regress 410.bwaves either (by still moving reg+reg
715 invariants).
716 See http://gcc.gnu.org/ml/gcc-patches/2009-10/msg01210.html . */
68461c19 717 inv->cheap_address = address_cost (SET_SRC (set), word_mode,
bd1a81f7 718 ADDR_SPACE_GENERIC, speed) < 3;
68461c19 719 }
3a0ecac2 720 else
68461c19 721 {
7013e87c 722 inv->cost = set_src_cost (SET_SRC (set), speed);
68461c19 723 inv->cheap_address = false;
724 }
3a0ecac2 725
726 inv->move = false;
3d6b8be7 727 inv->reg = NULL_RTX;
e8eed2f8 728 inv->orig_regno = -1;
3a0ecac2 729 inv->stamp = 0;
730 inv->insn = insn;
731
703056c9 732 inv->invno = VEC_length (invariant_p, invariants);
3d6b8be7 733 inv->eqto = ~0u;
3a0ecac2 734 if (def)
735 def->invno = inv->invno;
703056c9 736 VEC_safe_push (invariant_p, heap, invariants, inv);
3a0ecac2 737
738 if (dump_file)
739 {
740 fprintf (dump_file,
741 "Set in insn %d is invariant (%d), cost %d, depends on ",
742 INSN_UID (insn), inv->invno, inv->cost);
743 dump_bitmap (dump_file, inv->depends_on);
744 }
3d6b8be7 745
746 return inv;
3a0ecac2 747}
748
749/* Record USE at DEF. */
750
751static void
68461c19 752record_use (struct def *def, df_ref use)
3a0ecac2 753{
4c36ffe6 754 struct use *u = XNEW (struct use);
3a0ecac2 755
68461c19 756 u->pos = DF_REF_REAL_LOC (use);
757 u->insn = DF_REF_INSN (use);
758 u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
5c83cd34 759 || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
3a0ecac2 760 u->next = def->uses;
761 def->uses = u;
762 def->n_uses++;
68461c19 763 if (u->addr_use_p)
764 def->n_addr_uses++;
3a0ecac2 765}
766
3072d30e 767/* Finds the invariants USE depends on and store them to the DEPENDS_ON
768 bitmap. Returns true if all dependencies of USE are known to be
2e33cac5 769 loop invariants, false otherwise. */
3a0ecac2 770
771static bool
ed6e85ae 772check_dependency (basic_block bb, df_ref use, bitmap depends_on)
3a0ecac2 773{
ed6e85ae 774 df_ref def;
3072d30e 775 basic_block def_bb;
e011eba9 776 struct df_link *defs;
3a0ecac2 777 struct def *def_data;
3d6b8be7 778 struct invariant *inv;
48e1416a 779
ed6e85ae 780 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
3072d30e 781 return false;
48e1416a 782
3072d30e 783 defs = DF_REF_CHAIN (use);
784 if (!defs)
785 return true;
48e1416a 786
3072d30e 787 if (defs->next)
788 return false;
48e1416a 789
3072d30e 790 def = defs->ref;
791 check_invariant_table_size ();
792 inv = invariant_table[DF_REF_ID(def)];
793 if (!inv)
794 return false;
48e1416a 795
3072d30e 796 def_data = inv->def;
797 gcc_assert (def_data != NULL);
48e1416a 798
3072d30e 799 def_bb = DF_REF_BB (def);
800 /* Note that in case bb == def_bb, we know that the definition
801 dominates insn, because def has invariant_table[DF_REF_ID(def)]
802 defined and we process the insns in the basic block bb
803 sequentially. */
804 if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
805 return false;
48e1416a 806
3072d30e 807 bitmap_set_bit (depends_on, def_data->invno);
808 return true;
809}
3d6b8be7 810
3d6b8be7 811
3072d30e 812/* Finds the invariants INSN depends on and store them to the DEPENDS_ON
813 bitmap. Returns true if all dependencies of INSN are known to be
814 loop invariants, false otherwise. */
3a0ecac2 815
3072d30e 816static bool
817check_dependencies (rtx insn, bitmap depends_on)
818{
158b6cc9 819 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
ed6e85ae 820 df_ref *use_rec;
3072d30e 821 basic_block bb = BLOCK_FOR_INSN (insn);
3a0ecac2 822
158b6cc9 823 for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
3072d30e 824 if (!check_dependency (bb, *use_rec, depends_on))
825 return false;
158b6cc9 826 for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
3072d30e 827 if (!check_dependency (bb, *use_rec, depends_on))
828 return false;
48e1416a 829
3a0ecac2 830 return true;
831}
832
833/* Finds invariant in INSN. ALWAYS_REACHED is true if the insn is always
834 executed. ALWAYS_EXECUTED is true if the insn is always executed,
c2aa3ceb 835 unless the program ends due to a function call. */
3a0ecac2 836
837static void
c2aa3ceb 838find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
3a0ecac2 839{
ed6e85ae 840 df_ref ref;
3a0ecac2 841 struct def *def;
842 bitmap depends_on;
843 rtx set, dest;
844 bool simple = true;
3d6b8be7 845 struct invariant *inv;
3a0ecac2 846
d9da8b4c 847#ifdef HAVE_cc0
848 /* We can't move a CC0 setter without the user. */
849 if (sets_cc0_p (insn))
850 return;
851#endif
852
3a0ecac2 853 set = single_set (insn);
854 if (!set)
855 return;
856 dest = SET_DEST (set);
857
1c14a50e 858 if (!REG_P (dest)
3a0ecac2 859 || HARD_REGISTER_P (dest))
860 simple = false;
861
2c5cdc40 862 if (!may_assign_reg_p (SET_DEST (set))
863 || !check_maybe_invariant (SET_SRC (set)))
3a0ecac2 864 return;
865
a39b96b6 866 /* If the insn can throw exception, we cannot move it at all without changing
867 cfg. */
868 if (can_throw_internal (insn))
869 return;
3a0ecac2 870
a39b96b6 871 /* We cannot make trapping insn executed, unless it was executed before. */
0eee494e 872 if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
a39b96b6 873 return;
3a0ecac2 874
27335ffd 875 depends_on = BITMAP_ALLOC (NULL);
c2aa3ceb 876 if (!check_dependencies (insn, depends_on))
3a0ecac2 877 {
27335ffd 878 BITMAP_FREE (depends_on);
3a0ecac2 879 return;
880 }
881
882 if (simple)
4c36ffe6 883 def = XCNEW (struct def);
3a0ecac2 884 else
885 def = NULL;
886
3d6b8be7 887 inv = create_new_invariant (def, insn, depends_on, always_executed);
888
889 if (simple)
890 {
3072d30e 891 ref = df_find_def (insn, dest);
892 check_invariant_table_size ();
893 invariant_table[DF_REF_ID(ref)] = inv;
3d6b8be7 894 }
3a0ecac2 895}
896
c2aa3ceb 897/* Record registers used in INSN that have a unique invariant definition. */
3a0ecac2 898
899static void
c2aa3ceb 900record_uses (rtx insn)
3a0ecac2 901{
158b6cc9 902 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
ed6e85ae 903 df_ref *use_rec;
3d6b8be7 904 struct invariant *inv;
905
158b6cc9 906 for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
3072d30e 907 {
ed6e85ae 908 df_ref use = *use_rec;
3072d30e 909 inv = invariant_for_use (use);
910 if (inv)
68461c19 911 record_use (inv->def, use);
3072d30e 912 }
158b6cc9 913 for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
3a0ecac2 914 {
ed6e85ae 915 df_ref use = *use_rec;
3d6b8be7 916 inv = invariant_for_use (use);
917 if (inv)
68461c19 918 record_use (inv->def, use);
3a0ecac2 919 }
920}
921
922/* Finds invariants in INSN. ALWAYS_REACHED is true if the insn is always
923 executed. ALWAYS_EXECUTED is true if the insn is always executed,
c2aa3ceb 924 unless the program ends due to a function call. */
3a0ecac2 925
926static void
c2aa3ceb 927find_invariants_insn (rtx insn, bool always_reached, bool always_executed)
3a0ecac2 928{
c2aa3ceb 929 find_invariant_insn (insn, always_reached, always_executed);
930 record_uses (insn);
3a0ecac2 931}
932
933/* Finds invariants in basic block BB. ALWAYS_REACHED is true if the
934 basic block is always executed. ALWAYS_EXECUTED is true if the basic
935 block is always executed, unless the program ends due to a function
c2aa3ceb 936 call. */
3a0ecac2 937
938static void
c2aa3ceb 939find_invariants_bb (basic_block bb, bool always_reached, bool always_executed)
3a0ecac2 940{
941 rtx insn;
942
943 FOR_BB_INSNS (bb, insn)
944 {
9845d120 945 if (!NONDEBUG_INSN_P (insn))
3a0ecac2 946 continue;
947
c2aa3ceb 948 find_invariants_insn (insn, always_reached, always_executed);
3a0ecac2 949
950 if (always_reached
6d7dc5b9 951 && CALL_P (insn)
9c2a0c05 952 && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
953 || ! RTL_CONST_OR_PURE_CALL_P (insn)))
3a0ecac2 954 always_reached = false;
955 }
956}
957
958/* Finds invariants in LOOP with body BODY. ALWAYS_REACHED is the bitmap of
959 basic blocks in BODY that are always executed. ALWAYS_EXECUTED is the
960 bitmap of basic blocks in BODY that are always executed unless the program
c2aa3ceb 961 ends due to a function call. */
3a0ecac2 962
963static void
964find_invariants_body (struct loop *loop, basic_block *body,
c2aa3ceb 965 bitmap always_reached, bitmap always_executed)
3a0ecac2 966{
967 unsigned i;
968
969 for (i = 0; i < loop->num_nodes; i++)
970 find_invariants_bb (body[i],
971 bitmap_bit_p (always_reached, i),
c2aa3ceb 972 bitmap_bit_p (always_executed, i));
3a0ecac2 973}
974
c2aa3ceb 975/* Finds invariants in LOOP. */
3a0ecac2 976
977static void
c2aa3ceb 978find_invariants (struct loop *loop)
3a0ecac2 979{
27335ffd 980 bitmap may_exit = BITMAP_ALLOC (NULL);
981 bitmap always_reached = BITMAP_ALLOC (NULL);
982 bitmap has_exit = BITMAP_ALLOC (NULL);
983 bitmap always_executed = BITMAP_ALLOC (NULL);
3a0ecac2 984 basic_block *body = get_loop_body_in_dom_order (loop);
985
986 find_exits (loop, body, may_exit, has_exit);
987 compute_always_reached (loop, body, may_exit, always_reached);
988 compute_always_reached (loop, body, has_exit, always_executed);
989
c2aa3ceb 990 find_defs (loop, body);
991 find_invariants_body (loop, body, always_reached, always_executed);
3d6b8be7 992 merge_identical_invariants ();
3a0ecac2 993
27335ffd 994 BITMAP_FREE (always_reached);
995 BITMAP_FREE (always_executed);
996 BITMAP_FREE (may_exit);
997 BITMAP_FREE (has_exit);
3a0ecac2 998 free (body);
999}
1000
1001/* Frees a list of uses USE. */
1002
1003static void
1004free_use_list (struct use *use)
1005{
1006 struct use *next;
1007
1008 for (; use; use = next)
1009 {
1010 next = use->next;
1011 free (use);
1012 }
1013}
1014
66d9a7b9 1015/* Return pressure class and number of hard registers (through *NREGS)
e8eed2f8 1016 for destination of INSN. */
1017static enum reg_class
66d9a7b9 1018get_pressure_class_and_nregs (rtx insn, int *nregs)
e8eed2f8 1019{
1020 rtx reg;
66d9a7b9 1021 enum reg_class pressure_class;
e8eed2f8 1022 rtx set = single_set (insn);
48e1416a 1023
e8eed2f8 1024 /* Considered invariant insns have only one set. */
1025 gcc_assert (set != NULL_RTX);
1026 reg = SET_DEST (set);
1027 if (GET_CODE (reg) == SUBREG)
1028 reg = SUBREG_REG (reg);
1029 if (MEM_P (reg))
1030 {
1031 *nregs = 0;
66d9a7b9 1032 pressure_class = NO_REGS;
e8eed2f8 1033 }
1034 else
1035 {
1036 if (! REG_P (reg))
1037 reg = NULL_RTX;
1038 if (reg == NULL_RTX)
66d9a7b9 1039 pressure_class = GENERAL_REGS;
e8eed2f8 1040 else
66d9a7b9 1041 {
1042 pressure_class = reg_allocno_class (REGNO (reg));
1043 pressure_class = ira_pressure_class_translate[pressure_class];
1044 }
1045 *nregs
1046 = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
e8eed2f8 1047 }
66d9a7b9 1048 return pressure_class;
e8eed2f8 1049}
1050
3a0ecac2 1051/* Calculates cost and number of registers needed for moving invariant INV
1052 out of the loop and stores them to *COST and *REGS_NEEDED. */
1053
1054static void
1055get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed)
1056{
e8eed2f8 1057 int i, acomp_cost;
1058 unsigned aregs_needed[N_REG_CLASSES];
3a0ecac2 1059 unsigned depno;
1060 struct invariant *dep;
0cc4271a 1061 bitmap_iterator bi;
3a0ecac2 1062
3d6b8be7 1063 /* Find the representative of the class of the equivalent invariants. */
1064 inv = VEC_index (invariant_p, invariants, inv->eqto);
1065
3a0ecac2 1066 *comp_cost = 0;
e8eed2f8 1067 if (! flag_ira_loop_pressure)
1068 regs_needed[0] = 0;
1069 else
1070 {
66d9a7b9 1071 for (i = 0; i < ira_pressure_classes_num; i++)
1072 regs_needed[ira_pressure_classes[i]] = 0;
e8eed2f8 1073 }
1074
3a0ecac2 1075 if (inv->move
1076 || inv->stamp == actual_stamp)
1077 return;
1078 inv->stamp = actual_stamp;
1079
e8eed2f8 1080 if (! flag_ira_loop_pressure)
1081 regs_needed[0]++;
1082 else
1083 {
1084 int nregs;
66d9a7b9 1085 enum reg_class pressure_class;
e8eed2f8 1086
66d9a7b9 1087 pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1088 regs_needed[pressure_class] += nregs;
e8eed2f8 1089 }
1090
68461c19 1091 if (!inv->cheap_address
1092 || inv->def->n_addr_uses < inv->def->n_uses)
1093 (*comp_cost) += inv->cost;
3a0ecac2 1094
e207fd7a 1095#ifdef STACK_REGS
1096 {
1097 /* Hoisting constant pool constants into stack regs may cost more than
1098 just single register. On x87, the balance is affected both by the
334ec2d8 1099 small number of FP registers, and by its register stack organization,
e207fd7a 1100 that forces us to add compensation code in and around the loop to
1101 shuffle the operands to the top of stack before use, and pop them
1102 from the stack after the loop finishes.
1103
1104 To model this effect, we increase the number of registers needed for
1105 stack registers by two: one register push, and one register pop.
1106 This usually has the effect that FP constant loads from the constant
1107 pool are not moved out of the loop.
1108
1109 Note that this also means that dependent invariants can not be moved.
1110 However, the primary purpose of this pass is to move loop invariant
1111 address arithmetic out of loops, and address arithmetic that depends
1112 on floating point constants is unlikely to ever occur. */
1113 rtx set = single_set (inv->insn);
1114 if (set
e8eed2f8 1115 && IS_STACK_MODE (GET_MODE (SET_SRC (set)))
1116 && constant_pool_constant_p (SET_SRC (set)))
1117 {
1118 if (flag_ira_loop_pressure)
66d9a7b9 1119 regs_needed[ira_stack_reg_pressure_class] += 2;
e8eed2f8 1120 else
1121 regs_needed[0] += 2;
1122 }
e207fd7a 1123 }
1124#endif
1125
0cc4271a 1126 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
3a0ecac2 1127 {
e8eed2f8 1128 bool check_p;
1129
703056c9 1130 dep = VEC_index (invariant_p, invariants, depno);
3a0ecac2 1131
e8eed2f8 1132 get_inv_cost (dep, &acomp_cost, aregs_needed);
3a0ecac2 1133
e8eed2f8 1134 if (! flag_ira_loop_pressure)
1135 check_p = aregs_needed[0] != 0;
1136 else
1137 {
66d9a7b9 1138 for (i = 0; i < ira_pressure_classes_num; i++)
1139 if (aregs_needed[ira_pressure_classes[i]] != 0)
e8eed2f8 1140 break;
66d9a7b9 1141 check_p = i < ira_pressure_classes_num;
e8eed2f8 1142 }
1143 if (check_p
3a0ecac2 1144 /* We need to check always_executed, since if the original value of
1145 the invariant may be preserved, we may need to keep it in a
1146 separate register. TODO check whether the register has an
1147 use outside of the loop. */
1148 && dep->always_executed
1149 && !dep->def->uses->next)
1150 {
1151 /* If this is a single use, after moving the dependency we will not
1152 need a new register. */
e8eed2f8 1153 if (! flag_ira_loop_pressure)
1154 aregs_needed[0]--;
1155 else
1156 {
1157 int nregs;
66d9a7b9 1158 enum reg_class pressure_class;
e8eed2f8 1159
66d9a7b9 1160 pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1161 aregs_needed[pressure_class] -= nregs;
e8eed2f8 1162 }
3a0ecac2 1163 }
1164
e8eed2f8 1165 if (! flag_ira_loop_pressure)
1166 regs_needed[0] += aregs_needed[0];
1167 else
1168 {
66d9a7b9 1169 for (i = 0; i < ira_pressure_classes_num; i++)
1170 regs_needed[ira_pressure_classes[i]]
1171 += aregs_needed[ira_pressure_classes[i]];
e8eed2f8 1172 }
3a0ecac2 1173 (*comp_cost) += acomp_cost;
0cc4271a 1174 }
3a0ecac2 1175}
1176
1177/* Calculates gain for eliminating invariant INV. REGS_USED is the number
25153338 1178 of registers used in the loop, NEW_REGS is the number of new variables
1179 already added due to the invariant motion. The number of registers needed
a6b74a67 1180 for it is stored in *REGS_NEEDED. SPEED and CALL_P are flags passed
1181 through to estimate_reg_pressure_cost. */
3a0ecac2 1182
1183static int
1184gain_for_invariant (struct invariant *inv, unsigned *regs_needed,
a6b74a67 1185 unsigned *new_regs, unsigned regs_used,
1186 bool speed, bool call_p)
3a0ecac2 1187{
1188 int comp_cost, size_cost;
1189
3a0ecac2 1190 actual_stamp++;
1191
e8eed2f8 1192 get_inv_cost (inv, &comp_cost, regs_needed);
1193
1194 if (! flag_ira_loop_pressure)
1195 {
1196 size_cost = (estimate_reg_pressure_cost (new_regs[0] + regs_needed[0],
a6b74a67 1197 regs_used, speed, call_p)
e8eed2f8 1198 - estimate_reg_pressure_cost (new_regs[0],
a6b74a67 1199 regs_used, speed, call_p));
e8eed2f8 1200 }
1201 else
1202 {
1203 int i;
66d9a7b9 1204 enum reg_class pressure_class;
e8eed2f8 1205
66d9a7b9 1206 for (i = 0; i < ira_pressure_classes_num; i++)
e8eed2f8 1207 {
66d9a7b9 1208 pressure_class = ira_pressure_classes[i];
1209 if ((int) new_regs[pressure_class]
1210 + (int) regs_needed[pressure_class]
1211 + LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
e8eed2f8 1212 + IRA_LOOP_RESERVED_REGS
1072fecf 1213 > ira_class_hard_regs_num[pressure_class])
e8eed2f8 1214 break;
1215 }
66d9a7b9 1216 if (i < ira_pressure_classes_num)
e8eed2f8 1217 /* There will be register pressure excess and we want not to
1218 make this loop invariant motion. All loop invariants with
1219 non-positive gains will be rejected in function
1220 find_invariants_to_move. Therefore we return the negative
1221 number here.
1222
1223 One could think that this rejects also expensive loop
1224 invariant motions and this will hurt code performance.
1225 However numerous experiments with different heuristics
1226 taking invariant cost into account did not confirm this
1227 assumption. There are possible explanations for this
1228 result:
1229 o probably all expensive invariants were already moved out
1230 of the loop by PRE and gimple invariant motion pass.
1231 o expensive invariant execution will be hidden by insn
1232 scheduling or OOO processor hardware because usually such
1233 invariants have a lot of freedom to be executed
1234 out-of-order.
1235 Another reason for ignoring invariant cost vs spilling cost
1236 heuristics is also in difficulties to evaluate accurately
1237 spill cost at this stage. */
1238 return -1;
1239 else
1240 size_cost = 0;
1241 }
3a0ecac2 1242
1243 return comp_cost - size_cost;
1244}
1245
1246/* Finds invariant with best gain for moving. Returns the gain, stores
1247 the invariant in *BEST and number of registers needed for it to
25153338 1248 *REGS_NEEDED. REGS_USED is the number of registers used in the loop.
1249 NEW_REGS is the number of new variables already added due to invariant
1250 motion. */
3a0ecac2 1251
1252static int
1253best_gain_for_invariant (struct invariant **best, unsigned *regs_needed,
a6b74a67 1254 unsigned *new_regs, unsigned regs_used,
1255 bool speed, bool call_p)
3a0ecac2 1256{
1257 struct invariant *inv;
e8eed2f8 1258 int i, gain = 0, again;
1259 unsigned aregs_needed[N_REG_CLASSES], invno;
3a0ecac2 1260
48148244 1261 FOR_EACH_VEC_ELT (invariant_p, invariants, invno, inv)
3a0ecac2 1262 {
3a0ecac2 1263 if (inv->move)
1264 continue;
1265
3d6b8be7 1266 /* Only consider the "representatives" of equivalent invariants. */
1267 if (inv->eqto != inv->invno)
1268 continue;
1269
e8eed2f8 1270 again = gain_for_invariant (inv, aregs_needed, new_regs, regs_used,
a6b74a67 1271 speed, call_p);
3a0ecac2 1272 if (again > gain)
1273 {
1274 gain = again;
1275 *best = inv;
e8eed2f8 1276 if (! flag_ira_loop_pressure)
1277 regs_needed[0] = aregs_needed[0];
1278 else
1279 {
66d9a7b9 1280 for (i = 0; i < ira_pressure_classes_num; i++)
1281 regs_needed[ira_pressure_classes[i]]
1282 = aregs_needed[ira_pressure_classes[i]];
e8eed2f8 1283 }
3a0ecac2 1284 }
1285 }
1286
1287 return gain;
1288}
1289
1290/* Marks invariant INVNO and all its dependencies for moving. */
1291
1292static void
e8eed2f8 1293set_move_mark (unsigned invno, int gain)
3a0ecac2 1294{
703056c9 1295 struct invariant *inv = VEC_index (invariant_p, invariants, invno);
0cc4271a 1296 bitmap_iterator bi;
3a0ecac2 1297
3d6b8be7 1298 /* Find the representative of the class of the equivalent invariants. */
1299 inv = VEC_index (invariant_p, invariants, inv->eqto);
1300
3a0ecac2 1301 if (inv->move)
1302 return;
1303 inv->move = true;
1304
1305 if (dump_file)
e8eed2f8 1306 {
1307 if (gain >= 0)
1308 fprintf (dump_file, "Decided to move invariant %d -- gain %d\n",
1309 invno, gain);
1310 else
1311 fprintf (dump_file, "Decided to move dependent invariant %d\n",
1312 invno);
1313 };
3a0ecac2 1314
0cc4271a 1315 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, invno, bi)
1316 {
e8eed2f8 1317 set_move_mark (invno, -1);
0cc4271a 1318 }
3a0ecac2 1319}
1320
c2aa3ceb 1321/* Determines which invariants to move. */
3a0ecac2 1322
1323static void
a6b74a67 1324find_invariants_to_move (bool speed, bool call_p)
3a0ecac2 1325{
e8eed2f8 1326 int gain;
1327 unsigned i, regs_used, regs_needed[N_REG_CLASSES], new_regs[N_REG_CLASSES];
3a0ecac2 1328 struct invariant *inv = NULL;
1329
703056c9 1330 if (!VEC_length (invariant_p, invariants))
3a0ecac2 1331 return;
1332
e8eed2f8 1333 if (flag_ira_loop_pressure)
48e1416a 1334 /* REGS_USED is actually never used when the flag is on. */
e8eed2f8 1335 regs_used = 0;
1336 else
1337 /* We do not really do a good job in estimating number of
1338 registers used; we put some initial bound here to stand for
1339 induction variables etc. that we do not detect. */
3a0ecac2 1340 {
e8eed2f8 1341 unsigned int n_regs = DF_REG_SIZE (df);
1342
1343 regs_used = 2;
48e1416a 1344
e8eed2f8 1345 for (i = 0; i < n_regs; i++)
3a0ecac2 1346 {
e8eed2f8 1347 if (!DF_REGNO_FIRST_DEF (i) && DF_REGNO_LAST_USE (i))
1348 {
1349 /* This is a value that is used but not changed inside loop. */
1350 regs_used++;
1351 }
3a0ecac2 1352 }
1353 }
1354
e8eed2f8 1355 if (! flag_ira_loop_pressure)
1356 new_regs[0] = regs_needed[0] = 0;
1357 else
3a0ecac2 1358 {
66d9a7b9 1359 for (i = 0; (int) i < ira_pressure_classes_num; i++)
1360 new_regs[ira_pressure_classes[i]] = 0;
e8eed2f8 1361 }
1362 while ((gain = best_gain_for_invariant (&inv, regs_needed,
a6b74a67 1363 new_regs, regs_used,
1364 speed, call_p)) > 0)
e8eed2f8 1365 {
1366 set_move_mark (inv->invno, gain);
1367 if (! flag_ira_loop_pressure)
1368 new_regs[0] += regs_needed[0];
1369 else
1370 {
66d9a7b9 1371 for (i = 0; (int) i < ira_pressure_classes_num; i++)
1372 new_regs[ira_pressure_classes[i]]
1373 += regs_needed[ira_pressure_classes[i]];
e8eed2f8 1374 }
3a0ecac2 1375 }
1376}
1377
cc6541e2 1378/* Replace the uses, reached by the definition of invariant INV, by REG.
1379
1380 IN_GROUP is nonzero if this is part of a group of changes that must be
1381 performed as a group. In that case, the changes will be stored. The
1382 function `apply_change_group' will validate and apply the changes. */
1383
1384static int
1385replace_uses (struct invariant *inv, rtx reg, bool in_group)
1386{
1387 /* Replace the uses we know to be dominated. It saves work for copy
1388 propagation, and also it is necessary so that dependent invariants
1389 are computed right. */
1390 if (inv->def)
1391 {
1392 struct use *use;
1393 for (use = inv->def->uses; use; use = use->next)
1394 validate_change (use->insn, use->pos, reg, true);
1395
1396 /* If we aren't part of a larger group, apply the changes now. */
1397 if (!in_group)
1398 return apply_change_group ();
1399 }
1400
1401 return 1;
1402}
1403
1e41d0e2 1404/* Move invariant INVNO out of the LOOP. Returns true if this succeeds, false
1405 otherwise. */
1406
1407static bool
c2aa3ceb 1408move_invariant_reg (struct loop *loop, unsigned invno)
3a0ecac2 1409{
703056c9 1410 struct invariant *inv = VEC_index (invariant_p, invariants, invno);
3d6b8be7 1411 struct invariant *repr = VEC_index (invariant_p, invariants, inv->eqto);
3a0ecac2 1412 unsigned i;
1413 basic_block preheader = loop_preheader_edge (loop)->src;
c69c2a10 1414 rtx reg, set, dest, note;
0cc4271a 1415 bitmap_iterator bi;
cc6541e2 1416 int regno = -1;
3a0ecac2 1417
1e41d0e2 1418 if (inv->reg)
1419 return true;
1420 if (!repr->move)
1421 return false;
cc6541e2 1422
3d6b8be7 1423 /* If this is a representative of the class of equivalent invariants,
1424 really move the invariant. Otherwise just replace its use with
1425 the register used for the representative. */
1426 if (inv == repr)
3a0ecac2 1427 {
3d6b8be7 1428 if (inv->depends_on)
3a0ecac2 1429 {
3d6b8be7 1430 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, i, bi)
1431 {
1e41d0e2 1432 if (!move_invariant_reg (loop, i))
1433 goto fail;
3d6b8be7 1434 }
0cc4271a 1435 }
3a0ecac2 1436
3d6b8be7 1437 /* Move the set out of the loop. If the set is always executed (we could
cc6541e2 1438 omit this condition if we know that the register is unused outside of
1439 the loop, but it does not seem worth finding out) and it has no uses
1440 that would not be dominated by it, we may just move it (TODO).
1441 Otherwise we need to create a temporary register. */
3d6b8be7 1442 set = single_set (inv->insn);
e8eed2f8 1443 reg = dest = SET_DEST (set);
1444 if (GET_CODE (reg) == SUBREG)
1445 reg = SUBREG_REG (reg);
1446 if (REG_P (reg))
1447 regno = REGNO (reg);
1448
ae12ddda 1449 reg = gen_reg_rtx_and_attrs (dest);
3d6b8be7 1450
c69c2a10 1451 /* Try replacing the destination by a new pseudoregister. */
cc6541e2 1452 validate_change (inv->insn, &SET_DEST (set), reg, true);
1453
1454 /* As well as all the dominated uses. */
1455 replace_uses (inv, reg, true);
1456
1457 /* And validate all the changes. */
1458 if (!apply_change_group ())
c69c2a10 1459 goto fail;
c69c2a10 1460
1461 emit_insn_after (gen_move_insn (dest, reg), inv->insn);
1462 reorder_insns (inv->insn, inv->insn, BB_END (preheader));
1463
2521c084 1464 /* If there is a REG_EQUAL note on the insn we just moved, and the
1465 insn is in a basic block that is not always executed or the note
1466 contains something for which we don't know the invariant status,
1467 the note may no longer be valid after we move the insn. Note that
1468 uses in REG_EQUAL notes are taken into account in the computation
1469 of invariants, so it is safe to retain the note even if it contains
1470 register references for which we know the invariant status. */
1471 if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))
1472 && (!inv->always_executed
1473 || !check_maybe_invariant (XEXP (note, 0))))
c69c2a10 1474 remove_note (inv->insn, note);
e363ebc7 1475 }
1476 else
1477 {
1e41d0e2 1478 if (!move_invariant_reg (loop, repr->invno))
1479 goto fail;
3d6b8be7 1480 reg = repr->reg;
e8eed2f8 1481 regno = repr->orig_regno;
cc6541e2 1482 if (!replace_uses (inv, reg, false))
1483 goto fail;
3d6b8be7 1484 set = single_set (inv->insn);
e011eba9 1485 emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
1486 delete_insn (inv->insn);
e363ebc7 1487 }
3a0ecac2 1488
3d6b8be7 1489 inv->reg = reg;
e8eed2f8 1490 inv->orig_regno = regno;
3d6b8be7 1491
1e41d0e2 1492 return true;
1493
1494fail:
1495 /* If we failed, clear move flag, so that we do not try to move inv
1496 again. */
1497 if (dump_file)
1498 fprintf (dump_file, "Failed to move invariant %d\n", invno);
1499 inv->move = false;
1500 inv->reg = NULL_RTX;
e8eed2f8 1501 inv->orig_regno = -1;
3072d30e 1502
1e41d0e2 1503 return false;
3a0ecac2 1504}
1505
1506/* Move selected invariant out of the LOOP. Newly created regs are marked
c2aa3ceb 1507 in TEMPORARY_REGS. */
3a0ecac2 1508
1509static void
c2aa3ceb 1510move_invariants (struct loop *loop)
3a0ecac2 1511{
1512 struct invariant *inv;
1513 unsigned i;
1514
48148244 1515 FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
3d6b8be7 1516 move_invariant_reg (loop, i);
e8eed2f8 1517 if (flag_ira_loop_pressure && resize_reg_info ())
1518 {
48148244 1519 FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
e8eed2f8 1520 if (inv->reg != NULL_RTX)
1521 {
1522 if (inv->orig_regno >= 0)
1523 setup_reg_classes (REGNO (inv->reg),
1524 reg_preferred_class (inv->orig_regno),
1525 reg_alternate_class (inv->orig_regno),
66d9a7b9 1526 reg_allocno_class (inv->orig_regno));
e8eed2f8 1527 else
1528 setup_reg_classes (REGNO (inv->reg),
1529 GENERAL_REGS, NO_REGS, GENERAL_REGS);
1530 }
1531 }
3a0ecac2 1532}
1533
1534/* Initializes invariant motion data. */
1535
1536static void
1537init_inv_motion_data (void)
1538{
1539 actual_stamp = 1;
1540
703056c9 1541 invariants = VEC_alloc (invariant_p, heap, 100);
3a0ecac2 1542}
1543
c2aa3ceb 1544/* Frees the data allocated by invariant motion. */
3a0ecac2 1545
1546static void
c2aa3ceb 1547free_inv_motion_data (void)
3a0ecac2 1548{
1549 unsigned i;
1550 struct def *def;
1551 struct invariant *inv;
1552
3072d30e 1553 check_invariant_table_size ();
1554 for (i = 0; i < DF_DEFS_TABLE_SIZE (); i++)
3a0ecac2 1555 {
3072d30e 1556 inv = invariant_table[i];
1557 if (inv)
1558 {
1559 def = inv->def;
1560 gcc_assert (def != NULL);
48e1416a 1561
3072d30e 1562 free_use_list (def->uses);
1563 free (def);
1564 invariant_table[i] = NULL;
1565 }
3a0ecac2 1566 }
1567
48148244 1568 FOR_EACH_VEC_ELT (invariant_p, invariants, i, inv)
3a0ecac2 1569 {
27335ffd 1570 BITMAP_FREE (inv->depends_on);
3a0ecac2 1571 free (inv);
1572 }
703056c9 1573 VEC_free (invariant_p, heap, invariants);
3a0ecac2 1574}
1575
c2aa3ceb 1576/* Move the invariants out of the LOOP. */
3a0ecac2 1577
1578static void
c2aa3ceb 1579move_single_loop_invariants (struct loop *loop)
3a0ecac2 1580{
1581 init_inv_motion_data ();
1582
c2aa3ceb 1583 find_invariants (loop);
a6b74a67 1584 find_invariants_to_move (optimize_loop_for_speed_p (loop),
1585 LOOP_DATA (loop)->has_call);
c2aa3ceb 1586 move_invariants (loop);
3a0ecac2 1587
c2aa3ceb 1588 free_inv_motion_data ();
3a0ecac2 1589}
1590
1591/* Releases the auxiliary data for LOOP. */
1592
1593static void
1594free_loop_data (struct loop *loop)
1595{
1596 struct loop_data *data = LOOP_DATA (loop);
8311e9d2 1597 if (!data)
1598 return;
3a0ecac2 1599
e8eed2f8 1600 bitmap_clear (&LOOP_DATA (loop)->regs_ref);
1601 bitmap_clear (&LOOP_DATA (loop)->regs_live);
3a0ecac2 1602 free (data);
1603 loop->aux = NULL;
1604}
1605
e8eed2f8 1606\f
1607
1608/* Registers currently living. */
1609static bitmap_head curr_regs_live;
1610
66d9a7b9 1611/* Current reg pressure for each pressure class. */
e8eed2f8 1612static int curr_reg_pressure[N_REG_CLASSES];
1613
1614/* Record all regs that are set in any one insn. Communication from
1615 mark_reg_{store,clobber} and global_conflicts. Asm can refer to
1616 all hard-registers. */
1617static rtx regs_set[(FIRST_PSEUDO_REGISTER > MAX_RECOG_OPERANDS
1618 ? FIRST_PSEUDO_REGISTER : MAX_RECOG_OPERANDS) * 2];
1619/* Number of regs stored in the previous array. */
1620static int n_regs_set;
1621
66d9a7b9 1622/* Return pressure class and number of needed hard registers (through
48e1416a 1623 *NREGS) of register REGNO. */
e8eed2f8 1624static enum reg_class
66d9a7b9 1625get_regno_pressure_class (int regno, int *nregs)
e8eed2f8 1626{
1627 if (regno >= FIRST_PSEUDO_REGISTER)
1628 {
66d9a7b9 1629 enum reg_class pressure_class;
e8eed2f8 1630
66d9a7b9 1631 pressure_class = reg_allocno_class (regno);
1632 pressure_class = ira_pressure_class_translate[pressure_class];
1633 *nregs
1634 = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
1635 return pressure_class;
e8eed2f8 1636 }
1637 else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
1638 && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
1639 {
1640 *nregs = 1;
66d9a7b9 1641 return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
e8eed2f8 1642 }
1643 else
1644 {
1645 *nregs = 0;
1646 return NO_REGS;
1647 }
1648}
1649
1650/* Increase (if INCR_P) or decrease current register pressure for
1651 register REGNO. */
1652static void
1653change_pressure (int regno, bool incr_p)
1654{
1655 int nregs;
66d9a7b9 1656 enum reg_class pressure_class;
e8eed2f8 1657
66d9a7b9 1658 pressure_class = get_regno_pressure_class (regno, &nregs);
e8eed2f8 1659 if (! incr_p)
66d9a7b9 1660 curr_reg_pressure[pressure_class] -= nregs;
e8eed2f8 1661 else
1662 {
66d9a7b9 1663 curr_reg_pressure[pressure_class] += nregs;
1664 if (LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1665 < curr_reg_pressure[pressure_class])
1666 LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1667 = curr_reg_pressure[pressure_class];
e8eed2f8 1668 }
1669}
1670
1671/* Mark REGNO birth. */
1672static void
1673mark_regno_live (int regno)
1674{
1675 struct loop *loop;
1676
1677 for (loop = curr_loop;
1678 loop != current_loops->tree_root;
1679 loop = loop_outer (loop))
1680 bitmap_set_bit (&LOOP_DATA (loop)->regs_live, regno);
6ef9bbe0 1681 if (!bitmap_set_bit (&curr_regs_live, regno))
e8eed2f8 1682 return;
e8eed2f8 1683 change_pressure (regno, true);
1684}
1685
1686/* Mark REGNO death. */
1687static void
1688mark_regno_death (int regno)
1689{
6ef9bbe0 1690 if (! bitmap_clear_bit (&curr_regs_live, regno))
e8eed2f8 1691 return;
e8eed2f8 1692 change_pressure (regno, false);
1693}
1694
1695/* Mark setting register REG. */
1696static void
1697mark_reg_store (rtx reg, const_rtx setter ATTRIBUTE_UNUSED,
1698 void *data ATTRIBUTE_UNUSED)
1699{
1700 int regno;
1701
1702 if (GET_CODE (reg) == SUBREG)
1703 reg = SUBREG_REG (reg);
1704
1705 if (! REG_P (reg))
1706 return;
1707
1708 regs_set[n_regs_set++] = reg;
1709
1710 regno = REGNO (reg);
1711
1712 if (regno >= FIRST_PSEUDO_REGISTER)
1713 mark_regno_live (regno);
1714 else
1715 {
1716 int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1717
1718 while (regno < last)
1719 {
1720 mark_regno_live (regno);
1721 regno++;
1722 }
1723 }
1724}
1725
1726/* Mark clobbering register REG. */
1727static void
1728mark_reg_clobber (rtx reg, const_rtx setter, void *data)
1729{
1730 if (GET_CODE (setter) == CLOBBER)
1731 mark_reg_store (reg, setter, data);
1732}
1733
1734/* Mark register REG death. */
1735static void
1736mark_reg_death (rtx reg)
1737{
1738 int regno = REGNO (reg);
1739
1740 if (regno >= FIRST_PSEUDO_REGISTER)
1741 mark_regno_death (regno);
1742 else
1743 {
1744 int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1745
1746 while (regno < last)
1747 {
1748 mark_regno_death (regno);
1749 regno++;
1750 }
1751 }
1752}
1753
1754/* Mark occurrence of registers in X for the current loop. */
1755static void
1756mark_ref_regs (rtx x)
1757{
1758 RTX_CODE code;
1759 int i;
1760 const char *fmt;
1761
1762 if (!x)
1763 return;
1764
1765 code = GET_CODE (x);
1766 if (code == REG)
1767 {
1768 struct loop *loop;
48e1416a 1769
e8eed2f8 1770 for (loop = curr_loop;
1771 loop != current_loops->tree_root;
1772 loop = loop_outer (loop))
1773 bitmap_set_bit (&LOOP_DATA (loop)->regs_ref, REGNO (x));
1774 return;
1775 }
1776
1777 fmt = GET_RTX_FORMAT (code);
1778 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1779 if (fmt[i] == 'e')
1780 mark_ref_regs (XEXP (x, i));
1781 else if (fmt[i] == 'E')
1782 {
1783 int j;
48e1416a 1784
e8eed2f8 1785 for (j = 0; j < XVECLEN (x, i); j++)
1786 mark_ref_regs (XVECEXP (x, i, j));
1787 }
1788}
1789
1790/* Calculate register pressure in the loops. */
1791static void
1792calculate_loop_reg_pressure (void)
1793{
1794 int i;
1795 unsigned int j;
1796 bitmap_iterator bi;
1797 basic_block bb;
1798 rtx insn, link;
1799 struct loop *loop, *parent;
1800 loop_iterator li;
1801
1802 FOR_EACH_LOOP (li, loop, 0)
1803 if (loop->aux == NULL)
1804 {
1805 loop->aux = xcalloc (1, sizeof (struct loop_data));
1806 bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
1807 bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
1808 }
1809 ira_setup_eliminable_regset ();
1810 bitmap_initialize (&curr_regs_live, &reg_obstack);
1811 FOR_EACH_BB (bb)
1812 {
1813 curr_loop = bb->loop_father;
1814 if (curr_loop == current_loops->tree_root)
1815 continue;
1816
1817 for (loop = curr_loop;
1818 loop != current_loops->tree_root;
1819 loop = loop_outer (loop))
1820 bitmap_ior_into (&LOOP_DATA (loop)->regs_live, DF_LR_IN (bb));
1821
1822 bitmap_copy (&curr_regs_live, DF_LR_IN (bb));
66d9a7b9 1823 for (i = 0; i < ira_pressure_classes_num; i++)
1824 curr_reg_pressure[ira_pressure_classes[i]] = 0;
e8eed2f8 1825 EXECUTE_IF_SET_IN_BITMAP (&curr_regs_live, 0, j, bi)
1826 change_pressure (j, true);
1827
1828 FOR_BB_INSNS (bb, insn)
1829 {
c6a55b97 1830 if (! NONDEBUG_INSN_P (insn))
e8eed2f8 1831 continue;
1832
1833 mark_ref_regs (PATTERN (insn));
1834 n_regs_set = 0;
1835 note_stores (PATTERN (insn), mark_reg_clobber, NULL);
48e1416a 1836
e8eed2f8 1837 /* Mark any registers dead after INSN as dead now. */
48e1416a 1838
e8eed2f8 1839 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1840 if (REG_NOTE_KIND (link) == REG_DEAD)
1841 mark_reg_death (XEXP (link, 0));
48e1416a 1842
e8eed2f8 1843 /* Mark any registers set in INSN as live,
1844 and mark them as conflicting with all other live regs.
1845 Clobbers are processed again, so they conflict with
1846 the registers that are set. */
48e1416a 1847
e8eed2f8 1848 note_stores (PATTERN (insn), mark_reg_store, NULL);
48e1416a 1849
e8eed2f8 1850#ifdef AUTO_INC_DEC
1851 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1852 if (REG_NOTE_KIND (link) == REG_INC)
1853 mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
1854#endif
1855 while (n_regs_set-- > 0)
1856 {
1857 rtx note = find_regno_note (insn, REG_UNUSED,
1858 REGNO (regs_set[n_regs_set]));
1859 if (! note)
1860 continue;
48e1416a 1861
e8eed2f8 1862 mark_reg_death (XEXP (note, 0));
1863 }
1864 }
1865 }
1866 bitmap_clear (&curr_regs_live);
1867 if (flag_ira_region == IRA_REGION_MIXED
1868 || flag_ira_region == IRA_REGION_ALL)
1869 FOR_EACH_LOOP (li, loop, 0)
1870 {
1871 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1872 if (! bitmap_bit_p (&LOOP_DATA (loop)->regs_ref, j))
1873 {
66d9a7b9 1874 enum reg_class pressure_class;
e8eed2f8 1875 int nregs;
1876
66d9a7b9 1877 pressure_class = get_regno_pressure_class (j, &nregs);
1878 LOOP_DATA (loop)->max_reg_pressure[pressure_class] -= nregs;
e8eed2f8 1879 }
1880 }
1881 if (dump_file == NULL)
1882 return;
1883 FOR_EACH_LOOP (li, loop, 0)
1884 {
1885 parent = loop_outer (loop);
1886 fprintf (dump_file, "\n Loop %d (parent %d, header bb%d, depth %d)\n",
1887 loop->num, (parent == NULL ? -1 : parent->num),
1888 loop->header->index, loop_depth (loop));
1889 fprintf (dump_file, "\n ref. regnos:");
1890 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_ref, 0, j, bi)
1891 fprintf (dump_file, " %d", j);
1892 fprintf (dump_file, "\n live regnos:");
1893 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1894 fprintf (dump_file, " %d", j);
1895 fprintf (dump_file, "\n Pressure:");
66d9a7b9 1896 for (i = 0; (int) i < ira_pressure_classes_num; i++)
e8eed2f8 1897 {
66d9a7b9 1898 enum reg_class pressure_class;
48e1416a 1899
66d9a7b9 1900 pressure_class = ira_pressure_classes[i];
1901 if (LOOP_DATA (loop)->max_reg_pressure[pressure_class] == 0)
e8eed2f8 1902 continue;
66d9a7b9 1903 fprintf (dump_file, " %s=%d", reg_class_names[pressure_class],
1904 LOOP_DATA (loop)->max_reg_pressure[pressure_class]);
e8eed2f8 1905 }
1906 fprintf (dump_file, "\n");
1907 }
1908}
1909
1910\f
1911
7194de72 1912/* Move the invariants out of the loops. */
3a0ecac2 1913
1914void
7194de72 1915move_loop_invariants (void)
3a0ecac2 1916{
1917 struct loop *loop;
17519ba0 1918 loop_iterator li;
c2aa3ceb 1919
e8eed2f8 1920 if (flag_ira_loop_pressure)
1921 {
1922 df_analyze ();
66d9a7b9 1923 regstat_init_n_sets_and_refs ();
e8eed2f8 1924 ira_set_pseudo_classes (dump_file);
1925 calculate_loop_reg_pressure ();
66d9a7b9 1926 regstat_free_n_sets_and_refs ();
e8eed2f8 1927 }
3072d30e 1928 df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
3a0ecac2 1929 /* Process the loops, innermost first. */
17519ba0 1930 FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
3a0ecac2 1931 {
e8eed2f8 1932 curr_loop = loop;
86482d6b 1933 /* move_single_loop_invariants for very large loops
1934 is time consuming and might need a lot of memory. */
1935 if (loop->num_nodes <= (unsigned) LOOP_INVARIANT_MAX_BBS_IN_LOOP)
1936 move_single_loop_invariants (loop);
3a0ecac2 1937 }
1938
17519ba0 1939 FOR_EACH_LOOP (li, loop, 0)
1940 {
1941 free_loop_data (loop);
1942 }
3a0ecac2 1943
e8eed2f8 1944 if (flag_ira_loop_pressure)
1945 /* There is no sense to keep this info because it was most
1946 probably outdated by subsequent passes. */
1947 free_reg_info ();
3072d30e 1948 free (invariant_table);
1949 invariant_table = NULL;
1950 invariant_table_size = 0;
2c5cdc40 1951
1952#ifdef ENABLE_CHECKING
1953 verify_flow_info ();
1954#endif
3a0ecac2 1955}