* xcoffout.c (xcoff_tls_data_section_name): Define.
[official-gcc.git] / gcc / loop-invariant.c
blob25d69f18ee834e42e8228d13d724b99d2ad0e017
1 /* RTL-level loop invariant motion.
2 Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by the
9 Free Software Foundation; either version 3, or (at your option) any
10 later version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This implements the loop invariant motion pass. It is very simple
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.
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").
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.
35 Then we move the selected invariants out of the loop, creating a new
36 temporaries for them if necessary. */
38 #include "config.h"
39 #include "system.h"
40 #include "coretypes.h"
41 #include "tm.h"
42 #include "hard-reg-set.h"
43 #include "rtl.h"
44 #include "tm_p.h"
45 #include "obstack.h"
46 #include "basic-block.h"
47 #include "cfgloop.h"
48 #include "expr.h"
49 #include "recog.h"
50 #include "target.h"
51 #include "function.h"
52 #include "flags.h"
53 #include "df.h"
54 #include "hashtab.h"
55 #include "except.h"
56 #include "params.h"
57 #include "regs.h"
58 #include "ira.h"
59 #include "dumpfile.h"
61 /* The data stored for the loop. */
63 struct loop_data
65 struct loop *outermost_exit; /* The outermost exit of the loop. */
66 bool has_call; /* True if the loop contains a call. */
67 /* Maximal register pressure inside loop for given register class
68 (defined only for the pressure classes). */
69 int max_reg_pressure[N_REG_CLASSES];
70 /* Loop regs referenced and live pseudo-registers. */
71 bitmap_head regs_ref;
72 bitmap_head regs_live;
75 #define LOOP_DATA(LOOP) ((struct loop_data *) (LOOP)->aux)
77 /* The description of an use. */
79 struct use
81 rtx *pos; /* Position of the use. */
82 rtx insn; /* The insn in that the use occurs. */
83 unsigned addr_use_p; /* Whether the use occurs in an address. */
84 struct use *next; /* Next use in the list. */
87 /* The description of a def. */
89 struct def
91 struct use *uses; /* The list of uses that are uniquely reached
92 by it. */
93 unsigned n_uses; /* Number of such uses. */
94 unsigned n_addr_uses; /* Number of uses in addresses. */
95 unsigned invno; /* The corresponding invariant. */
98 /* The data stored for each invariant. */
100 struct invariant
102 /* The number of the invariant. */
103 unsigned invno;
105 /* The number of the invariant with the same value. */
106 unsigned eqto;
108 /* If we moved the invariant out of the loop, the register that contains its
109 value. */
110 rtx reg;
112 /* If we moved the invariant out of the loop, the original regno
113 that contained its value. */
114 int orig_regno;
116 /* The definition of the invariant. */
117 struct def *def;
119 /* The insn in that it is defined. */
120 rtx insn;
122 /* Whether it is always executed. */
123 bool always_executed;
125 /* Whether to move the invariant. */
126 bool move;
128 /* Whether the invariant is cheap when used as an address. */
129 bool cheap_address;
131 /* Cost of the invariant. */
132 unsigned cost;
134 /* The invariants it depends on. */
135 bitmap depends_on;
137 /* Used for detecting already visited invariants during determining
138 costs of movements. */
139 unsigned stamp;
142 /* Currently processed loop. */
143 static struct loop *curr_loop;
145 /* Table of invariants indexed by the df_ref uid field. */
147 static unsigned int invariant_table_size = 0;
148 static struct invariant ** invariant_table;
150 /* Entry for hash table of invariant expressions. */
152 struct invariant_expr_entry
154 /* The invariant. */
155 struct invariant *inv;
157 /* Its value. */
158 rtx expr;
160 /* Its mode. */
161 enum machine_mode mode;
163 /* Its hash. */
164 hashval_t hash;
167 /* The actual stamp for marking already visited invariants during determining
168 costs of movements. */
170 static unsigned actual_stamp;
172 typedef struct invariant *invariant_p;
175 /* The invariants. */
177 static vec<invariant_p> invariants;
179 /* Check the size of the invariant table and realloc if necessary. */
181 static void
182 check_invariant_table_size (void)
184 if (invariant_table_size < DF_DEFS_TABLE_SIZE())
186 unsigned int new_size = DF_DEFS_TABLE_SIZE () + (DF_DEFS_TABLE_SIZE () / 4);
187 invariant_table = XRESIZEVEC (struct invariant *, invariant_table, new_size);
188 memset (&invariant_table[invariant_table_size], 0,
189 (new_size - invariant_table_size) * sizeof (struct invariant *));
190 invariant_table_size = new_size;
194 /* Test for possibility of invariantness of X. */
196 static bool
197 check_maybe_invariant (rtx x)
199 enum rtx_code code = GET_CODE (x);
200 int i, j;
201 const char *fmt;
203 switch (code)
205 CASE_CONST_ANY:
206 case SYMBOL_REF:
207 case CONST:
208 case LABEL_REF:
209 return true;
211 case PC:
212 case CC0:
213 case UNSPEC_VOLATILE:
214 case CALL:
215 return false;
217 case REG:
218 return true;
220 case MEM:
221 /* Load/store motion is done elsewhere. ??? Perhaps also add it here?
222 It should not be hard, and might be faster than "elsewhere". */
224 /* Just handle the most trivial case where we load from an unchanging
225 location (most importantly, pic tables). */
226 if (MEM_READONLY_P (x) && !MEM_VOLATILE_P (x))
227 break;
229 return false;
231 case ASM_OPERANDS:
232 /* Don't mess with insns declared volatile. */
233 if (MEM_VOLATILE_P (x))
234 return false;
235 break;
237 default:
238 break;
241 fmt = GET_RTX_FORMAT (code);
242 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
244 if (fmt[i] == 'e')
246 if (!check_maybe_invariant (XEXP (x, i)))
247 return false;
249 else if (fmt[i] == 'E')
251 for (j = 0; j < XVECLEN (x, i); j++)
252 if (!check_maybe_invariant (XVECEXP (x, i, j)))
253 return false;
257 return true;
260 /* Returns the invariant definition for USE, or NULL if USE is not
261 invariant. */
263 static struct invariant *
264 invariant_for_use (df_ref use)
266 struct df_link *defs;
267 df_ref def;
268 basic_block bb = DF_REF_BB (use), def_bb;
270 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
271 return NULL;
273 defs = DF_REF_CHAIN (use);
274 if (!defs || defs->next)
275 return NULL;
276 def = defs->ref;
277 check_invariant_table_size ();
278 if (!invariant_table[DF_REF_ID(def)])
279 return NULL;
281 def_bb = DF_REF_BB (def);
282 if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
283 return NULL;
284 return invariant_table[DF_REF_ID(def)];
287 /* Computes hash value for invariant expression X in INSN. */
289 static hashval_t
290 hash_invariant_expr_1 (rtx insn, rtx x)
292 enum rtx_code code = GET_CODE (x);
293 int i, j;
294 const char *fmt;
295 hashval_t val = code;
296 int do_not_record_p;
297 df_ref use;
298 struct invariant *inv;
300 switch (code)
302 CASE_CONST_ANY:
303 case SYMBOL_REF:
304 case CONST:
305 case LABEL_REF:
306 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
308 case REG:
309 use = df_find_use (insn, x);
310 if (!use)
311 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
312 inv = invariant_for_use (use);
313 if (!inv)
314 return hash_rtx (x, GET_MODE (x), &do_not_record_p, NULL, false);
316 gcc_assert (inv->eqto != ~0u);
317 return inv->eqto;
319 default:
320 break;
323 fmt = GET_RTX_FORMAT (code);
324 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
326 if (fmt[i] == 'e')
327 val ^= hash_invariant_expr_1 (insn, XEXP (x, i));
328 else if (fmt[i] == 'E')
330 for (j = 0; j < XVECLEN (x, i); j++)
331 val ^= hash_invariant_expr_1 (insn, XVECEXP (x, i, j));
333 else if (fmt[i] == 'i' || fmt[i] == 'n')
334 val ^= XINT (x, i);
337 return val;
340 /* Returns true if the invariant expressions E1 and E2 used in insns INSN1
341 and INSN2 have always the same value. */
343 static bool
344 invariant_expr_equal_p (rtx insn1, rtx e1, rtx insn2, rtx e2)
346 enum rtx_code code = GET_CODE (e1);
347 int i, j;
348 const char *fmt;
349 df_ref use1, use2;
350 struct invariant *inv1 = NULL, *inv2 = NULL;
351 rtx sub1, sub2;
353 /* If mode of only one of the operands is VOIDmode, it is not equivalent to
354 the other one. If both are VOIDmode, we rely on the caller of this
355 function to verify that their modes are the same. */
356 if (code != GET_CODE (e2) || GET_MODE (e1) != GET_MODE (e2))
357 return false;
359 switch (code)
361 CASE_CONST_ANY:
362 case SYMBOL_REF:
363 case CONST:
364 case LABEL_REF:
365 return rtx_equal_p (e1, e2);
367 case REG:
368 use1 = df_find_use (insn1, e1);
369 use2 = df_find_use (insn2, e2);
370 if (use1)
371 inv1 = invariant_for_use (use1);
372 if (use2)
373 inv2 = invariant_for_use (use2);
375 if (!inv1 && !inv2)
376 return rtx_equal_p (e1, e2);
378 if (!inv1 || !inv2)
379 return false;
381 gcc_assert (inv1->eqto != ~0u);
382 gcc_assert (inv2->eqto != ~0u);
383 return inv1->eqto == inv2->eqto;
385 default:
386 break;
389 fmt = GET_RTX_FORMAT (code);
390 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
392 if (fmt[i] == 'e')
394 sub1 = XEXP (e1, i);
395 sub2 = XEXP (e2, i);
397 if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
398 return false;
401 else if (fmt[i] == 'E')
403 if (XVECLEN (e1, i) != XVECLEN (e2, i))
404 return false;
406 for (j = 0; j < XVECLEN (e1, i); j++)
408 sub1 = XVECEXP (e1, i, j);
409 sub2 = XVECEXP (e2, i, j);
411 if (!invariant_expr_equal_p (insn1, sub1, insn2, sub2))
412 return false;
415 else if (fmt[i] == 'i' || fmt[i] == 'n')
417 if (XINT (e1, i) != XINT (e2, i))
418 return false;
420 /* Unhandled type of subexpression, we fail conservatively. */
421 else
422 return false;
425 return true;
428 /* Returns hash value for invariant expression entry E. */
430 static hashval_t
431 hash_invariant_expr (const void *e)
433 const struct invariant_expr_entry *const entry =
434 (const struct invariant_expr_entry *) e;
436 return entry->hash;
439 /* Compares invariant expression entries E1 and E2. */
441 static int
442 eq_invariant_expr (const void *e1, const void *e2)
444 const struct invariant_expr_entry *const entry1 =
445 (const struct invariant_expr_entry *) e1;
446 const struct invariant_expr_entry *const entry2 =
447 (const struct invariant_expr_entry *) e2;
449 if (entry1->mode != entry2->mode)
450 return 0;
452 return invariant_expr_equal_p (entry1->inv->insn, entry1->expr,
453 entry2->inv->insn, entry2->expr);
456 /* Checks whether invariant with value EXPR in machine mode MODE is
457 recorded in EQ. If this is the case, return the invariant. Otherwise
458 insert INV to the table for this expression and return INV. */
460 static struct invariant *
461 find_or_insert_inv (htab_t eq, rtx expr, enum machine_mode mode,
462 struct invariant *inv)
464 hashval_t hash = hash_invariant_expr_1 (inv->insn, expr);
465 struct invariant_expr_entry *entry;
466 struct invariant_expr_entry pentry;
467 PTR *slot;
469 pentry.expr = expr;
470 pentry.inv = inv;
471 pentry.mode = mode;
472 slot = htab_find_slot_with_hash (eq, &pentry, hash, INSERT);
473 entry = (struct invariant_expr_entry *) *slot;
475 if (entry)
476 return entry->inv;
478 entry = XNEW (struct invariant_expr_entry);
479 entry->inv = inv;
480 entry->expr = expr;
481 entry->mode = mode;
482 entry->hash = hash;
483 *slot = entry;
485 return inv;
488 /* Finds invariants identical to INV and records the equivalence. EQ is the
489 hash table of the invariants. */
491 static void
492 find_identical_invariants (htab_t eq, struct invariant *inv)
494 unsigned depno;
495 bitmap_iterator bi;
496 struct invariant *dep;
497 rtx expr, set;
498 enum machine_mode mode;
500 if (inv->eqto != ~0u)
501 return;
503 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
505 dep = invariants[depno];
506 find_identical_invariants (eq, dep);
509 set = single_set (inv->insn);
510 expr = SET_SRC (set);
511 mode = GET_MODE (expr);
512 if (mode == VOIDmode)
513 mode = GET_MODE (SET_DEST (set));
514 inv->eqto = find_or_insert_inv (eq, expr, mode, inv)->invno;
516 if (dump_file && inv->eqto != inv->invno)
517 fprintf (dump_file,
518 "Invariant %d is equivalent to invariant %d.\n",
519 inv->invno, inv->eqto);
522 /* Find invariants with the same value and record the equivalences. */
524 static void
525 merge_identical_invariants (void)
527 unsigned i;
528 struct invariant *inv;
529 htab_t eq = htab_create (invariants.length (),
530 hash_invariant_expr, eq_invariant_expr, free);
532 FOR_EACH_VEC_ELT (invariants, i, inv)
533 find_identical_invariants (eq, inv);
535 htab_delete (eq);
538 /* Determines the basic blocks inside LOOP that are always executed and
539 stores their bitmap to ALWAYS_REACHED. MAY_EXIT is a bitmap of
540 basic blocks that may either exit the loop, or contain the call that
541 does not have to return. BODY is body of the loop obtained by
542 get_loop_body_in_dom_order. */
544 static void
545 compute_always_reached (struct loop *loop, basic_block *body,
546 bitmap may_exit, bitmap always_reached)
548 unsigned i;
550 for (i = 0; i < loop->num_nodes; i++)
552 if (dominated_by_p (CDI_DOMINATORS, loop->latch, body[i]))
553 bitmap_set_bit (always_reached, i);
555 if (bitmap_bit_p (may_exit, i))
556 return;
560 /* Finds exits out of the LOOP with body BODY. Marks blocks in that we may
561 exit the loop by cfg edge to HAS_EXIT and MAY_EXIT. In MAY_EXIT
562 additionally mark blocks that may exit due to a call. */
564 static void
565 find_exits (struct loop *loop, basic_block *body,
566 bitmap may_exit, bitmap has_exit)
568 unsigned i;
569 edge_iterator ei;
570 edge e;
571 struct loop *outermost_exit = loop, *aexit;
572 bool has_call = false;
573 rtx insn;
575 for (i = 0; i < loop->num_nodes; i++)
577 if (body[i]->loop_father == loop)
579 FOR_BB_INSNS (body[i], insn)
581 if (CALL_P (insn)
582 && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
583 || !RTL_CONST_OR_PURE_CALL_P (insn)))
585 has_call = true;
586 bitmap_set_bit (may_exit, i);
587 break;
591 FOR_EACH_EDGE (e, ei, body[i]->succs)
593 if (flow_bb_inside_loop_p (loop, e->dest))
594 continue;
596 bitmap_set_bit (may_exit, i);
597 bitmap_set_bit (has_exit, i);
598 outermost_exit = find_common_loop (outermost_exit,
599 e->dest->loop_father);
601 continue;
604 /* Use the data stored for the subloop to decide whether we may exit
605 through it. It is sufficient to do this for header of the loop,
606 as other basic blocks inside it must be dominated by it. */
607 if (body[i]->loop_father->header != body[i])
608 continue;
610 if (LOOP_DATA (body[i]->loop_father)->has_call)
612 has_call = true;
613 bitmap_set_bit (may_exit, i);
615 aexit = LOOP_DATA (body[i]->loop_father)->outermost_exit;
616 if (aexit != loop)
618 bitmap_set_bit (may_exit, i);
619 bitmap_set_bit (has_exit, i);
621 if (flow_loop_nested_p (aexit, outermost_exit))
622 outermost_exit = aexit;
626 if (loop->aux == NULL)
628 loop->aux = xcalloc (1, sizeof (struct loop_data));
629 bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
630 bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
632 LOOP_DATA (loop)->outermost_exit = outermost_exit;
633 LOOP_DATA (loop)->has_call = has_call;
636 /* Check whether we may assign a value to X from a register. */
638 static bool
639 may_assign_reg_p (rtx x)
641 return (GET_MODE (x) != VOIDmode
642 && GET_MODE (x) != BLKmode
643 && can_copy_p (GET_MODE (x))
644 && (!REG_P (x)
645 || !HARD_REGISTER_P (x)
646 || REGNO_REG_CLASS (REGNO (x)) != NO_REGS));
649 /* Finds definitions that may correspond to invariants in LOOP with body
650 BODY. */
652 static void
653 find_defs (struct loop *loop, basic_block *body)
655 unsigned i;
656 bitmap blocks = BITMAP_ALLOC (NULL);
658 for (i = 0; i < loop->num_nodes; i++)
659 bitmap_set_bit (blocks, body[i]->index);
661 if (dump_file)
663 fprintf (dump_file,
664 "*****starting processing of loop %d ******\n",
665 loop->num);
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_set_flags (DF_RD_PRUNE_DEAD_DEFS);
673 df_analyze ();
674 check_invariant_table_size ();
676 if (dump_file)
678 df_dump_region (dump_file);
679 fprintf (dump_file,
680 "*****ending processing of loop %d ******\n",
681 loop->num);
684 BITMAP_FREE (blocks);
687 /* Creates a new invariant for definition DEF in INSN, depending on invariants
688 in DEPENDS_ON. ALWAYS_EXECUTED is true if the insn is always executed,
689 unless the program ends due to a function call. The newly created invariant
690 is returned. */
692 static struct invariant *
693 create_new_invariant (struct def *def, rtx insn, bitmap depends_on,
694 bool always_executed)
696 struct invariant *inv = XNEW (struct invariant);
697 rtx set = single_set (insn);
698 bool speed = optimize_bb_for_speed_p (BLOCK_FOR_INSN (insn));
700 inv->def = def;
701 inv->always_executed = always_executed;
702 inv->depends_on = depends_on;
704 /* If the set is simple, usually by moving it we move the whole store out of
705 the loop. Otherwise we save only cost of the computation. */
706 if (def)
708 inv->cost = set_rtx_cost (set, speed);
709 /* ??? Try to determine cheapness of address computation. Unfortunately
710 the address cost is only a relative measure, we can't really compare
711 it with any absolute number, but only with other address costs.
712 But here we don't have any other addresses, so compare with a magic
713 number anyway. It has to be large enough to not regress PR33928
714 (by avoiding to move reg+8,reg+16,reg+24 invariants), but small
715 enough to not regress 410.bwaves either (by still moving reg+reg
716 invariants).
717 See http://gcc.gnu.org/ml/gcc-patches/2009-10/msg01210.html . */
718 inv->cheap_address = address_cost (SET_SRC (set), word_mode,
719 ADDR_SPACE_GENERIC, speed) < 3;
721 else
723 inv->cost = set_src_cost (SET_SRC (set), speed);
724 inv->cheap_address = false;
727 inv->move = false;
728 inv->reg = NULL_RTX;
729 inv->orig_regno = -1;
730 inv->stamp = 0;
731 inv->insn = insn;
733 inv->invno = invariants.length ();
734 inv->eqto = ~0u;
735 if (def)
736 def->invno = inv->invno;
737 invariants.safe_push (inv);
739 if (dump_file)
741 fprintf (dump_file,
742 "Set in insn %d is invariant (%d), cost %d, depends on ",
743 INSN_UID (insn), inv->invno, inv->cost);
744 dump_bitmap (dump_file, inv->depends_on);
747 return inv;
750 /* Record USE at DEF. */
752 static void
753 record_use (struct def *def, df_ref use)
755 struct use *u = XNEW (struct use);
757 u->pos = DF_REF_REAL_LOC (use);
758 u->insn = DF_REF_INSN (use);
759 u->addr_use_p = (DF_REF_TYPE (use) == DF_REF_REG_MEM_LOAD
760 || DF_REF_TYPE (use) == DF_REF_REG_MEM_STORE);
761 u->next = def->uses;
762 def->uses = u;
763 def->n_uses++;
764 if (u->addr_use_p)
765 def->n_addr_uses++;
768 /* Finds the invariants USE depends on and store them to the DEPENDS_ON
769 bitmap. Returns true if all dependencies of USE are known to be
770 loop invariants, false otherwise. */
772 static bool
773 check_dependency (basic_block bb, df_ref use, bitmap depends_on)
775 df_ref def;
776 basic_block def_bb;
777 struct df_link *defs;
778 struct def *def_data;
779 struct invariant *inv;
781 if (DF_REF_FLAGS (use) & DF_REF_READ_WRITE)
782 return false;
784 defs = DF_REF_CHAIN (use);
785 if (!defs)
787 unsigned int regno = DF_REF_REGNO (use);
789 /* If this is the use of an uninitialized argument register that is
790 likely to be spilled, do not move it lest this might extend its
791 lifetime and cause reload to die. This can occur for a call to
792 a function taking complex number arguments and moving the insns
793 preparing the arguments without moving the call itself wouldn't
794 gain much in practice. */
795 if ((DF_REF_FLAGS (use) & DF_HARD_REG_LIVE)
796 && FUNCTION_ARG_REGNO_P (regno)
797 && targetm.class_likely_spilled_p (REGNO_REG_CLASS (regno)))
798 return false;
800 return true;
803 if (defs->next)
804 return false;
806 def = defs->ref;
807 check_invariant_table_size ();
808 inv = invariant_table[DF_REF_ID(def)];
809 if (!inv)
810 return false;
812 def_data = inv->def;
813 gcc_assert (def_data != NULL);
815 def_bb = DF_REF_BB (def);
816 /* Note that in case bb == def_bb, we know that the definition
817 dominates insn, because def has invariant_table[DF_REF_ID(def)]
818 defined and we process the insns in the basic block bb
819 sequentially. */
820 if (!dominated_by_p (CDI_DOMINATORS, bb, def_bb))
821 return false;
823 bitmap_set_bit (depends_on, def_data->invno);
824 return true;
828 /* Finds the invariants INSN depends on and store them to the DEPENDS_ON
829 bitmap. Returns true if all dependencies of INSN are known to be
830 loop invariants, false otherwise. */
832 static bool
833 check_dependencies (rtx insn, bitmap depends_on)
835 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
836 df_ref *use_rec;
837 basic_block bb = BLOCK_FOR_INSN (insn);
839 for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
840 if (!check_dependency (bb, *use_rec, depends_on))
841 return false;
842 for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
843 if (!check_dependency (bb, *use_rec, depends_on))
844 return false;
846 return true;
849 /* Finds invariant in INSN. ALWAYS_REACHED is true if the insn is always
850 executed. ALWAYS_EXECUTED is true if the insn is always executed,
851 unless the program ends due to a function call. */
853 static void
854 find_invariant_insn (rtx insn, bool always_reached, bool always_executed)
856 df_ref ref;
857 struct def *def;
858 bitmap depends_on;
859 rtx set, dest;
860 bool simple = true;
861 struct invariant *inv;
863 #ifdef HAVE_cc0
864 /* We can't move a CC0 setter without the user. */
865 if (sets_cc0_p (insn))
866 return;
867 #endif
869 set = single_set (insn);
870 if (!set)
871 return;
872 dest = SET_DEST (set);
874 if (!REG_P (dest)
875 || HARD_REGISTER_P (dest))
876 simple = false;
878 if (!may_assign_reg_p (SET_DEST (set))
879 || !check_maybe_invariant (SET_SRC (set)))
880 return;
882 /* If the insn can throw exception, we cannot move it at all without changing
883 cfg. */
884 if (can_throw_internal (insn))
885 return;
887 /* We cannot make trapping insn executed, unless it was executed before. */
888 if (may_trap_or_fault_p (PATTERN (insn)) && !always_reached)
889 return;
891 depends_on = BITMAP_ALLOC (NULL);
892 if (!check_dependencies (insn, depends_on))
894 BITMAP_FREE (depends_on);
895 return;
898 if (simple)
899 def = XCNEW (struct def);
900 else
901 def = NULL;
903 inv = create_new_invariant (def, insn, depends_on, always_executed);
905 if (simple)
907 ref = df_find_def (insn, dest);
908 check_invariant_table_size ();
909 invariant_table[DF_REF_ID(ref)] = inv;
913 /* Record registers used in INSN that have a unique invariant definition. */
915 static void
916 record_uses (rtx insn)
918 struct df_insn_info *insn_info = DF_INSN_INFO_GET (insn);
919 df_ref *use_rec;
920 struct invariant *inv;
922 for (use_rec = DF_INSN_INFO_USES (insn_info); *use_rec; use_rec++)
924 df_ref use = *use_rec;
925 inv = invariant_for_use (use);
926 if (inv)
927 record_use (inv->def, use);
929 for (use_rec = DF_INSN_INFO_EQ_USES (insn_info); *use_rec; use_rec++)
931 df_ref use = *use_rec;
932 inv = invariant_for_use (use);
933 if (inv)
934 record_use (inv->def, use);
938 /* Finds invariants in INSN. ALWAYS_REACHED is true if the insn is always
939 executed. ALWAYS_EXECUTED is true if the insn is always executed,
940 unless the program ends due to a function call. */
942 static void
943 find_invariants_insn (rtx insn, bool always_reached, bool always_executed)
945 find_invariant_insn (insn, always_reached, always_executed);
946 record_uses (insn);
949 /* Finds invariants in basic block BB. ALWAYS_REACHED is true if the
950 basic block is always executed. ALWAYS_EXECUTED is true if the basic
951 block is always executed, unless the program ends due to a function
952 call. */
954 static void
955 find_invariants_bb (basic_block bb, bool always_reached, bool always_executed)
957 rtx insn;
959 FOR_BB_INSNS (bb, insn)
961 if (!NONDEBUG_INSN_P (insn))
962 continue;
964 find_invariants_insn (insn, always_reached, always_executed);
966 if (always_reached
967 && CALL_P (insn)
968 && (RTL_LOOPING_CONST_OR_PURE_CALL_P (insn)
969 || ! RTL_CONST_OR_PURE_CALL_P (insn)))
970 always_reached = false;
974 /* Finds invariants in LOOP with body BODY. ALWAYS_REACHED is the bitmap of
975 basic blocks in BODY that are always executed. ALWAYS_EXECUTED is the
976 bitmap of basic blocks in BODY that are always executed unless the program
977 ends due to a function call. */
979 static void
980 find_invariants_body (struct loop *loop, basic_block *body,
981 bitmap always_reached, bitmap always_executed)
983 unsigned i;
985 for (i = 0; i < loop->num_nodes; i++)
986 find_invariants_bb (body[i],
987 bitmap_bit_p (always_reached, i),
988 bitmap_bit_p (always_executed, i));
991 /* Finds invariants in LOOP. */
993 static void
994 find_invariants (struct loop *loop)
996 bitmap may_exit = BITMAP_ALLOC (NULL);
997 bitmap always_reached = BITMAP_ALLOC (NULL);
998 bitmap has_exit = BITMAP_ALLOC (NULL);
999 bitmap always_executed = BITMAP_ALLOC (NULL);
1000 basic_block *body = get_loop_body_in_dom_order (loop);
1002 find_exits (loop, body, may_exit, has_exit);
1003 compute_always_reached (loop, body, may_exit, always_reached);
1004 compute_always_reached (loop, body, has_exit, always_executed);
1006 find_defs (loop, body);
1007 find_invariants_body (loop, body, always_reached, always_executed);
1008 merge_identical_invariants ();
1010 BITMAP_FREE (always_reached);
1011 BITMAP_FREE (always_executed);
1012 BITMAP_FREE (may_exit);
1013 BITMAP_FREE (has_exit);
1014 free (body);
1017 /* Frees a list of uses USE. */
1019 static void
1020 free_use_list (struct use *use)
1022 struct use *next;
1024 for (; use; use = next)
1026 next = use->next;
1027 free (use);
1031 /* Return pressure class and number of hard registers (through *NREGS)
1032 for destination of INSN. */
1033 static enum reg_class
1034 get_pressure_class_and_nregs (rtx insn, int *nregs)
1036 rtx reg;
1037 enum reg_class pressure_class;
1038 rtx set = single_set (insn);
1040 /* Considered invariant insns have only one set. */
1041 gcc_assert (set != NULL_RTX);
1042 reg = SET_DEST (set);
1043 if (GET_CODE (reg) == SUBREG)
1044 reg = SUBREG_REG (reg);
1045 if (MEM_P (reg))
1047 *nregs = 0;
1048 pressure_class = NO_REGS;
1050 else
1052 if (! REG_P (reg))
1053 reg = NULL_RTX;
1054 if (reg == NULL_RTX)
1055 pressure_class = GENERAL_REGS;
1056 else
1058 pressure_class = reg_allocno_class (REGNO (reg));
1059 pressure_class = ira_pressure_class_translate[pressure_class];
1061 *nregs
1062 = ira_reg_class_max_nregs[pressure_class][GET_MODE (SET_SRC (set))];
1064 return pressure_class;
1067 /* Calculates cost and number of registers needed for moving invariant INV
1068 out of the loop and stores them to *COST and *REGS_NEEDED. */
1070 static void
1071 get_inv_cost (struct invariant *inv, int *comp_cost, unsigned *regs_needed)
1073 int i, acomp_cost;
1074 unsigned aregs_needed[N_REG_CLASSES];
1075 unsigned depno;
1076 struct invariant *dep;
1077 bitmap_iterator bi;
1079 /* Find the representative of the class of the equivalent invariants. */
1080 inv = invariants[inv->eqto];
1082 *comp_cost = 0;
1083 if (! flag_ira_loop_pressure)
1084 regs_needed[0] = 0;
1085 else
1087 for (i = 0; i < ira_pressure_classes_num; i++)
1088 regs_needed[ira_pressure_classes[i]] = 0;
1091 if (inv->move
1092 || inv->stamp == actual_stamp)
1093 return;
1094 inv->stamp = actual_stamp;
1096 if (! flag_ira_loop_pressure)
1097 regs_needed[0]++;
1098 else
1100 int nregs;
1101 enum reg_class pressure_class;
1103 pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1104 regs_needed[pressure_class] += nregs;
1107 if (!inv->cheap_address
1108 || inv->def->n_addr_uses < inv->def->n_uses)
1109 (*comp_cost) += inv->cost;
1111 #ifdef STACK_REGS
1113 /* Hoisting constant pool constants into stack regs may cost more than
1114 just single register. On x87, the balance is affected both by the
1115 small number of FP registers, and by its register stack organization,
1116 that forces us to add compensation code in and around the loop to
1117 shuffle the operands to the top of stack before use, and pop them
1118 from the stack after the loop finishes.
1120 To model this effect, we increase the number of registers needed for
1121 stack registers by two: one register push, and one register pop.
1122 This usually has the effect that FP constant loads from the constant
1123 pool are not moved out of the loop.
1125 Note that this also means that dependent invariants can not be moved.
1126 However, the primary purpose of this pass is to move loop invariant
1127 address arithmetic out of loops, and address arithmetic that depends
1128 on floating point constants is unlikely to ever occur. */
1129 rtx set = single_set (inv->insn);
1130 if (set
1131 && IS_STACK_MODE (GET_MODE (SET_SRC (set)))
1132 && constant_pool_constant_p (SET_SRC (set)))
1134 if (flag_ira_loop_pressure)
1135 regs_needed[ira_stack_reg_pressure_class] += 2;
1136 else
1137 regs_needed[0] += 2;
1140 #endif
1142 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, depno, bi)
1144 bool check_p;
1146 dep = invariants[depno];
1148 get_inv_cost (dep, &acomp_cost, aregs_needed);
1150 if (! flag_ira_loop_pressure)
1151 check_p = aregs_needed[0] != 0;
1152 else
1154 for (i = 0; i < ira_pressure_classes_num; i++)
1155 if (aregs_needed[ira_pressure_classes[i]] != 0)
1156 break;
1157 check_p = i < ira_pressure_classes_num;
1159 if (check_p
1160 /* We need to check always_executed, since if the original value of
1161 the invariant may be preserved, we may need to keep it in a
1162 separate register. TODO check whether the register has an
1163 use outside of the loop. */
1164 && dep->always_executed
1165 && !dep->def->uses->next)
1167 /* If this is a single use, after moving the dependency we will not
1168 need a new register. */
1169 if (! flag_ira_loop_pressure)
1170 aregs_needed[0]--;
1171 else
1173 int nregs;
1174 enum reg_class pressure_class;
1176 pressure_class = get_pressure_class_and_nregs (inv->insn, &nregs);
1177 aregs_needed[pressure_class] -= nregs;
1181 if (! flag_ira_loop_pressure)
1182 regs_needed[0] += aregs_needed[0];
1183 else
1185 for (i = 0; i < ira_pressure_classes_num; i++)
1186 regs_needed[ira_pressure_classes[i]]
1187 += aregs_needed[ira_pressure_classes[i]];
1189 (*comp_cost) += acomp_cost;
1193 /* Calculates gain for eliminating invariant INV. REGS_USED is the number
1194 of registers used in the loop, NEW_REGS is the number of new variables
1195 already added due to the invariant motion. The number of registers needed
1196 for it is stored in *REGS_NEEDED. SPEED and CALL_P are flags passed
1197 through to estimate_reg_pressure_cost. */
1199 static int
1200 gain_for_invariant (struct invariant *inv, unsigned *regs_needed,
1201 unsigned *new_regs, unsigned regs_used,
1202 bool speed, bool call_p)
1204 int comp_cost, size_cost;
1206 actual_stamp++;
1208 get_inv_cost (inv, &comp_cost, regs_needed);
1210 if (! flag_ira_loop_pressure)
1212 size_cost = (estimate_reg_pressure_cost (new_regs[0] + regs_needed[0],
1213 regs_used, speed, call_p)
1214 - estimate_reg_pressure_cost (new_regs[0],
1215 regs_used, speed, call_p));
1217 else
1219 int i;
1220 enum reg_class pressure_class;
1222 for (i = 0; i < ira_pressure_classes_num; i++)
1224 pressure_class = ira_pressure_classes[i];
1225 if ((int) new_regs[pressure_class]
1226 + (int) regs_needed[pressure_class]
1227 + LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1228 + IRA_LOOP_RESERVED_REGS
1229 > ira_class_hard_regs_num[pressure_class])
1230 break;
1232 if (i < ira_pressure_classes_num)
1233 /* There will be register pressure excess and we want not to
1234 make this loop invariant motion. All loop invariants with
1235 non-positive gains will be rejected in function
1236 find_invariants_to_move. Therefore we return the negative
1237 number here.
1239 One could think that this rejects also expensive loop
1240 invariant motions and this will hurt code performance.
1241 However numerous experiments with different heuristics
1242 taking invariant cost into account did not confirm this
1243 assumption. There are possible explanations for this
1244 result:
1245 o probably all expensive invariants were already moved out
1246 of the loop by PRE and gimple invariant motion pass.
1247 o expensive invariant execution will be hidden by insn
1248 scheduling or OOO processor hardware because usually such
1249 invariants have a lot of freedom to be executed
1250 out-of-order.
1251 Another reason for ignoring invariant cost vs spilling cost
1252 heuristics is also in difficulties to evaluate accurately
1253 spill cost at this stage. */
1254 return -1;
1255 else
1256 size_cost = 0;
1259 return comp_cost - size_cost;
1262 /* Finds invariant with best gain for moving. Returns the gain, stores
1263 the invariant in *BEST and number of registers needed for it to
1264 *REGS_NEEDED. REGS_USED is the number of registers used in the loop.
1265 NEW_REGS is the number of new variables already added due to invariant
1266 motion. */
1268 static int
1269 best_gain_for_invariant (struct invariant **best, unsigned *regs_needed,
1270 unsigned *new_regs, unsigned regs_used,
1271 bool speed, bool call_p)
1273 struct invariant *inv;
1274 int i, gain = 0, again;
1275 unsigned aregs_needed[N_REG_CLASSES], invno;
1277 FOR_EACH_VEC_ELT (invariants, invno, inv)
1279 if (inv->move)
1280 continue;
1282 /* Only consider the "representatives" of equivalent invariants. */
1283 if (inv->eqto != inv->invno)
1284 continue;
1286 again = gain_for_invariant (inv, aregs_needed, new_regs, regs_used,
1287 speed, call_p);
1288 if (again > gain)
1290 gain = again;
1291 *best = inv;
1292 if (! flag_ira_loop_pressure)
1293 regs_needed[0] = aregs_needed[0];
1294 else
1296 for (i = 0; i < ira_pressure_classes_num; i++)
1297 regs_needed[ira_pressure_classes[i]]
1298 = aregs_needed[ira_pressure_classes[i]];
1303 return gain;
1306 /* Marks invariant INVNO and all its dependencies for moving. */
1308 static void
1309 set_move_mark (unsigned invno, int gain)
1311 struct invariant *inv = invariants[invno];
1312 bitmap_iterator bi;
1314 /* Find the representative of the class of the equivalent invariants. */
1315 inv = invariants[inv->eqto];
1317 if (inv->move)
1318 return;
1319 inv->move = true;
1321 if (dump_file)
1323 if (gain >= 0)
1324 fprintf (dump_file, "Decided to move invariant %d -- gain %d\n",
1325 invno, gain);
1326 else
1327 fprintf (dump_file, "Decided to move dependent invariant %d\n",
1328 invno);
1331 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, invno, bi)
1333 set_move_mark (invno, -1);
1337 /* Determines which invariants to move. */
1339 static void
1340 find_invariants_to_move (bool speed, bool call_p)
1342 int gain;
1343 unsigned i, regs_used, regs_needed[N_REG_CLASSES], new_regs[N_REG_CLASSES];
1344 struct invariant *inv = NULL;
1346 if (!invariants.length ())
1347 return;
1349 if (flag_ira_loop_pressure)
1350 /* REGS_USED is actually never used when the flag is on. */
1351 regs_used = 0;
1352 else
1353 /* We do not really do a good job in estimating number of
1354 registers used; we put some initial bound here to stand for
1355 induction variables etc. that we do not detect. */
1357 unsigned int n_regs = DF_REG_SIZE (df);
1359 regs_used = 2;
1361 for (i = 0; i < n_regs; i++)
1363 if (!DF_REGNO_FIRST_DEF (i) && DF_REGNO_LAST_USE (i))
1365 /* This is a value that is used but not changed inside loop. */
1366 regs_used++;
1371 if (! flag_ira_loop_pressure)
1372 new_regs[0] = regs_needed[0] = 0;
1373 else
1375 for (i = 0; (int) i < ira_pressure_classes_num; i++)
1376 new_regs[ira_pressure_classes[i]] = 0;
1378 while ((gain = best_gain_for_invariant (&inv, regs_needed,
1379 new_regs, regs_used,
1380 speed, call_p)) > 0)
1382 set_move_mark (inv->invno, gain);
1383 if (! flag_ira_loop_pressure)
1384 new_regs[0] += regs_needed[0];
1385 else
1387 for (i = 0; (int) i < ira_pressure_classes_num; i++)
1388 new_regs[ira_pressure_classes[i]]
1389 += regs_needed[ira_pressure_classes[i]];
1394 /* Replace the uses, reached by the definition of invariant INV, by REG.
1396 IN_GROUP is nonzero if this is part of a group of changes that must be
1397 performed as a group. In that case, the changes will be stored. The
1398 function `apply_change_group' will validate and apply the changes. */
1400 static int
1401 replace_uses (struct invariant *inv, rtx reg, bool in_group)
1403 /* Replace the uses we know to be dominated. It saves work for copy
1404 propagation, and also it is necessary so that dependent invariants
1405 are computed right. */
1406 if (inv->def)
1408 struct use *use;
1409 for (use = inv->def->uses; use; use = use->next)
1410 validate_change (use->insn, use->pos, reg, true);
1412 /* If we aren't part of a larger group, apply the changes now. */
1413 if (!in_group)
1414 return apply_change_group ();
1417 return 1;
1420 /* Move invariant INVNO out of the LOOP. Returns true if this succeeds, false
1421 otherwise. */
1423 static bool
1424 move_invariant_reg (struct loop *loop, unsigned invno)
1426 struct invariant *inv = invariants[invno];
1427 struct invariant *repr = invariants[inv->eqto];
1428 unsigned i;
1429 basic_block preheader = loop_preheader_edge (loop)->src;
1430 rtx reg, set, dest, note;
1431 bitmap_iterator bi;
1432 int regno = -1;
1434 if (inv->reg)
1435 return true;
1436 if (!repr->move)
1437 return false;
1439 /* If this is a representative of the class of equivalent invariants,
1440 really move the invariant. Otherwise just replace its use with
1441 the register used for the representative. */
1442 if (inv == repr)
1444 if (inv->depends_on)
1446 EXECUTE_IF_SET_IN_BITMAP (inv->depends_on, 0, i, bi)
1448 if (!move_invariant_reg (loop, i))
1449 goto fail;
1453 /* Move the set out of the loop. If the set is always executed (we could
1454 omit this condition if we know that the register is unused outside of
1455 the loop, but it does not seem worth finding out) and it has no uses
1456 that would not be dominated by it, we may just move it (TODO).
1457 Otherwise we need to create a temporary register. */
1458 set = single_set (inv->insn);
1459 reg = dest = SET_DEST (set);
1460 if (GET_CODE (reg) == SUBREG)
1461 reg = SUBREG_REG (reg);
1462 if (REG_P (reg))
1463 regno = REGNO (reg);
1465 reg = gen_reg_rtx_and_attrs (dest);
1467 /* Try replacing the destination by a new pseudoregister. */
1468 validate_change (inv->insn, &SET_DEST (set), reg, true);
1470 /* As well as all the dominated uses. */
1471 replace_uses (inv, reg, true);
1473 /* And validate all the changes. */
1474 if (!apply_change_group ())
1475 goto fail;
1477 emit_insn_after (gen_move_insn (dest, reg), inv->insn);
1478 reorder_insns (inv->insn, inv->insn, BB_END (preheader));
1480 /* If there is a REG_EQUAL note on the insn we just moved, and the
1481 insn is in a basic block that is not always executed or the note
1482 contains something for which we don't know the invariant status,
1483 the note may no longer be valid after we move the insn. Note that
1484 uses in REG_EQUAL notes are taken into account in the computation
1485 of invariants, so it is safe to retain the note even if it contains
1486 register references for which we know the invariant status. */
1487 if ((note = find_reg_note (inv->insn, REG_EQUAL, NULL_RTX))
1488 && (!inv->always_executed
1489 || !check_maybe_invariant (XEXP (note, 0))))
1490 remove_note (inv->insn, note);
1492 else
1494 if (!move_invariant_reg (loop, repr->invno))
1495 goto fail;
1496 reg = repr->reg;
1497 regno = repr->orig_regno;
1498 if (!replace_uses (inv, reg, false))
1499 goto fail;
1500 set = single_set (inv->insn);
1501 emit_insn_after (gen_move_insn (SET_DEST (set), reg), inv->insn);
1502 delete_insn (inv->insn);
1505 inv->reg = reg;
1506 inv->orig_regno = regno;
1508 return true;
1510 fail:
1511 /* If we failed, clear move flag, so that we do not try to move inv
1512 again. */
1513 if (dump_file)
1514 fprintf (dump_file, "Failed to move invariant %d\n", invno);
1515 inv->move = false;
1516 inv->reg = NULL_RTX;
1517 inv->orig_regno = -1;
1519 return false;
1522 /* Move selected invariant out of the LOOP. Newly created regs are marked
1523 in TEMPORARY_REGS. */
1525 static void
1526 move_invariants (struct loop *loop)
1528 struct invariant *inv;
1529 unsigned i;
1531 FOR_EACH_VEC_ELT (invariants, i, inv)
1532 move_invariant_reg (loop, i);
1533 if (flag_ira_loop_pressure && resize_reg_info ())
1535 FOR_EACH_VEC_ELT (invariants, i, inv)
1536 if (inv->reg != NULL_RTX)
1538 if (inv->orig_regno >= 0)
1539 setup_reg_classes (REGNO (inv->reg),
1540 reg_preferred_class (inv->orig_regno),
1541 reg_alternate_class (inv->orig_regno),
1542 reg_allocno_class (inv->orig_regno));
1543 else
1544 setup_reg_classes (REGNO (inv->reg),
1545 GENERAL_REGS, NO_REGS, GENERAL_REGS);
1550 /* Initializes invariant motion data. */
1552 static void
1553 init_inv_motion_data (void)
1555 actual_stamp = 1;
1557 invariants.create (100);
1560 /* Frees the data allocated by invariant motion. */
1562 static void
1563 free_inv_motion_data (void)
1565 unsigned i;
1566 struct def *def;
1567 struct invariant *inv;
1569 check_invariant_table_size ();
1570 for (i = 0; i < DF_DEFS_TABLE_SIZE (); i++)
1572 inv = invariant_table[i];
1573 if (inv)
1575 def = inv->def;
1576 gcc_assert (def != NULL);
1578 free_use_list (def->uses);
1579 free (def);
1580 invariant_table[i] = NULL;
1584 FOR_EACH_VEC_ELT (invariants, i, inv)
1586 BITMAP_FREE (inv->depends_on);
1587 free (inv);
1589 invariants.release ();
1592 /* Move the invariants out of the LOOP. */
1594 static void
1595 move_single_loop_invariants (struct loop *loop)
1597 init_inv_motion_data ();
1599 find_invariants (loop);
1600 find_invariants_to_move (optimize_loop_for_speed_p (loop),
1601 LOOP_DATA (loop)->has_call);
1602 move_invariants (loop);
1604 free_inv_motion_data ();
1607 /* Releases the auxiliary data for LOOP. */
1609 static void
1610 free_loop_data (struct loop *loop)
1612 struct loop_data *data = LOOP_DATA (loop);
1613 if (!data)
1614 return;
1616 bitmap_clear (&LOOP_DATA (loop)->regs_ref);
1617 bitmap_clear (&LOOP_DATA (loop)->regs_live);
1618 free (data);
1619 loop->aux = NULL;
1624 /* Registers currently living. */
1625 static bitmap_head curr_regs_live;
1627 /* Current reg pressure for each pressure class. */
1628 static int curr_reg_pressure[N_REG_CLASSES];
1630 /* Record all regs that are set in any one insn. Communication from
1631 mark_reg_{store,clobber} and global_conflicts. Asm can refer to
1632 all hard-registers. */
1633 static rtx regs_set[(FIRST_PSEUDO_REGISTER > MAX_RECOG_OPERANDS
1634 ? FIRST_PSEUDO_REGISTER : MAX_RECOG_OPERANDS) * 2];
1635 /* Number of regs stored in the previous array. */
1636 static int n_regs_set;
1638 /* Return pressure class and number of needed hard registers (through
1639 *NREGS) of register REGNO. */
1640 static enum reg_class
1641 get_regno_pressure_class (int regno, int *nregs)
1643 if (regno >= FIRST_PSEUDO_REGISTER)
1645 enum reg_class pressure_class;
1647 pressure_class = reg_allocno_class (regno);
1648 pressure_class = ira_pressure_class_translate[pressure_class];
1649 *nregs
1650 = ira_reg_class_max_nregs[pressure_class][PSEUDO_REGNO_MODE (regno)];
1651 return pressure_class;
1653 else if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno)
1654 && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
1656 *nregs = 1;
1657 return ira_pressure_class_translate[REGNO_REG_CLASS (regno)];
1659 else
1661 *nregs = 0;
1662 return NO_REGS;
1666 /* Increase (if INCR_P) or decrease current register pressure for
1667 register REGNO. */
1668 static void
1669 change_pressure (int regno, bool incr_p)
1671 int nregs;
1672 enum reg_class pressure_class;
1674 pressure_class = get_regno_pressure_class (regno, &nregs);
1675 if (! incr_p)
1676 curr_reg_pressure[pressure_class] -= nregs;
1677 else
1679 curr_reg_pressure[pressure_class] += nregs;
1680 if (LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1681 < curr_reg_pressure[pressure_class])
1682 LOOP_DATA (curr_loop)->max_reg_pressure[pressure_class]
1683 = curr_reg_pressure[pressure_class];
1687 /* Mark REGNO birth. */
1688 static void
1689 mark_regno_live (int regno)
1691 struct loop *loop;
1693 for (loop = curr_loop;
1694 loop != current_loops->tree_root;
1695 loop = loop_outer (loop))
1696 bitmap_set_bit (&LOOP_DATA (loop)->regs_live, regno);
1697 if (!bitmap_set_bit (&curr_regs_live, regno))
1698 return;
1699 change_pressure (regno, true);
1702 /* Mark REGNO death. */
1703 static void
1704 mark_regno_death (int regno)
1706 if (! bitmap_clear_bit (&curr_regs_live, regno))
1707 return;
1708 change_pressure (regno, false);
1711 /* Mark setting register REG. */
1712 static void
1713 mark_reg_store (rtx reg, const_rtx setter ATTRIBUTE_UNUSED,
1714 void *data ATTRIBUTE_UNUSED)
1716 int regno;
1718 if (GET_CODE (reg) == SUBREG)
1719 reg = SUBREG_REG (reg);
1721 if (! REG_P (reg))
1722 return;
1724 regs_set[n_regs_set++] = reg;
1726 regno = REGNO (reg);
1728 if (regno >= FIRST_PSEUDO_REGISTER)
1729 mark_regno_live (regno);
1730 else
1732 int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1734 while (regno < last)
1736 mark_regno_live (regno);
1737 regno++;
1742 /* Mark clobbering register REG. */
1743 static void
1744 mark_reg_clobber (rtx reg, const_rtx setter, void *data)
1746 if (GET_CODE (setter) == CLOBBER)
1747 mark_reg_store (reg, setter, data);
1750 /* Mark register REG death. */
1751 static void
1752 mark_reg_death (rtx reg)
1754 int regno = REGNO (reg);
1756 if (regno >= FIRST_PSEUDO_REGISTER)
1757 mark_regno_death (regno);
1758 else
1760 int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
1762 while (regno < last)
1764 mark_regno_death (regno);
1765 regno++;
1770 /* Mark occurrence of registers in X for the current loop. */
1771 static void
1772 mark_ref_regs (rtx x)
1774 RTX_CODE code;
1775 int i;
1776 const char *fmt;
1778 if (!x)
1779 return;
1781 code = GET_CODE (x);
1782 if (code == REG)
1784 struct loop *loop;
1786 for (loop = curr_loop;
1787 loop != current_loops->tree_root;
1788 loop = loop_outer (loop))
1789 bitmap_set_bit (&LOOP_DATA (loop)->regs_ref, REGNO (x));
1790 return;
1793 fmt = GET_RTX_FORMAT (code);
1794 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1795 if (fmt[i] == 'e')
1796 mark_ref_regs (XEXP (x, i));
1797 else if (fmt[i] == 'E')
1799 int j;
1801 for (j = 0; j < XVECLEN (x, i); j++)
1802 mark_ref_regs (XVECEXP (x, i, j));
1806 /* Calculate register pressure in the loops. */
1807 static void
1808 calculate_loop_reg_pressure (void)
1810 int i;
1811 unsigned int j;
1812 bitmap_iterator bi;
1813 basic_block bb;
1814 rtx insn, link;
1815 struct loop *loop, *parent;
1816 loop_iterator li;
1818 FOR_EACH_LOOP (li, loop, 0)
1819 if (loop->aux == NULL)
1821 loop->aux = xcalloc (1, sizeof (struct loop_data));
1822 bitmap_initialize (&LOOP_DATA (loop)->regs_ref, &reg_obstack);
1823 bitmap_initialize (&LOOP_DATA (loop)->regs_live, &reg_obstack);
1825 ira_setup_eliminable_regset (false);
1826 bitmap_initialize (&curr_regs_live, &reg_obstack);
1827 FOR_EACH_BB (bb)
1829 curr_loop = bb->loop_father;
1830 if (curr_loop == current_loops->tree_root)
1831 continue;
1833 for (loop = curr_loop;
1834 loop != current_loops->tree_root;
1835 loop = loop_outer (loop))
1836 bitmap_ior_into (&LOOP_DATA (loop)->regs_live, DF_LR_IN (bb));
1838 bitmap_copy (&curr_regs_live, DF_LR_IN (bb));
1839 for (i = 0; i < ira_pressure_classes_num; i++)
1840 curr_reg_pressure[ira_pressure_classes[i]] = 0;
1841 EXECUTE_IF_SET_IN_BITMAP (&curr_regs_live, 0, j, bi)
1842 change_pressure (j, true);
1844 FOR_BB_INSNS (bb, insn)
1846 if (! NONDEBUG_INSN_P (insn))
1847 continue;
1849 mark_ref_regs (PATTERN (insn));
1850 n_regs_set = 0;
1851 note_stores (PATTERN (insn), mark_reg_clobber, NULL);
1853 /* Mark any registers dead after INSN as dead now. */
1855 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1856 if (REG_NOTE_KIND (link) == REG_DEAD)
1857 mark_reg_death (XEXP (link, 0));
1859 /* Mark any registers set in INSN as live,
1860 and mark them as conflicting with all other live regs.
1861 Clobbers are processed again, so they conflict with
1862 the registers that are set. */
1864 note_stores (PATTERN (insn), mark_reg_store, NULL);
1866 #ifdef AUTO_INC_DEC
1867 for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
1868 if (REG_NOTE_KIND (link) == REG_INC)
1869 mark_reg_store (XEXP (link, 0), NULL_RTX, NULL);
1870 #endif
1871 while (n_regs_set-- > 0)
1873 rtx note = find_regno_note (insn, REG_UNUSED,
1874 REGNO (regs_set[n_regs_set]));
1875 if (! note)
1876 continue;
1878 mark_reg_death (XEXP (note, 0));
1882 bitmap_clear (&curr_regs_live);
1883 if (flag_ira_region == IRA_REGION_MIXED
1884 || flag_ira_region == IRA_REGION_ALL)
1885 FOR_EACH_LOOP (li, loop, 0)
1887 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1888 if (! bitmap_bit_p (&LOOP_DATA (loop)->regs_ref, j))
1890 enum reg_class pressure_class;
1891 int nregs;
1893 pressure_class = get_regno_pressure_class (j, &nregs);
1894 LOOP_DATA (loop)->max_reg_pressure[pressure_class] -= nregs;
1897 if (dump_file == NULL)
1898 return;
1899 FOR_EACH_LOOP (li, loop, 0)
1901 parent = loop_outer (loop);
1902 fprintf (dump_file, "\n Loop %d (parent %d, header bb%d, depth %d)\n",
1903 loop->num, (parent == NULL ? -1 : parent->num),
1904 loop->header->index, loop_depth (loop));
1905 fprintf (dump_file, "\n ref. regnos:");
1906 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_ref, 0, j, bi)
1907 fprintf (dump_file, " %d", j);
1908 fprintf (dump_file, "\n live regnos:");
1909 EXECUTE_IF_SET_IN_BITMAP (&LOOP_DATA (loop)->regs_live, 0, j, bi)
1910 fprintf (dump_file, " %d", j);
1911 fprintf (dump_file, "\n Pressure:");
1912 for (i = 0; (int) i < ira_pressure_classes_num; i++)
1914 enum reg_class pressure_class;
1916 pressure_class = ira_pressure_classes[i];
1917 if (LOOP_DATA (loop)->max_reg_pressure[pressure_class] == 0)
1918 continue;
1919 fprintf (dump_file, " %s=%d", reg_class_names[pressure_class],
1920 LOOP_DATA (loop)->max_reg_pressure[pressure_class]);
1922 fprintf (dump_file, "\n");
1928 /* Move the invariants out of the loops. */
1930 void
1931 move_loop_invariants (void)
1933 struct loop *loop;
1934 loop_iterator li;
1936 if (flag_ira_loop_pressure)
1938 df_analyze ();
1939 regstat_init_n_sets_and_refs ();
1940 ira_set_pseudo_classes (true, dump_file);
1941 calculate_loop_reg_pressure ();
1942 regstat_free_n_sets_and_refs ();
1944 df_set_flags (DF_EQ_NOTES + DF_DEFER_INSN_RESCAN);
1945 /* Process the loops, innermost first. */
1946 FOR_EACH_LOOP (li, loop, LI_FROM_INNERMOST)
1948 curr_loop = loop;
1949 /* move_single_loop_invariants for very large loops
1950 is time consuming and might need a lot of memory. */
1951 if (loop->num_nodes <= (unsigned) LOOP_INVARIANT_MAX_BBS_IN_LOOP)
1952 move_single_loop_invariants (loop);
1955 FOR_EACH_LOOP (li, loop, 0)
1957 free_loop_data (loop);
1960 if (flag_ira_loop_pressure)
1961 /* There is no sense to keep this info because it was most
1962 probably outdated by subsequent passes. */
1963 free_reg_info ();
1964 free (invariant_table);
1965 invariant_table = NULL;
1966 invariant_table_size = 0;
1968 #ifdef ENABLE_CHECKING
1969 verify_flow_info ();
1970 #endif