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