xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/lra.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
1 /* LRA (local register allocator) driver and LRA utilities.
2    Copyright (C) 2010-2015 Free Software Foundation, Inc.
3    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.	If not see
19 <http://www.gnu.org/licenses/>.	 */
20 
21 
22 /* The Local Register Allocator (LRA) is a replacement of former
23    reload pass.	 It is focused to simplify code solving the reload
24    pass tasks, to make the code maintenance easier, and to implement new
25    perspective optimizations.
26 
27    The major LRA design solutions are:
28      o division small manageable, separated sub-tasks
29      o reflection of all transformations and decisions in RTL as more
30        as possible
31      o insn constraints as a primary source of the info (minimizing
32        number of target-depended macros/hooks)
33 
34    In brief LRA works by iterative insn process with the final goal is
35    to satisfy all insn and address constraints:
36      o New reload insns (in brief reloads) and reload pseudos might be
37        generated;
38      o Some pseudos might be spilled to assign hard registers to
39        new reload pseudos;
40      o Recalculating spilled pseudo values (rematerialization);
41      o Changing spilled pseudos to stack memory or their equivalences;
42      o Allocation stack memory changes the address displacement and
43        new iteration is needed.
44 
45    Here is block diagram of LRA passes:
46 
47                                 ------------------------
48            ---------------     | Undo inheritance for   |     ---------------
49           | Memory-memory |    | spilled pseudos,       |    | New (and old) |
50           | move coalesce |<---| splits for pseudos got |<-- |   pseudos     |
51            ---------------     | the same hard regs,    |    |  assignment   |
52   Start           |            | and optional reloads   |     ---------------
53     |             |             ------------------------            ^
54     V             |              ----------------                   |
55  -----------      V             | Update virtual |                  |
56 |  Remove   |----> ------------>|    register    |                  |
57 | scratches |     ^             |  displacements |                  |
58  -----------      |              ----------------                   |
59                   |                      |                          |
60                   |                      V         New              |
61                   |                 ------------  pseudos   -------------------
62                   |                |Constraints:| or insns | Inheritance/split |
63                   |                |    RTL     |--------->|  transformations  |
64                   |                | transfor-  |          |    in EBB scope   |
65                   | substi-        |  mations   |           -------------------
66                   | tutions         ------------
67                   |                     | No change
68           ----------------              V
69          | Spilled pseudo |      -------------------
70          |    to memory   |<----| Rematerialization |
71          |  substitution  |      -------------------
72           ----------------
73                   | No susbtitions
74                   V
75       -------------------------
76      | Hard regs substitution, |
77      |  devirtalization, and   |------> Finish
78      | restoring scratches got |
79      |         memory          |
80       -------------------------
81 
82    To speed up the process:
83      o We process only insns affected by changes on previous
84        iterations;
85      o We don't use DFA-infrastructure because it results in much slower
86        compiler speed than a special IR described below does;
87      o We use a special insn representation for quick access to insn
88        info which is always *synchronized* with the current RTL;
89        o Insn IR is minimized by memory.  It is divided on three parts:
90 	 o one specific for each insn in RTL (only operand locations);
91 	 o one common for all insns in RTL with the same insn code
92 	   (different operand attributes from machine descriptions);
93 	 o one oriented for maintenance of live info (list of pseudos).
94        o Pseudo data:
95 	 o all insns where the pseudo is referenced;
96 	 o live info (conflicting hard regs, live ranges, # of
97 	   references etc);
98 	 o data used for assigning (preferred hard regs, costs etc).
99 
100    This file contains LRA driver, LRA utility functions and data, and
101    code for dealing with scratches.  */
102 
103 #include "config.h"
104 #include "system.h"
105 #include "coretypes.h"
106 #include "tm.h"
107 #include "hard-reg-set.h"
108 #include "rtl.h"
109 #include "tm_p.h"
110 #include "regs.h"
111 #include "insn-config.h"
112 #include "insn-codes.h"
113 #include "recog.h"
114 #include "output.h"
115 #include "addresses.h"
116 #include "flags.h"
117 #include "hashtab.h"
118 #include "hash-set.h"
119 #include "vec.h"
120 #include "machmode.h"
121 #include "input.h"
122 #include "function.h"
123 #include "symtab.h"
124 #include "wide-int.h"
125 #include "inchash.h"
126 #include "tree.h"
127 #include "optabs.h"
128 #include "statistics.h"
129 #include "double-int.h"
130 #include "real.h"
131 #include "fixed-value.h"
132 #include "alias.h"
133 #include "expmed.h"
134 #include "dojump.h"
135 #include "explow.h"
136 #include "calls.h"
137 #include "emit-rtl.h"
138 #include "varasm.h"
139 #include "stmt.h"
140 #include "expr.h"
141 #include "predict.h"
142 #include "dominance.h"
143 #include "cfg.h"
144 #include "cfgrtl.h"
145 #include "cfgbuild.h"
146 #include "basic-block.h"
147 #include "except.h"
148 #include "tree-pass.h"
149 #include "timevar.h"
150 #include "target.h"
151 #include "ira.h"
152 #include "lra-int.h"
153 #include "df.h"
154 
155 /* Dump bitmap SET with TITLE and BB INDEX.  */
156 void
157 lra_dump_bitmap_with_title (const char *title, bitmap set, int index)
158 {
159   unsigned int i;
160   int count;
161   bitmap_iterator bi;
162   static const int max_nums_on_line = 10;
163 
164   if (bitmap_empty_p (set))
165     return;
166   fprintf (lra_dump_file, "  %s %d:", title, index);
167   fprintf (lra_dump_file, "\n");
168   count = max_nums_on_line + 1;
169   EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
170     {
171       if (count > max_nums_on_line)
172 	{
173 	  fprintf (lra_dump_file, "\n    ");
174 	  count = 0;
175 	}
176       fprintf (lra_dump_file, " %4u", i);
177       count++;
178     }
179   fprintf (lra_dump_file, "\n");
180 }
181 
182 /* Hard registers currently not available for allocation.  It can
183    changed after some hard  registers become not eliminable.  */
184 HARD_REG_SET lra_no_alloc_regs;
185 
186 static int get_new_reg_value (void);
187 static void expand_reg_info (void);
188 static void invalidate_insn_recog_data (int);
189 static int get_insn_freq (rtx_insn *);
190 static void invalidate_insn_data_regno_info (lra_insn_recog_data_t,
191 					     rtx_insn *, int);
192 
193 /* Expand all regno related info needed for LRA.  */
194 static void
195 expand_reg_data (int old)
196 {
197   resize_reg_info ();
198   expand_reg_info ();
199   ira_expand_reg_equiv ();
200   for (int i = (int) max_reg_num () - 1; i >= old; i--)
201     lra_change_class (i, ALL_REGS, "      Set", true);
202 }
203 
204 /* Create and return a new reg of ORIGINAL mode.  If ORIGINAL is NULL
205    or of VOIDmode, use MD_MODE for the new reg.  Initialize its
206    register class to RCLASS.  Print message about assigning class
207    RCLASS containing new register name TITLE unless it is NULL.  Use
208    attributes of ORIGINAL if it is a register.  The created register
209    will have unique held value.  */
210 rtx
211 lra_create_new_reg_with_unique_value (machine_mode md_mode, rtx original,
212 				      enum reg_class rclass, const char *title)
213 {
214   machine_mode mode;
215   rtx new_reg;
216 
217   if (original == NULL_RTX || (mode = GET_MODE (original)) == VOIDmode)
218     mode = md_mode;
219   lra_assert (mode != VOIDmode);
220   new_reg = gen_reg_rtx (mode);
221   if (original == NULL_RTX || ! REG_P (original))
222     {
223       if (lra_dump_file != NULL)
224 	fprintf (lra_dump_file, "      Creating newreg=%i", REGNO (new_reg));
225     }
226   else
227     {
228       if (ORIGINAL_REGNO (original) >= FIRST_PSEUDO_REGISTER)
229 	ORIGINAL_REGNO (new_reg) = ORIGINAL_REGNO (original);
230       REG_USERVAR_P (new_reg) = REG_USERVAR_P (original);
231       REG_POINTER (new_reg) = REG_POINTER (original);
232       REG_ATTRS (new_reg) = REG_ATTRS (original);
233       if (lra_dump_file != NULL)
234 	fprintf (lra_dump_file, "      Creating newreg=%i from oldreg=%i",
235 		 REGNO (new_reg), REGNO (original));
236     }
237   if (lra_dump_file != NULL)
238     {
239       if (title != NULL)
240 	fprintf (lra_dump_file, ", assigning class %s to%s%s r%d",
241 		 reg_class_names[rclass], *title == '\0' ? "" : " ",
242 		 title, REGNO (new_reg));
243       fprintf (lra_dump_file, "\n");
244     }
245   expand_reg_data (max_reg_num ());
246   setup_reg_classes (REGNO (new_reg), rclass, NO_REGS, rclass);
247   return new_reg;
248 }
249 
250 /* Analogous to the previous function but also inherits value of
251    ORIGINAL.  */
252 rtx
253 lra_create_new_reg (machine_mode md_mode, rtx original,
254 		    enum reg_class rclass, const char *title)
255 {
256   rtx new_reg;
257 
258   new_reg
259     = lra_create_new_reg_with_unique_value (md_mode, original, rclass, title);
260   if (original != NULL_RTX && REG_P (original))
261     lra_assign_reg_val (REGNO (original), REGNO (new_reg));
262   return new_reg;
263 }
264 
265 /* Set up for REGNO unique hold value.	*/
266 void
267 lra_set_regno_unique_value (int regno)
268 {
269   lra_reg_info[regno].val = get_new_reg_value ();
270 }
271 
272 /* Invalidate INSN related info used by LRA.  The info should never be
273    used after that.  */
274 void
275 lra_invalidate_insn_data (rtx_insn *insn)
276 {
277   lra_invalidate_insn_regno_info (insn);
278   invalidate_insn_recog_data (INSN_UID (insn));
279 }
280 
281 /* Mark INSN deleted and invalidate the insn related info used by
282    LRA.	 */
283 void
284 lra_set_insn_deleted (rtx_insn *insn)
285 {
286   lra_invalidate_insn_data (insn);
287   SET_INSN_DELETED (insn);
288 }
289 
290 /* Delete an unneeded INSN and any previous insns who sole purpose is
291    loading data that is dead in INSN.  */
292 void
293 lra_delete_dead_insn (rtx_insn *insn)
294 {
295   rtx_insn *prev = prev_real_insn (insn);
296   rtx prev_dest;
297 
298   /* If the previous insn sets a register that dies in our insn,
299      delete it too.  */
300   if (prev && GET_CODE (PATTERN (prev)) == SET
301       && (prev_dest = SET_DEST (PATTERN (prev)), REG_P (prev_dest))
302       && reg_mentioned_p (prev_dest, PATTERN (insn))
303       && find_regno_note (insn, REG_DEAD, REGNO (prev_dest))
304       && ! side_effects_p (SET_SRC (PATTERN (prev))))
305     lra_delete_dead_insn (prev);
306 
307   lra_set_insn_deleted (insn);
308 }
309 
310 /* Emit insn x = y + z.  Return NULL if we failed to do it.
311    Otherwise, return the insn.  We don't use gen_add3_insn as it might
312    clobber CC.  */
313 static rtx
314 emit_add3_insn (rtx x, rtx y, rtx z)
315 {
316   rtx_insn *last;
317 
318   last = get_last_insn ();
319 
320   if (have_addptr3_insn (x, y, z))
321     {
322       rtx insn = gen_addptr3_insn (x, y, z);
323 
324       /* If the target provides an "addptr" pattern it hopefully does
325 	 for a reason.  So falling back to the normal add would be
326 	 a bug.  */
327       lra_assert (insn != NULL_RTX);
328       emit_insn (insn);
329       return insn;
330     }
331 
332   rtx_insn *insn = emit_insn (gen_rtx_SET (VOIDmode, x,
333 					   gen_rtx_PLUS (GET_MODE (y), y, z)));
334   if (recog_memoized (insn) < 0)
335     {
336       delete_insns_since (last);
337       insn = NULL;
338     }
339   return insn;
340 }
341 
342 /* Emit insn x = x + y.  Return the insn.  We use gen_add2_insn as the
343    last resort.  */
344 static rtx
345 emit_add2_insn (rtx x, rtx y)
346 {
347   rtx insn;
348 
349   insn = emit_add3_insn (x, x, y);
350   if (insn == NULL_RTX)
351     {
352       insn = gen_add2_insn (x, y);
353       if (insn != NULL_RTX)
354 	emit_insn (insn);
355     }
356   return insn;
357 }
358 
359 /* Target checks operands through operand predicates to recognize an
360    insn.  We should have a special precaution to generate add insns
361    which are frequent results of elimination.
362 
363    Emit insns for x = y + z.  X can be used to store intermediate
364    values and should be not in Y and Z when we use X to store an
365    intermediate value.  Y + Z should form [base] [+ index[ * scale]] [
366    + disp] where base and index are registers, disp and scale are
367    constants.  Y should contain base if it is present, Z should
368    contain disp if any.  index[*scale] can be part of Y or Z.  */
369 void
370 lra_emit_add (rtx x, rtx y, rtx z)
371 {
372   int old;
373   rtx_insn *last;
374   rtx a1, a2, base, index, disp, scale, index_scale;
375   bool ok_p;
376 
377   rtx add3_insn = emit_add3_insn (x, y, z);
378   old = max_reg_num ();
379   if (add3_insn != NULL)
380     ;
381   else
382     {
383       disp = a2 = NULL_RTX;
384       if (GET_CODE (y) == PLUS)
385 	{
386 	  a1 = XEXP (y, 0);
387 	  a2 = XEXP (y, 1);
388 	  disp = z;
389 	}
390       else
391 	{
392 	  a1 = y;
393 	  if (CONSTANT_P (z))
394 	    disp = z;
395 	  else
396 	    a2 = z;
397 	}
398       index_scale = scale = NULL_RTX;
399       if (GET_CODE (a1) == MULT)
400 	{
401 	  index_scale = a1;
402 	  index = XEXP (a1, 0);
403 	  scale = XEXP (a1, 1);
404 	  base = a2;
405 	}
406       else if (a2 != NULL_RTX && GET_CODE (a2) == MULT)
407 	{
408 	  index_scale = a2;
409 	  index = XEXP (a2, 0);
410 	  scale = XEXP (a2, 1);
411 	  base = a1;
412 	}
413       else
414 	{
415 	  base = a1;
416 	  index = a2;
417 	}
418       if (! (REG_P (base) || GET_CODE (base) == SUBREG)
419 	  || (index != NULL_RTX
420 	      && ! (REG_P (index) || GET_CODE (index) == SUBREG))
421 	  || (disp != NULL_RTX && ! CONSTANT_P (disp))
422 	  || (scale != NULL_RTX && ! CONSTANT_P (scale)))
423 	{
424 	  /* Probably we have no 3 op add.  Last chance is to use 2-op
425 	     add insn.  To succeed, don't move Z to X as an address
426 	     segment always comes in Y.  Otherwise, we might fail when
427 	     adding the address segment to register.  */
428 	  lra_assert (x != y && x != z);
429 	  emit_move_insn (x, y);
430 	  rtx insn = emit_add2_insn (x, z);
431 	  lra_assert (insn != NULL_RTX);
432 	}
433       else
434 	{
435 	  if (index_scale == NULL_RTX)
436 	    index_scale = index;
437 	  if (disp == NULL_RTX)
438 	    {
439 	      /* Generate x = index_scale; x = x + base.  */
440 	      lra_assert (index_scale != NULL_RTX && base != NULL_RTX);
441 	      emit_move_insn (x, index_scale);
442 	      rtx insn = emit_add2_insn (x, base);
443 	      lra_assert (insn != NULL_RTX);
444 	    }
445 	  else if (scale == NULL_RTX)
446 	    {
447 	      /* Try x = base + disp.  */
448 	      lra_assert (base != NULL_RTX);
449 	      last = get_last_insn ();
450 	      rtx_insn *move_insn =
451 		emit_move_insn (x, gen_rtx_PLUS (GET_MODE (base), base, disp));
452 	      if (recog_memoized (move_insn) < 0)
453 		{
454 		  delete_insns_since (last);
455 		  /* Generate x = disp; x = x + base.  */
456 		  emit_move_insn (x, disp);
457 		  rtx add2_insn = emit_add2_insn (x, base);
458 		  lra_assert (add2_insn != NULL_RTX);
459 		}
460 	      /* Generate x = x + index.  */
461 	      if (index != NULL_RTX)
462 		{
463 		  rtx insn = emit_add2_insn (x, index);
464 		  lra_assert (insn != NULL_RTX);
465 		}
466 	    }
467 	  else
468 	    {
469 	      /* Try x = index_scale; x = x + disp; x = x + base.  */
470 	      last = get_last_insn ();
471 	      rtx_insn *move_insn = emit_move_insn (x, index_scale);
472 	      ok_p = false;
473 	      if (recog_memoized (move_insn) >= 0)
474 		{
475 		  rtx insn = emit_add2_insn (x, disp);
476 		  if (insn != NULL_RTX)
477 		    {
478 		      insn = emit_add2_insn (x, base);
479 		      if (insn != NULL_RTX)
480 			ok_p = true;
481 		    }
482 		}
483 	      if (! ok_p)
484 		{
485 		  delete_insns_since (last);
486 		  /* Generate x = disp; x = x + base; x = x + index_scale.  */
487 		  emit_move_insn (x, disp);
488 		  rtx insn = emit_add2_insn (x, base);
489 		  lra_assert (insn != NULL_RTX);
490 		  insn = emit_add2_insn (x, index_scale);
491 		  lra_assert (insn != NULL_RTX);
492 		}
493 	    }
494 	}
495     }
496   /* Functions emit_... can create pseudos -- so expand the pseudo
497      data.  */
498   if (old != max_reg_num ())
499     expand_reg_data (old);
500 }
501 
502 /* The number of emitted reload insns so far.  */
503 int lra_curr_reload_num;
504 
505 /* Emit x := y, processing special case when y = u + v or y = u + v *
506    scale + w through emit_add (Y can be an address which is base +
507    index reg * scale + displacement in general case).  X may be used
508    as intermediate result therefore it should be not in Y.  */
509 void
510 lra_emit_move (rtx x, rtx y)
511 {
512   int old;
513 
514   if (GET_CODE (y) != PLUS)
515     {
516       if (rtx_equal_p (x, y))
517 	return;
518       old = max_reg_num ();
519       emit_move_insn (x, y);
520       if (REG_P (x))
521 	lra_reg_info[ORIGINAL_REGNO (x)].last_reload = ++lra_curr_reload_num;
522       /* Function emit_move can create pseudos -- so expand the pseudo
523 	 data.	*/
524       if (old != max_reg_num ())
525 	expand_reg_data (old);
526       return;
527     }
528   lra_emit_add (x, XEXP (y, 0), XEXP (y, 1));
529 }
530 
531 /* Update insn operands which are duplication of operands whose
532    numbers are in array of NOPS (with end marker -1).  The insn is
533    represented by its LRA internal representation ID.  */
534 void
535 lra_update_dups (lra_insn_recog_data_t id, signed char *nops)
536 {
537   int i, j, nop;
538   struct lra_static_insn_data *static_id = id->insn_static_data;
539 
540   for (i = 0; i < static_id->n_dups; i++)
541     for (j = 0; (nop = nops[j]) >= 0; j++)
542       if (static_id->dup_num[i] == nop)
543 	*id->dup_loc[i] = *id->operand_loc[nop];
544 }
545 
546 
547 
548 /* This page contains code dealing with info about registers in the
549    insns.  */
550 
551 /* Pools for insn reg info.  */
552 static alloc_pool insn_reg_pool;
553 
554 /* Initiate pool for insn reg info.  */
555 static void
556 init_insn_regs (void)
557 {
558   insn_reg_pool
559     = create_alloc_pool ("insn regs", sizeof (struct lra_insn_reg), 100);
560 }
561 
562 /* Create LRA insn related info about a reference to REGNO in INSN with
563    TYPE (in/out/inout), biggest reference mode MODE, flag that it is
564    reference through subreg (SUBREG_P), flag that is early clobbered
565    in the insn (EARLY_CLOBBER), and reference to the next insn reg
566    info (NEXT).	 */
567 static struct lra_insn_reg *
568 new_insn_reg (rtx_insn *insn, int regno, enum op_type type,
569 	      machine_mode mode,
570 	      bool subreg_p, bool early_clobber, struct lra_insn_reg *next)
571 {
572   struct lra_insn_reg *ir;
573 
574   ir = (struct lra_insn_reg *) pool_alloc (insn_reg_pool);
575   ir->type = type;
576   ir->biggest_mode = mode;
577   if (GET_MODE_SIZE (mode) > GET_MODE_SIZE (lra_reg_info[regno].biggest_mode)
578       && NONDEBUG_INSN_P (insn))
579     lra_reg_info[regno].biggest_mode = mode;
580   ir->subreg_p = subreg_p;
581   ir->early_clobber = early_clobber;
582   ir->regno = regno;
583   ir->next = next;
584   return ir;
585 }
586 
587 /* Free insn reg info IR.  */
588 static void
589 free_insn_reg (struct lra_insn_reg *ir)
590 {
591   pool_free (insn_reg_pool, ir);
592 }
593 
594 /* Free insn reg info list IR.	*/
595 static void
596 free_insn_regs (struct lra_insn_reg *ir)
597 {
598   struct lra_insn_reg *next_ir;
599 
600   for (; ir != NULL; ir = next_ir)
601     {
602       next_ir = ir->next;
603       free_insn_reg (ir);
604     }
605 }
606 
607 /* Finish pool for insn reg info.  */
608 static void
609 finish_insn_regs (void)
610 {
611   free_alloc_pool (insn_reg_pool);
612 }
613 
614 
615 
616 /* This page contains code dealing LRA insn info (or in other words
617    LRA internal insn representation).  */
618 
619 /* Map INSN_CODE -> the static insn data.  This info is valid during
620    all translation unit.  */
621 struct lra_static_insn_data *insn_code_data[LAST_INSN_CODE];
622 
623 /* Debug insns are represented as a special insn with one input
624    operand which is RTL expression in var_location.  */
625 
626 /* The following data are used as static insn operand data for all
627    debug insns.	 If structure lra_operand_data is changed, the
628    initializer should be changed too.  */
629 static struct lra_operand_data debug_operand_data =
630   {
631     NULL, /* alternative  */
632     VOIDmode, /* We are not interesting in the operand mode.  */
633     OP_IN,
634     0, 0, 0, 0
635   };
636 
637 /* The following data are used as static insn data for all debug
638    insns.  If structure lra_static_insn_data is changed, the
639    initializer should be changed too.  */
640 static struct lra_static_insn_data debug_insn_static_data =
641   {
642     &debug_operand_data,
643     0,	/* Duplication operands #.  */
644     -1, /* Commutative operand #.  */
645     1,	/* Operands #.	There is only one operand which is debug RTL
646 	   expression.	*/
647     0,	/* Duplications #.  */
648     0,	/* Alternatives #.  We are not interesting in alternatives
649 	   because we does not proceed debug_insns for reloads.	 */
650     NULL, /* Hard registers referenced in machine description.	*/
651     NULL  /* Descriptions of operands in alternatives.	*/
652   };
653 
654 /* Called once per compiler work to initialize some LRA data related
655    to insns.  */
656 static void
657 init_insn_code_data_once (void)
658 {
659   memset (insn_code_data, 0, sizeof (insn_code_data));
660 }
661 
662 /* Called once per compiler work to finalize some LRA data related to
663    insns.  */
664 static void
665 finish_insn_code_data_once (void)
666 {
667   int i;
668 
669   for (i = 0; i < LAST_INSN_CODE; i++)
670     {
671       if (insn_code_data[i] != NULL)
672 	free (insn_code_data[i]);
673     }
674 }
675 
676 /* Return static insn data, allocate and setup if necessary.  Although
677    dup_num is static data (it depends only on icode), to set it up we
678    need to extract insn first.	So recog_data should be valid for
679    normal insn (ICODE >= 0) before the call.  */
680 static struct lra_static_insn_data *
681 get_static_insn_data (int icode, int nop, int ndup, int nalt)
682 {
683   struct lra_static_insn_data *data;
684   size_t n_bytes;
685 
686   lra_assert (icode < LAST_INSN_CODE);
687   if (icode >= 0 && (data = insn_code_data[icode]) != NULL)
688     return data;
689   lra_assert (nop >= 0 && ndup >= 0 && nalt >= 0);
690   n_bytes = sizeof (struct lra_static_insn_data)
691 	    + sizeof (struct lra_operand_data) * nop
692 	    + sizeof (int) * ndup;
693   data = XNEWVAR (struct lra_static_insn_data, n_bytes);
694   data->operand_alternative = NULL;
695   data->n_operands = nop;
696   data->n_dups = ndup;
697   data->n_alternatives = nalt;
698   data->operand = ((struct lra_operand_data *)
699 		   ((char *) data + sizeof (struct lra_static_insn_data)));
700   data->dup_num = ((int *) ((char *) data->operand
701 			    + sizeof (struct lra_operand_data) * nop));
702   if (icode >= 0)
703     {
704       int i;
705 
706       insn_code_data[icode] = data;
707       for (i = 0; i < nop; i++)
708 	{
709 	  data->operand[i].constraint
710 	    = insn_data[icode].operand[i].constraint;
711 	  data->operand[i].mode = insn_data[icode].operand[i].mode;
712 	  data->operand[i].strict_low = insn_data[icode].operand[i].strict_low;
713 	  data->operand[i].is_operator
714 	    = insn_data[icode].operand[i].is_operator;
715 	  data->operand[i].type
716 	    = (data->operand[i].constraint[0] == '=' ? OP_OUT
717 	       : data->operand[i].constraint[0] == '+' ? OP_INOUT
718 	       : OP_IN);
719 	  data->operand[i].is_address = false;
720 	}
721       for (i = 0; i < ndup; i++)
722 	data->dup_num[i] = recog_data.dup_num[i];
723     }
724   return data;
725 }
726 
727 /* The current length of the following array.  */
728 int lra_insn_recog_data_len;
729 
730 /* Map INSN_UID -> the insn recog data (NULL if unknown).  */
731 lra_insn_recog_data_t *lra_insn_recog_data;
732 
733 /* Initialize LRA data about insns.  */
734 static void
735 init_insn_recog_data (void)
736 {
737   lra_insn_recog_data_len = 0;
738   lra_insn_recog_data = NULL;
739   init_insn_regs ();
740 }
741 
742 /* Expand, if necessary, LRA data about insns.	*/
743 static void
744 check_and_expand_insn_recog_data (int index)
745 {
746   int i, old;
747 
748   if (lra_insn_recog_data_len > index)
749     return;
750   old = lra_insn_recog_data_len;
751   lra_insn_recog_data_len = index * 3 / 2 + 1;
752   lra_insn_recog_data = XRESIZEVEC (lra_insn_recog_data_t,
753 				    lra_insn_recog_data,
754 				    lra_insn_recog_data_len);
755   for (i = old; i < lra_insn_recog_data_len; i++)
756     lra_insn_recog_data[i] = NULL;
757 }
758 
759 /* Finish LRA DATA about insn.	*/
760 static void
761 free_insn_recog_data (lra_insn_recog_data_t data)
762 {
763   if (data->operand_loc != NULL)
764     free (data->operand_loc);
765   if (data->dup_loc != NULL)
766     free (data->dup_loc);
767   if (data->arg_hard_regs != NULL)
768     free (data->arg_hard_regs);
769   if (data->icode < 0 && NONDEBUG_INSN_P (data->insn))
770     {
771       if (data->insn_static_data->operand_alternative != NULL)
772 	free (const_cast <operand_alternative *>
773 	      (data->insn_static_data->operand_alternative));
774       free_insn_regs (data->insn_static_data->hard_regs);
775       free (data->insn_static_data);
776     }
777   free_insn_regs (data->regs);
778   data->regs = NULL;
779   free (data);
780 }
781 
782 /* Finish LRA data about all insns.  */
783 static void
784 finish_insn_recog_data (void)
785 {
786   int i;
787   lra_insn_recog_data_t data;
788 
789   for (i = 0; i < lra_insn_recog_data_len; i++)
790     if ((data = lra_insn_recog_data[i]) != NULL)
791       free_insn_recog_data (data);
792   finish_insn_regs ();
793   free (lra_insn_recog_data);
794 }
795 
796 /* Setup info about operands in alternatives of LRA DATA of insn.  */
797 static void
798 setup_operand_alternative (lra_insn_recog_data_t data,
799 			   const operand_alternative *op_alt)
800 {
801   int i, j, nop, nalt;
802   int icode = data->icode;
803   struct lra_static_insn_data *static_data = data->insn_static_data;
804 
805   static_data->commutative = -1;
806   nop = static_data->n_operands;
807   nalt = static_data->n_alternatives;
808   static_data->operand_alternative = op_alt;
809   for (i = 0; i < nop; i++)
810     {
811       static_data->operand[i].early_clobber = false;
812       static_data->operand[i].is_address = false;
813       if (static_data->operand[i].constraint[0] == '%')
814 	{
815 	  /* We currently only support one commutative pair of operands.  */
816 	  if (static_data->commutative < 0)
817 	    static_data->commutative = i;
818 	  else
819 	    lra_assert (icode < 0); /* Asm  */
820 	  /* The last operand should not be marked commutative.  */
821 	  lra_assert (i != nop - 1);
822 	}
823     }
824   for (j = 0; j < nalt; j++)
825     for (i = 0; i < nop; i++, op_alt++)
826       {
827 	static_data->operand[i].early_clobber |= op_alt->earlyclobber;
828 	static_data->operand[i].is_address |= op_alt->is_address;
829       }
830 }
831 
832 /* Recursively process X and collect info about registers, which are
833    not the insn operands, in X with TYPE (in/out/inout) and flag that
834    it is early clobbered in the insn (EARLY_CLOBBER) and add the info
835    to LIST.  X is a part of insn given by DATA.	 Return the result
836    list.  */
837 static struct lra_insn_reg *
838 collect_non_operand_hard_regs (rtx *x, lra_insn_recog_data_t data,
839 			       struct lra_insn_reg *list,
840 			       enum op_type type, bool early_clobber)
841 {
842   int i, j, regno, last;
843   bool subreg_p;
844   machine_mode mode;
845   struct lra_insn_reg *curr;
846   rtx op = *x;
847   enum rtx_code code = GET_CODE (op);
848   const char *fmt = GET_RTX_FORMAT (code);
849 
850   for (i = 0; i < data->insn_static_data->n_operands; i++)
851     if (x == data->operand_loc[i])
852       /* It is an operand loc. Stop here.  */
853       return list;
854   for (i = 0; i < data->insn_static_data->n_dups; i++)
855     if (x == data->dup_loc[i])
856       /* It is a dup loc. Stop here.  */
857       return list;
858   mode = GET_MODE (op);
859   subreg_p = false;
860   if (code == SUBREG)
861     {
862       op = SUBREG_REG (op);
863       code = GET_CODE (op);
864       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (op)))
865 	{
866 	  mode = GET_MODE (op);
867 	  if (GET_MODE_SIZE (mode) > REGMODE_NATURAL_SIZE (mode))
868 	    subreg_p = true;
869 	}
870     }
871   if (REG_P (op))
872     {
873       if ((regno = REGNO (op)) >= FIRST_PSEUDO_REGISTER)
874 	return list;
875       /* Process all regs even unallocatable ones as we need info
876 	 about all regs for rematerialization pass.  */
877       for (last = regno + hard_regno_nregs[regno][mode];
878 	   regno < last;
879 	   regno++)
880 	{
881 	  for (curr = list; curr != NULL; curr = curr->next)
882 	    if (curr->regno == regno && curr->subreg_p == subreg_p
883 		&& curr->biggest_mode == mode)
884 	      {
885 		if (curr->type != type)
886 		  curr->type = OP_INOUT;
887 		if (curr->early_clobber != early_clobber)
888 		  curr->early_clobber = true;
889 		break;
890 	      }
891 	  if (curr == NULL)
892 	    {
893 	      /* This is a new hard regno or the info can not be
894 		 integrated into the found structure.	 */
895 #ifdef STACK_REGS
896 	      early_clobber
897 		= (early_clobber
898 		   /* This clobber is to inform popping floating
899 		      point stack only.  */
900 		   && ! (FIRST_STACK_REG <= regno
901 			 && regno <= LAST_STACK_REG));
902 #endif
903 	      list = new_insn_reg (data->insn, regno, type, mode, subreg_p,
904 				   early_clobber, list);
905 	    }
906 	}
907       return list;
908     }
909   switch (code)
910     {
911     case SET:
912       list = collect_non_operand_hard_regs (&SET_DEST (op), data,
913 					    list, OP_OUT, false);
914       list = collect_non_operand_hard_regs (&SET_SRC (op), data,
915 					    list, OP_IN, false);
916       break;
917     case CLOBBER:
918       /* We treat clobber of non-operand hard registers as early
919 	 clobber (the behavior is expected from asm).  */
920       list = collect_non_operand_hard_regs (&XEXP (op, 0), data,
921 					    list, OP_OUT, true);
922       break;
923     case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
924       list = collect_non_operand_hard_regs (&XEXP (op, 0), data,
925 					    list, OP_INOUT, false);
926       break;
927     case PRE_MODIFY: case POST_MODIFY:
928       list = collect_non_operand_hard_regs (&XEXP (op, 0), data,
929 					    list, OP_INOUT, false);
930       list = collect_non_operand_hard_regs (&XEXP (op, 1), data,
931 					    list, OP_IN, false);
932       break;
933     default:
934       fmt = GET_RTX_FORMAT (code);
935       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
936 	{
937 	  if (fmt[i] == 'e')
938 	    list = collect_non_operand_hard_regs (&XEXP (op, i), data,
939 						  list, OP_IN, false);
940 	  else if (fmt[i] == 'E')
941 	    for (j = XVECLEN (op, i) - 1; j >= 0; j--)
942 	      list = collect_non_operand_hard_regs (&XVECEXP (op, i, j), data,
943 						    list, OP_IN, false);
944 	}
945     }
946   return list;
947 }
948 
949 /* Set up and return info about INSN.  Set up the info if it is not set up
950    yet.	 */
951 lra_insn_recog_data_t
952 lra_set_insn_recog_data (rtx_insn *insn)
953 {
954   lra_insn_recog_data_t data;
955   int i, n, icode;
956   rtx **locs;
957   unsigned int uid = INSN_UID (insn);
958   struct lra_static_insn_data *insn_static_data;
959 
960   check_and_expand_insn_recog_data (uid);
961   if (DEBUG_INSN_P (insn))
962     icode = -1;
963   else
964     {
965       icode = INSN_CODE (insn);
966       if (icode < 0)
967 	/* It might be a new simple insn which is not recognized yet.  */
968 	INSN_CODE (insn) = icode = recog_memoized (insn);
969     }
970   data = XNEW (struct lra_insn_recog_data);
971   lra_insn_recog_data[uid] = data;
972   data->insn = insn;
973   data->used_insn_alternative = -1;
974   data->icode = icode;
975   data->regs = NULL;
976   if (DEBUG_INSN_P (insn))
977     {
978       data->insn_static_data = &debug_insn_static_data;
979       data->dup_loc = NULL;
980       data->arg_hard_regs = NULL;
981       data->preferred_alternatives = ALL_ALTERNATIVES;
982       data->operand_loc = XNEWVEC (rtx *, 1);
983       data->operand_loc[0] = &INSN_VAR_LOCATION_LOC (insn);
984       return data;
985     }
986   if (icode < 0)
987     {
988       int nop, nalt;
989       machine_mode operand_mode[MAX_RECOG_OPERANDS];
990       const char *constraints[MAX_RECOG_OPERANDS];
991 
992       nop = asm_noperands (PATTERN (insn));
993       data->operand_loc = data->dup_loc = NULL;
994       nalt = 1;
995       if (nop < 0)
996 	{
997 	  /* It is a special insn like USE or CLOBBER.  We should
998 	     recognize any regular insn otherwise LRA can do nothing
999 	     with this insn.  */
1000 	  gcc_assert (GET_CODE (PATTERN (insn)) == USE
1001 		      || GET_CODE (PATTERN (insn)) == CLOBBER
1002 		      || GET_CODE (PATTERN (insn)) == ASM_INPUT);
1003 	  data->insn_static_data = insn_static_data
1004 	    = get_static_insn_data (-1, 0, 0, nalt);
1005 	}
1006       else
1007 	{
1008 	  /* expand_asm_operands makes sure there aren't too many
1009 	     operands.	*/
1010 	  lra_assert (nop <= MAX_RECOG_OPERANDS);
1011 	  if (nop != 0)
1012 	    data->operand_loc = XNEWVEC (rtx *, nop);
1013 	  /* Now get the operand values and constraints out of the
1014 	     insn.  */
1015 	  decode_asm_operands (PATTERN (insn), NULL,
1016 			       data->operand_loc,
1017 			       constraints, operand_mode, NULL);
1018 	  if (nop > 0)
1019 	    {
1020 	      const char *p =  recog_data.constraints[0];
1021 
1022 	      for (p =	constraints[0]; *p; p++)
1023 		nalt += *p == ',';
1024 	    }
1025 	  data->insn_static_data = insn_static_data
1026 	    = get_static_insn_data (-1, nop, 0, nalt);
1027 	  for (i = 0; i < nop; i++)
1028 	    {
1029 	      insn_static_data->operand[i].mode = operand_mode[i];
1030 	      insn_static_data->operand[i].constraint = constraints[i];
1031 	      insn_static_data->operand[i].strict_low = false;
1032 	      insn_static_data->operand[i].is_operator = false;
1033 	      insn_static_data->operand[i].is_address = false;
1034 	    }
1035 	}
1036       for (i = 0; i < insn_static_data->n_operands; i++)
1037 	insn_static_data->operand[i].type
1038 	  = (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
1039 	     : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
1040 	     : OP_IN);
1041       data->preferred_alternatives = ALL_ALTERNATIVES;
1042       if (nop > 0)
1043 	{
1044 	  operand_alternative *op_alt = XCNEWVEC (operand_alternative,
1045 						  nalt * nop);
1046 	  preprocess_constraints (nop, nalt, constraints, op_alt);
1047 	  setup_operand_alternative (data, op_alt);
1048 	}
1049     }
1050   else
1051     {
1052       insn_extract (insn);
1053       data->insn_static_data = insn_static_data
1054 	= get_static_insn_data (icode, insn_data[icode].n_operands,
1055 				insn_data[icode].n_dups,
1056 				insn_data[icode].n_alternatives);
1057       n = insn_static_data->n_operands;
1058       if (n == 0)
1059 	locs = NULL;
1060       else
1061 	{
1062 	  locs = XNEWVEC (rtx *, n);
1063 	  memcpy (locs, recog_data.operand_loc, n * sizeof (rtx *));
1064 	}
1065       data->operand_loc = locs;
1066       n = insn_static_data->n_dups;
1067       if (n == 0)
1068 	locs = NULL;
1069       else
1070 	{
1071 	  locs = XNEWVEC (rtx *, n);
1072 	  memcpy (locs, recog_data.dup_loc, n * sizeof (rtx *));
1073 	}
1074       data->dup_loc = locs;
1075       data->preferred_alternatives = get_preferred_alternatives (insn);
1076       const operand_alternative *op_alt = preprocess_insn_constraints (icode);
1077       if (!insn_static_data->operand_alternative)
1078 	setup_operand_alternative (data, op_alt);
1079       else if (op_alt != insn_static_data->operand_alternative)
1080 	insn_static_data->operand_alternative = op_alt;
1081     }
1082   if (GET_CODE (PATTERN (insn)) == CLOBBER || GET_CODE (PATTERN (insn)) == USE)
1083     insn_static_data->hard_regs = NULL;
1084   else
1085     insn_static_data->hard_regs
1086       = collect_non_operand_hard_regs (&PATTERN (insn), data,
1087 				       NULL, OP_IN, false);
1088   data->arg_hard_regs = NULL;
1089   if (CALL_P (insn))
1090     {
1091       bool use_p;
1092       rtx link;
1093       int n_hard_regs, regno, arg_hard_regs[FIRST_PSEUDO_REGISTER];
1094 
1095       n_hard_regs = 0;
1096       /* Finding implicit hard register usage.	We believe it will be
1097 	 not changed whatever transformations are used.	 Call insns
1098 	 are such example.  */
1099       for (link = CALL_INSN_FUNCTION_USAGE (insn);
1100 	   link != NULL_RTX;
1101 	   link = XEXP (link, 1))
1102 	if (((use_p = GET_CODE (XEXP (link, 0)) == USE)
1103 	     || GET_CODE (XEXP (link, 0)) == CLOBBER)
1104 	    && REG_P (XEXP (XEXP (link, 0), 0)))
1105 	  {
1106 	    regno = REGNO (XEXP (XEXP (link, 0), 0));
1107 	    lra_assert (regno < FIRST_PSEUDO_REGISTER);
1108 	    /* It is an argument register.  */
1109 	    for (i = (hard_regno_nregs
1110 		      [regno][GET_MODE (XEXP (XEXP (link, 0), 0))]) - 1;
1111 		 i >= 0;
1112 		 i--)
1113 	      arg_hard_regs[n_hard_regs++]
1114 		= regno + i + (use_p ? 0 : FIRST_PSEUDO_REGISTER);
1115 	  }
1116       if (n_hard_regs != 0)
1117 	{
1118 	  arg_hard_regs[n_hard_regs++] = -1;
1119 	  data->arg_hard_regs = XNEWVEC (int, n_hard_regs);
1120 	  memcpy (data->arg_hard_regs, arg_hard_regs,
1121 		  sizeof (int) * n_hard_regs);
1122 	}
1123     }
1124   /* Some output operand can be recognized only from the context not
1125      from the constraints which are empty in this case.	 Call insn may
1126      contain a hard register in set destination with empty constraint
1127      and extract_insn treats them as an input.	*/
1128   for (i = 0; i < insn_static_data->n_operands; i++)
1129     {
1130       int j;
1131       rtx pat, set;
1132       struct lra_operand_data *operand = &insn_static_data->operand[i];
1133 
1134       /* ??? Should we treat 'X' the same way.	It looks to me that
1135 	 'X' means anything and empty constraint means we do not
1136 	 care.	*/
1137       if (operand->type != OP_IN || *operand->constraint != '\0'
1138 	  || operand->is_operator)
1139 	continue;
1140       pat = PATTERN (insn);
1141       if (GET_CODE (pat) == SET)
1142 	{
1143 	  if (data->operand_loc[i] != &SET_DEST (pat))
1144 	    continue;
1145 	}
1146       else if (GET_CODE (pat) == PARALLEL)
1147 	{
1148 	  for (j = XVECLEN (pat, 0) - 1; j >= 0; j--)
1149 	    {
1150 	      set = XVECEXP (PATTERN (insn), 0, j);
1151 	      if (GET_CODE (set) == SET
1152 		  && &SET_DEST (set) == data->operand_loc[i])
1153 		break;
1154 	    }
1155 	  if (j < 0)
1156 	    continue;
1157 	}
1158       else
1159 	continue;
1160       operand->type = OP_OUT;
1161     }
1162   return data;
1163 }
1164 
1165 /* Return info about insn give by UID.	The info should be already set
1166    up.	*/
1167 static lra_insn_recog_data_t
1168 get_insn_recog_data_by_uid (int uid)
1169 {
1170   lra_insn_recog_data_t data;
1171 
1172   data = lra_insn_recog_data[uid];
1173   lra_assert (data != NULL);
1174   return data;
1175 }
1176 
1177 /* Invalidate all info about insn given by its UID.  */
1178 static void
1179 invalidate_insn_recog_data (int uid)
1180 {
1181   lra_insn_recog_data_t data;
1182 
1183   data = lra_insn_recog_data[uid];
1184   lra_assert (data != NULL);
1185   free_insn_recog_data (data);
1186   lra_insn_recog_data[uid] = NULL;
1187 }
1188 
1189 /* Update all the insn info about INSN.	 It is usually called when
1190    something in the insn was changed.  Return the updated info.	 */
1191 lra_insn_recog_data_t
1192 lra_update_insn_recog_data (rtx_insn *insn)
1193 {
1194   lra_insn_recog_data_t data;
1195   int n;
1196   unsigned int uid = INSN_UID (insn);
1197   struct lra_static_insn_data *insn_static_data;
1198   HOST_WIDE_INT sp_offset = 0;
1199 
1200   check_and_expand_insn_recog_data (uid);
1201   if ((data = lra_insn_recog_data[uid]) != NULL
1202       && data->icode != INSN_CODE (insn))
1203     {
1204       sp_offset = data->sp_offset;
1205       invalidate_insn_data_regno_info (data, insn, get_insn_freq (insn));
1206       invalidate_insn_recog_data (uid);
1207       data = NULL;
1208     }
1209   if (data == NULL)
1210     {
1211       data = lra_get_insn_recog_data (insn);
1212       /* Initiate or restore SP offset.  */
1213       data->sp_offset = sp_offset;
1214       return data;
1215     }
1216   insn_static_data = data->insn_static_data;
1217   data->used_insn_alternative = -1;
1218   if (DEBUG_INSN_P (insn))
1219     return data;
1220   if (data->icode < 0)
1221     {
1222       int nop;
1223       machine_mode operand_mode[MAX_RECOG_OPERANDS];
1224       const char *constraints[MAX_RECOG_OPERANDS];
1225 
1226       nop = asm_noperands (PATTERN (insn));
1227       if (nop >= 0)
1228 	{
1229 	  lra_assert (nop == data->insn_static_data->n_operands);
1230 	  /* Now get the operand values and constraints out of the
1231 	     insn.  */
1232 	  decode_asm_operands (PATTERN (insn), NULL,
1233 			       data->operand_loc,
1234 			       constraints, operand_mode, NULL);
1235 #ifdef ENABLE_CHECKING
1236 	  {
1237 	    int i;
1238 
1239 	    for (i = 0; i < nop; i++)
1240 	      lra_assert
1241 		(insn_static_data->operand[i].mode == operand_mode[i]
1242 		 && insn_static_data->operand[i].constraint == constraints[i]
1243 		 && ! insn_static_data->operand[i].is_operator);
1244 	  }
1245 #endif
1246 	}
1247 #ifdef ENABLE_CHECKING
1248       {
1249 	int i;
1250 
1251 	for (i = 0; i < insn_static_data->n_operands; i++)
1252 	  lra_assert
1253 	    (insn_static_data->operand[i].type
1254 	     == (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
1255 		 : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
1256 		 : OP_IN));
1257       }
1258 #endif
1259     }
1260   else
1261     {
1262       insn_extract (insn);
1263       n = insn_static_data->n_operands;
1264       if (n != 0)
1265 	memcpy (data->operand_loc, recog_data.operand_loc, n * sizeof (rtx *));
1266       n = insn_static_data->n_dups;
1267       if (n != 0)
1268 	memcpy (data->dup_loc, recog_data.dup_loc, n * sizeof (rtx *));
1269       lra_assert (check_bool_attrs (insn));
1270     }
1271   return data;
1272 }
1273 
1274 /* Set up that INSN is using alternative ALT now.  */
1275 void
1276 lra_set_used_insn_alternative (rtx_insn *insn, int alt)
1277 {
1278   lra_insn_recog_data_t data;
1279 
1280   data = lra_get_insn_recog_data (insn);
1281   data->used_insn_alternative = alt;
1282 }
1283 
1284 /* Set up that insn with UID is using alternative ALT now.  The insn
1285    info should be already set up.  */
1286 void
1287 lra_set_used_insn_alternative_by_uid (int uid, int alt)
1288 {
1289   lra_insn_recog_data_t data;
1290 
1291   check_and_expand_insn_recog_data (uid);
1292   data = lra_insn_recog_data[uid];
1293   lra_assert (data != NULL);
1294   data->used_insn_alternative = alt;
1295 }
1296 
1297 
1298 
1299 /* This page contains code dealing with common register info and
1300    pseudo copies.  */
1301 
1302 /* The size of the following array.  */
1303 static int reg_info_size;
1304 /* Common info about each register.  */
1305 struct lra_reg *lra_reg_info;
1306 
1307 /* Last register value.	 */
1308 static int last_reg_value;
1309 
1310 /* Return new register value.  */
1311 static int
1312 get_new_reg_value (void)
1313 {
1314   return ++last_reg_value;
1315 }
1316 
1317 /* Pools for copies.  */
1318 static alloc_pool copy_pool;
1319 
1320 /* Vec referring to pseudo copies.  */
1321 static vec<lra_copy_t> copy_vec;
1322 
1323 /* Initialize I-th element of lra_reg_info.  */
1324 static inline void
1325 initialize_lra_reg_info_element (int i)
1326 {
1327   bitmap_initialize (&lra_reg_info[i].insn_bitmap, &reg_obstack);
1328 #ifdef STACK_REGS
1329   lra_reg_info[i].no_stack_p = false;
1330 #endif
1331   CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
1332   CLEAR_HARD_REG_SET (lra_reg_info[i].actual_call_used_reg_set);
1333   lra_reg_info[i].preferred_hard_regno1 = -1;
1334   lra_reg_info[i].preferred_hard_regno2 = -1;
1335   lra_reg_info[i].preferred_hard_regno_profit1 = 0;
1336   lra_reg_info[i].preferred_hard_regno_profit2 = 0;
1337   lra_reg_info[i].biggest_mode = VOIDmode;
1338   lra_reg_info[i].live_ranges = NULL;
1339   lra_reg_info[i].nrefs = lra_reg_info[i].freq = 0;
1340   lra_reg_info[i].last_reload = 0;
1341   lra_reg_info[i].restore_regno = -1;
1342   lra_reg_info[i].val = get_new_reg_value ();
1343   lra_reg_info[i].offset = 0;
1344   lra_reg_info[i].copies = NULL;
1345 }
1346 
1347 /* Initialize common reg info and copies.  */
1348 static void
1349 init_reg_info (void)
1350 {
1351   int i;
1352 
1353   last_reg_value = 0;
1354   reg_info_size = max_reg_num () * 3 / 2 + 1;
1355   lra_reg_info = XNEWVEC (struct lra_reg, reg_info_size);
1356   for (i = 0; i < reg_info_size; i++)
1357     initialize_lra_reg_info_element (i);
1358   copy_pool
1359     = create_alloc_pool ("lra copies", sizeof (struct lra_copy), 100);
1360   copy_vec.create (100);
1361 }
1362 
1363 
1364 /* Finish common reg info and copies.  */
1365 static void
1366 finish_reg_info (void)
1367 {
1368   int i;
1369 
1370   for (i = 0; i < reg_info_size; i++)
1371     bitmap_clear (&lra_reg_info[i].insn_bitmap);
1372   free (lra_reg_info);
1373   reg_info_size = 0;
1374   free_alloc_pool (copy_pool);
1375   copy_vec.release ();
1376 }
1377 
1378 /* Expand common reg info if it is necessary.  */
1379 static void
1380 expand_reg_info (void)
1381 {
1382   int i, old = reg_info_size;
1383 
1384   if (reg_info_size > max_reg_num ())
1385     return;
1386   reg_info_size = max_reg_num () * 3 / 2 + 1;
1387   lra_reg_info = XRESIZEVEC (struct lra_reg, lra_reg_info, reg_info_size);
1388   for (i = old; i < reg_info_size; i++)
1389     initialize_lra_reg_info_element (i);
1390 }
1391 
1392 /* Free all copies.  */
1393 void
1394 lra_free_copies (void)
1395 {
1396   lra_copy_t cp;
1397 
1398   while (copy_vec.length () != 0)
1399     {
1400       cp = copy_vec.pop ();
1401       lra_reg_info[cp->regno1].copies = lra_reg_info[cp->regno2].copies = NULL;
1402       pool_free (copy_pool, cp);
1403     }
1404 }
1405 
1406 /* Create copy of two pseudos REGNO1 and REGNO2.  The copy execution
1407    frequency is FREQ.  */
1408 void
1409 lra_create_copy (int regno1, int regno2, int freq)
1410 {
1411   bool regno1_dest_p;
1412   lra_copy_t cp;
1413 
1414   lra_assert (regno1 != regno2);
1415   regno1_dest_p = true;
1416   if (regno1 > regno2)
1417     {
1418       int temp = regno2;
1419 
1420       regno1_dest_p = false;
1421       regno2 = regno1;
1422       regno1 = temp;
1423     }
1424   cp = (lra_copy_t) pool_alloc (copy_pool);
1425   copy_vec.safe_push (cp);
1426   cp->regno1_dest_p = regno1_dest_p;
1427   cp->freq = freq;
1428   cp->regno1 = regno1;
1429   cp->regno2 = regno2;
1430   cp->regno1_next = lra_reg_info[regno1].copies;
1431   lra_reg_info[regno1].copies = cp;
1432   cp->regno2_next = lra_reg_info[regno2].copies;
1433   lra_reg_info[regno2].copies = cp;
1434   if (lra_dump_file != NULL)
1435     fprintf (lra_dump_file, "	   Creating copy r%d%sr%d@%d\n",
1436 	     regno1, regno1_dest_p ? "<-" : "->", regno2, freq);
1437 }
1438 
1439 /* Return N-th (0, 1, ...) copy.  If there is no copy, return
1440    NULL.  */
1441 lra_copy_t
1442 lra_get_copy (int n)
1443 {
1444   if (n >= (int) copy_vec.length ())
1445     return NULL;
1446   return copy_vec[n];
1447 }
1448 
1449 
1450 
1451 /* This page contains code dealing with info about registers in
1452    insns.  */
1453 
1454 /* Process X of insn UID recursively and add info (operand type is
1455    given by TYPE, flag of that it is early clobber is EARLY_CLOBBER)
1456    about registers in X to the insn DATA.  */
1457 static void
1458 add_regs_to_insn_regno_info (lra_insn_recog_data_t data, rtx x, int uid,
1459 			     enum op_type type, bool early_clobber)
1460 {
1461   int i, j, regno;
1462   bool subreg_p;
1463   machine_mode mode;
1464   const char *fmt;
1465   enum rtx_code code;
1466   struct lra_insn_reg *curr;
1467 
1468   code = GET_CODE (x);
1469   mode = GET_MODE (x);
1470   subreg_p = false;
1471   if (GET_CODE (x) == SUBREG)
1472     {
1473       x = SUBREG_REG (x);
1474       code = GET_CODE (x);
1475       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (x)))
1476 	{
1477 	  mode = GET_MODE (x);
1478 	  if (GET_MODE_SIZE (mode) > REGMODE_NATURAL_SIZE (mode))
1479 	    subreg_p = true;
1480 	}
1481     }
1482   if (REG_P (x))
1483     {
1484       regno = REGNO (x);
1485       /* Process all regs even unallocatable ones as we need info about
1486 	 all regs for rematerialization pass.  */
1487       expand_reg_info ();
1488       if (bitmap_set_bit (&lra_reg_info[regno].insn_bitmap, uid))
1489 	{
1490 	  data->regs = new_insn_reg (data->insn, regno, type, mode, subreg_p,
1491 				     early_clobber, data->regs);
1492 	  return;
1493 	}
1494       else
1495 	{
1496 	  for (curr = data->regs; curr != NULL; curr = curr->next)
1497 	    if (curr->regno == regno)
1498 	      {
1499 		if (curr->subreg_p != subreg_p || curr->biggest_mode != mode)
1500 		  /* The info can not be integrated into the found
1501 		     structure.  */
1502 		  data->regs = new_insn_reg (data->insn, regno, type, mode,
1503 					     subreg_p, early_clobber,
1504 					     data->regs);
1505 		else
1506 		  {
1507 		    if (curr->type != type)
1508 		      curr->type = OP_INOUT;
1509 		    if (curr->early_clobber != early_clobber)
1510 		      curr->early_clobber = true;
1511 		  }
1512 		return;
1513 	      }
1514 	  gcc_unreachable ();
1515 	}
1516     }
1517 
1518   switch (code)
1519     {
1520     case SET:
1521       add_regs_to_insn_regno_info (data, SET_DEST (x), uid, OP_OUT, false);
1522       add_regs_to_insn_regno_info (data, SET_SRC (x), uid, OP_IN, false);
1523       break;
1524     case CLOBBER:
1525       /* We treat clobber of non-operand hard registers as early
1526 	 clobber (the behavior is expected from asm).  */
1527       add_regs_to_insn_regno_info (data, XEXP (x, 0), uid, OP_OUT, true);
1528       break;
1529     case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
1530       add_regs_to_insn_regno_info (data, XEXP (x, 0), uid, OP_INOUT, false);
1531       break;
1532     case PRE_MODIFY: case POST_MODIFY:
1533       add_regs_to_insn_regno_info (data, XEXP (x, 0), uid, OP_INOUT, false);
1534       add_regs_to_insn_regno_info (data, XEXP (x, 1), uid, OP_IN, false);
1535       break;
1536     default:
1537       if ((code != PARALLEL && code != EXPR_LIST) || type != OP_OUT)
1538 	/* Some targets place small structures in registers for return
1539 	   values of functions, and those registers are wrapped in
1540 	   PARALLEL that we may see as the destination of a SET.  Here
1541 	   is an example:
1542 
1543 	   (call_insn 13 12 14 2 (set (parallel:BLK [
1544 		(expr_list:REG_DEP_TRUE (reg:DI 0 ax)
1545 		    (const_int 0 [0]))
1546 		(expr_list:REG_DEP_TRUE (reg:DI 1 dx)
1547 		    (const_int 8 [0x8]))
1548 	       ])
1549 	     (call (mem:QI (symbol_ref:DI (...	*/
1550 	type = OP_IN;
1551       fmt = GET_RTX_FORMAT (code);
1552       for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1553 	{
1554 	  if (fmt[i] == 'e')
1555 	    add_regs_to_insn_regno_info (data, XEXP (x, i), uid, type, false);
1556 	  else if (fmt[i] == 'E')
1557 	    {
1558 	      for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1559 		add_regs_to_insn_regno_info (data, XVECEXP (x, i, j), uid,
1560 					     type, false);
1561 	    }
1562 	}
1563     }
1564 }
1565 
1566 /* Return execution frequency of INSN.	*/
1567 static int
1568 get_insn_freq (rtx_insn *insn)
1569 {
1570   basic_block bb = BLOCK_FOR_INSN (insn);
1571 
1572   gcc_checking_assert (bb != NULL);
1573   return REG_FREQ_FROM_BB (bb);
1574 }
1575 
1576 /* Invalidate all reg info of INSN with DATA and execution frequency
1577    FREQ.  Update common info about the invalidated registers.  */
1578 static void
1579 invalidate_insn_data_regno_info (lra_insn_recog_data_t data, rtx_insn *insn,
1580 				 int freq)
1581 {
1582   int uid;
1583   bool debug_p;
1584   unsigned int i;
1585   struct lra_insn_reg *ir, *next_ir;
1586 
1587   uid = INSN_UID (insn);
1588   debug_p = DEBUG_INSN_P (insn);
1589   for (ir = data->regs; ir != NULL; ir = next_ir)
1590     {
1591       i = ir->regno;
1592       next_ir = ir->next;
1593       free_insn_reg (ir);
1594       bitmap_clear_bit (&lra_reg_info[i].insn_bitmap, uid);
1595       if (i >= FIRST_PSEUDO_REGISTER && ! debug_p)
1596 	{
1597 	  lra_reg_info[i].nrefs--;
1598 	  lra_reg_info[i].freq -= freq;
1599 	  lra_assert (lra_reg_info[i].nrefs >= 0 && lra_reg_info[i].freq >= 0);
1600 	}
1601     }
1602   data->regs = NULL;
1603 }
1604 
1605 /* Invalidate all reg info of INSN.  Update common info about the
1606    invalidated registers.  */
1607 void
1608 lra_invalidate_insn_regno_info (rtx_insn *insn)
1609 {
1610   invalidate_insn_data_regno_info (lra_get_insn_recog_data (insn), insn,
1611 				   get_insn_freq (insn));
1612 }
1613 
1614 /* Update common reg info from reg info of insn given by its DATA and
1615    execution frequency FREQ.  */
1616 static void
1617 setup_insn_reg_info (lra_insn_recog_data_t data, int freq)
1618 {
1619   unsigned int i;
1620   struct lra_insn_reg *ir;
1621 
1622   for (ir = data->regs; ir != NULL; ir = ir->next)
1623     if ((i = ir->regno) >= FIRST_PSEUDO_REGISTER)
1624       {
1625 	lra_reg_info[i].nrefs++;
1626 	lra_reg_info[i].freq += freq;
1627       }
1628 }
1629 
1630 /* Set up insn reg info of INSN.  Update common reg info from reg info
1631    of INSN.  */
1632 void
1633 lra_update_insn_regno_info (rtx_insn *insn)
1634 {
1635   int i, uid, freq;
1636   lra_insn_recog_data_t data;
1637   struct lra_static_insn_data *static_data;
1638   enum rtx_code code;
1639   rtx link;
1640 
1641   if (! INSN_P (insn))
1642     return;
1643   data = lra_get_insn_recog_data (insn);
1644   static_data = data->insn_static_data;
1645   freq = get_insn_freq (insn);
1646   invalidate_insn_data_regno_info (data, insn, freq);
1647   uid = INSN_UID (insn);
1648   for (i = static_data->n_operands - 1; i >= 0; i--)
1649     add_regs_to_insn_regno_info (data, *data->operand_loc[i], uid,
1650 				 static_data->operand[i].type,
1651 				 static_data->operand[i].early_clobber);
1652   if ((code = GET_CODE (PATTERN (insn))) == CLOBBER || code == USE)
1653     add_regs_to_insn_regno_info (data, XEXP (PATTERN (insn), 0), uid,
1654 				 code == USE ? OP_IN : OP_OUT, false);
1655   if (CALL_P (insn))
1656     /* On some targets call insns can refer to pseudos in memory in
1657        CALL_INSN_FUNCTION_USAGE list.  Process them in order to
1658        consider their occurrences in calls for different
1659        transformations (e.g. inheritance) with given pseudos.  */
1660     for (link = CALL_INSN_FUNCTION_USAGE (insn);
1661 	 link != NULL_RTX;
1662 	 link = XEXP (link, 1))
1663       if (((code = GET_CODE (XEXP (link, 0))) == USE || code == CLOBBER)
1664 	  && MEM_P (XEXP (XEXP (link, 0), 0)))
1665 	add_regs_to_insn_regno_info (data, XEXP (XEXP (link, 0), 0), uid,
1666 				     code == USE ? OP_IN : OP_OUT, false);
1667   if (NONDEBUG_INSN_P (insn))
1668     setup_insn_reg_info (data, freq);
1669 }
1670 
1671 /* Return reg info of insn given by it UID.  */
1672 struct lra_insn_reg *
1673 lra_get_insn_regs (int uid)
1674 {
1675   lra_insn_recog_data_t data;
1676 
1677   data = get_insn_recog_data_by_uid (uid);
1678   return data->regs;
1679 }
1680 
1681 
1682 
1683 /* This page contains code dealing with stack of the insns which
1684    should be processed by the next constraint pass.  */
1685 
1686 /* Bitmap used to put an insn on the stack only in one exemplar.  */
1687 static sbitmap lra_constraint_insn_stack_bitmap;
1688 
1689 /* The stack itself.  */
1690 vec<rtx_insn *> lra_constraint_insn_stack;
1691 
1692 /* Put INSN on the stack.  If ALWAYS_UPDATE is true, always update the reg
1693    info for INSN, otherwise only update it if INSN is not already on the
1694    stack.  */
1695 static inline void
1696 lra_push_insn_1 (rtx_insn *insn, bool always_update)
1697 {
1698   unsigned int uid = INSN_UID (insn);
1699   if (always_update)
1700     lra_update_insn_regno_info (insn);
1701   if (uid >= SBITMAP_SIZE (lra_constraint_insn_stack_bitmap))
1702     lra_constraint_insn_stack_bitmap =
1703       sbitmap_resize (lra_constraint_insn_stack_bitmap, 3 * uid / 2, 0);
1704   if (bitmap_bit_p (lra_constraint_insn_stack_bitmap, uid))
1705     return;
1706   bitmap_set_bit (lra_constraint_insn_stack_bitmap, uid);
1707   if (! always_update)
1708     lra_update_insn_regno_info (insn);
1709   lra_constraint_insn_stack.safe_push (insn);
1710 }
1711 
1712 /* Put INSN on the stack.  */
1713 void
1714 lra_push_insn (rtx_insn *insn)
1715 {
1716   lra_push_insn_1 (insn, false);
1717 }
1718 
1719 /* Put INSN on the stack and update its reg info.  */
1720 void
1721 lra_push_insn_and_update_insn_regno_info (rtx_insn *insn)
1722 {
1723   lra_push_insn_1 (insn, true);
1724 }
1725 
1726 /* Put insn with UID on the stack.  */
1727 void
1728 lra_push_insn_by_uid (unsigned int uid)
1729 {
1730   lra_push_insn (lra_insn_recog_data[uid]->insn);
1731 }
1732 
1733 /* Take the last-inserted insns off the stack and return it.  */
1734 rtx_insn *
1735 lra_pop_insn (void)
1736 {
1737   rtx_insn *insn = lra_constraint_insn_stack.pop ();
1738   bitmap_clear_bit (lra_constraint_insn_stack_bitmap, INSN_UID (insn));
1739   return insn;
1740 }
1741 
1742 /* Return the current size of the insn stack.  */
1743 unsigned int
1744 lra_insn_stack_length (void)
1745 {
1746   return lra_constraint_insn_stack.length ();
1747 }
1748 
1749 /* Push insns FROM to TO (excluding it) going in reverse order.	 */
1750 static void
1751 push_insns (rtx_insn *from, rtx_insn *to)
1752 {
1753   rtx_insn *insn;
1754 
1755   if (from == NULL_RTX)
1756     return;
1757   for (insn = from; insn != to; insn = PREV_INSN (insn))
1758     if (INSN_P (insn))
1759       lra_push_insn (insn);
1760 }
1761 
1762 /* Set up sp offset for insn in range [FROM, LAST].  The offset is
1763    taken from the next BB insn after LAST or zero if there in such
1764    insn.  */
1765 static void
1766 setup_sp_offset (rtx_insn *from, rtx_insn *last)
1767 {
1768   rtx_insn *before = next_nonnote_insn_bb (last);
1769   HOST_WIDE_INT offset = (before == NULL_RTX || ! INSN_P (before)
1770 			  ? 0 : lra_get_insn_recog_data (before)->sp_offset);
1771 
1772   for (rtx_insn *insn = from; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
1773     lra_get_insn_recog_data (insn)->sp_offset = offset;
1774 }
1775 
1776 /* Emit insns BEFORE before INSN and insns AFTER after INSN.  Put the
1777    insns onto the stack.  Print about emitting the insns with
1778    TITLE.  */
1779 void
1780 lra_process_new_insns (rtx_insn *insn, rtx_insn *before, rtx_insn *after,
1781 		       const char *title)
1782 {
1783   rtx_insn *last;
1784 
1785   if (before == NULL_RTX && after == NULL_RTX)
1786     return;
1787   if (lra_dump_file != NULL)
1788     {
1789       dump_insn_slim (lra_dump_file, insn);
1790       if (before != NULL_RTX)
1791 	{
1792 	  fprintf (lra_dump_file,"    %s before:\n", title);
1793 	  dump_rtl_slim (lra_dump_file, before, NULL, -1, 0);
1794 	}
1795       if (after != NULL_RTX)
1796 	{
1797 	  fprintf (lra_dump_file, "    %s after:\n", title);
1798 	  dump_rtl_slim (lra_dump_file, after, NULL, -1, 0);
1799 	}
1800       fprintf (lra_dump_file, "\n");
1801     }
1802   if (before != NULL_RTX)
1803     {
1804       if (cfun->can_throw_non_call_exceptions)
1805 	copy_reg_eh_region_note_forward (insn, before, NULL);
1806       emit_insn_before (before, insn);
1807       push_insns (PREV_INSN (insn), PREV_INSN (before));
1808       setup_sp_offset (before, PREV_INSN (insn));
1809     }
1810   if (after != NULL_RTX)
1811     {
1812       if (cfun->can_throw_non_call_exceptions)
1813 	copy_reg_eh_region_note_forward (insn, after, NULL);
1814       for (last = after; NEXT_INSN (last) != NULL_RTX; last = NEXT_INSN (last))
1815 	;
1816       emit_insn_after (after, insn);
1817       push_insns (last, insn);
1818       setup_sp_offset (after, last);
1819     }
1820   if (cfun->can_throw_non_call_exceptions)
1821     {
1822       rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
1823       if (note && !insn_could_throw_p (insn))
1824 	remove_note (insn, note);
1825     }
1826 }
1827 
1828 
1829 /* Replace all references to register OLD_REGNO in *LOC with pseudo
1830    register NEW_REG.  Try to simplify subreg of constant if SUBREG_P.
1831    Return true if any change was made.  */
1832 bool
1833 lra_substitute_pseudo (rtx *loc, int old_regno, rtx new_reg, bool subreg_p)
1834 {
1835   rtx x = *loc;
1836   bool result = false;
1837   enum rtx_code code;
1838   const char *fmt;
1839   int i, j;
1840 
1841   if (x == NULL_RTX)
1842     return false;
1843 
1844   code = GET_CODE (x);
1845   if (code == SUBREG && subreg_p)
1846     {
1847       rtx subst, inner = SUBREG_REG (x);
1848       /* Transform subreg of constant while we still have inner mode
1849 	 of the subreg.  The subreg internal should not be an insn
1850 	 operand.  */
1851       if (REG_P (inner) && (int) REGNO (inner) == old_regno
1852 	  && CONSTANT_P (new_reg)
1853 	  && (subst = simplify_subreg (GET_MODE (x), new_reg, GET_MODE (inner),
1854 				       SUBREG_BYTE (x))) != NULL_RTX)
1855 	{
1856 	  *loc = subst;
1857 	  return true;
1858 	}
1859 
1860     }
1861   else if (code == REG && (int) REGNO (x) == old_regno)
1862     {
1863       machine_mode mode = GET_MODE (x);
1864       machine_mode inner_mode = GET_MODE (new_reg);
1865 
1866       if (mode != inner_mode
1867 	  && ! (CONST_INT_P (new_reg) && SCALAR_INT_MODE_P (mode)))
1868 	{
1869 	  if (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (inner_mode)
1870 	      || ! SCALAR_INT_MODE_P (inner_mode))
1871 	    new_reg = gen_rtx_SUBREG (mode, new_reg, 0);
1872 	  else
1873 	    new_reg = gen_lowpart_SUBREG (mode, new_reg);
1874 	}
1875       *loc = new_reg;
1876       return true;
1877     }
1878 
1879   /* Scan all the operand sub-expressions.  */
1880   fmt = GET_RTX_FORMAT (code);
1881   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1882     {
1883       if (fmt[i] == 'e')
1884 	{
1885 	  if (lra_substitute_pseudo (&XEXP (x, i), old_regno,
1886 				     new_reg, subreg_p))
1887 	    result = true;
1888 	}
1889       else if (fmt[i] == 'E')
1890 	{
1891 	  for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1892 	    if (lra_substitute_pseudo (&XVECEXP (x, i, j), old_regno,
1893 				       new_reg, subreg_p))
1894 	      result = true;
1895 	}
1896     }
1897   return result;
1898 }
1899 
1900 /* Call lra_substitute_pseudo within an insn.  Try to simplify subreg
1901    of constant if SUBREG_P.  This won't update the insn ptr, just the
1902    contents of the insn.  */
1903 bool
1904 lra_substitute_pseudo_within_insn (rtx_insn *insn, int old_regno,
1905 				   rtx new_reg, bool subreg_p)
1906 {
1907   rtx loc = insn;
1908   return lra_substitute_pseudo (&loc, old_regno, new_reg, subreg_p);
1909 }
1910 
1911 
1912 
1913 /* This page contains code dealing with scratches (changing them onto
1914    pseudos and restoring them from the pseudos).
1915 
1916    We change scratches into pseudos at the beginning of LRA to
1917    simplify dealing with them (conflicts, hard register assignments).
1918 
1919    If the pseudo denoting scratch was spilled it means that we do need
1920    a hard register for it.  Such pseudos are transformed back to
1921    scratches at the end of LRA.	 */
1922 
1923 /* Description of location of a former scratch operand.	 */
1924 struct sloc
1925 {
1926   rtx_insn *insn; /* Insn where the scratch was.  */
1927   int nop;  /* Number of the operand which was a scratch.  */
1928 };
1929 
1930 typedef struct sloc *sloc_t;
1931 
1932 /* Locations of the former scratches.  */
1933 static vec<sloc_t> scratches;
1934 
1935 /* Bitmap of scratch regnos.  */
1936 static bitmap_head scratch_bitmap;
1937 
1938 /* Bitmap of scratch operands.	*/
1939 static bitmap_head scratch_operand_bitmap;
1940 
1941 /* Return true if pseudo REGNO is made of SCRATCH.  */
1942 bool
1943 lra_former_scratch_p (int regno)
1944 {
1945   return bitmap_bit_p (&scratch_bitmap, regno);
1946 }
1947 
1948 /* Return true if the operand NOP of INSN is a former scratch.	*/
1949 bool
1950 lra_former_scratch_operand_p (rtx_insn *insn, int nop)
1951 {
1952   return bitmap_bit_p (&scratch_operand_bitmap,
1953 		       INSN_UID (insn) * MAX_RECOG_OPERANDS + nop) != 0;
1954 }
1955 
1956 /* Register operand NOP in INSN as a former scratch.  It will be
1957    changed to scratch back, if it is necessary, at the LRA end.  */
1958 void
1959 lra_register_new_scratch_op (rtx_insn *insn, int nop)
1960 {
1961   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
1962   rtx op = *id->operand_loc[nop];
1963   sloc_t loc = XNEW (struct sloc);
1964   lra_assert (REG_P (op));
1965   loc->insn = insn;
1966   loc->nop = nop;
1967   scratches.safe_push (loc);
1968   bitmap_set_bit (&scratch_bitmap, REGNO (op));
1969   bitmap_set_bit (&scratch_operand_bitmap,
1970 		  INSN_UID (insn) * MAX_RECOG_OPERANDS + nop);
1971   add_reg_note (insn, REG_UNUSED, op);
1972 }
1973 
1974 /* Change scratches onto pseudos and save their location.  */
1975 static void
1976 remove_scratches (void)
1977 {
1978   int i;
1979   bool insn_changed_p;
1980   basic_block bb;
1981   rtx_insn *insn;
1982   rtx reg;
1983   lra_insn_recog_data_t id;
1984   struct lra_static_insn_data *static_id;
1985 
1986   scratches.create (get_max_uid ());
1987   bitmap_initialize (&scratch_bitmap, &reg_obstack);
1988   bitmap_initialize (&scratch_operand_bitmap, &reg_obstack);
1989   FOR_EACH_BB_FN (bb, cfun)
1990     FOR_BB_INSNS (bb, insn)
1991     if (INSN_P (insn))
1992       {
1993 	id = lra_get_insn_recog_data (insn);
1994 	static_id = id->insn_static_data;
1995 	insn_changed_p = false;
1996 	for (i = 0; i < static_id->n_operands; i++)
1997 	  if (GET_CODE (*id->operand_loc[i]) == SCRATCH
1998 	      && GET_MODE (*id->operand_loc[i]) != VOIDmode)
1999 	    {
2000 	      insn_changed_p = true;
2001 	      *id->operand_loc[i] = reg
2002 		= lra_create_new_reg (static_id->operand[i].mode,
2003 				      *id->operand_loc[i], ALL_REGS, NULL);
2004 	      lra_register_new_scratch_op (insn, i);
2005 	      if (lra_dump_file != NULL)
2006 		fprintf (lra_dump_file,
2007 			 "Removing SCRATCH in insn #%u (nop %d)\n",
2008 			 INSN_UID (insn), i);
2009 	    }
2010 	if (insn_changed_p)
2011 	  /* Because we might use DF right after caller-saves sub-pass
2012 	     we need to keep DF info up to date.  */
2013 	  df_insn_rescan (insn);
2014       }
2015 }
2016 
2017 /* Changes pseudos created by function remove_scratches onto scratches.	 */
2018 static void
2019 restore_scratches (void)
2020 {
2021   int regno;
2022   unsigned i;
2023   sloc_t loc;
2024   rtx_insn *last = NULL;
2025   lra_insn_recog_data_t id = NULL;
2026 
2027   for (i = 0; scratches.iterate (i, &loc); i++)
2028     {
2029       if (last != loc->insn)
2030 	{
2031 	  last = loc->insn;
2032 	  id = lra_get_insn_recog_data (last);
2033 	}
2034       if (REG_P (*id->operand_loc[loc->nop])
2035 	  && ((regno = REGNO (*id->operand_loc[loc->nop]))
2036 	      >= FIRST_PSEUDO_REGISTER)
2037 	  && lra_get_regno_hard_regno (regno) < 0)
2038 	{
2039 	  /* It should be only case when scratch register with chosen
2040 	     constraint 'X' did not get memory or hard register.  */
2041 	  lra_assert (lra_former_scratch_p (regno));
2042 	  *id->operand_loc[loc->nop]
2043 	    = gen_rtx_SCRATCH (GET_MODE (*id->operand_loc[loc->nop]));
2044 	  lra_update_dup (id, loc->nop);
2045 	  if (lra_dump_file != NULL)
2046 	    fprintf (lra_dump_file, "Restoring SCRATCH in insn #%u(nop %d)\n",
2047 		     INSN_UID (loc->insn), loc->nop);
2048 	}
2049     }
2050   for (i = 0; scratches.iterate (i, &loc); i++)
2051     free (loc);
2052   scratches.release ();
2053   bitmap_clear (&scratch_bitmap);
2054   bitmap_clear (&scratch_operand_bitmap);
2055 }
2056 
2057 
2058 
2059 #ifdef ENABLE_CHECKING
2060 
2061 /* Function checks RTL for correctness.	 If FINAL_P is true, it is
2062    done at the end of LRA and the check is more rigorous.  */
2063 static void
2064 check_rtl (bool final_p)
2065 {
2066   basic_block bb;
2067   rtx_insn *insn;
2068 
2069   lra_assert (! final_p || reload_completed);
2070   FOR_EACH_BB_FN (bb, cfun)
2071     FOR_BB_INSNS (bb, insn)
2072     if (NONDEBUG_INSN_P (insn)
2073 	&& GET_CODE (PATTERN (insn)) != USE
2074 	&& GET_CODE (PATTERN (insn)) != CLOBBER
2075 	&& GET_CODE (PATTERN (insn)) != ASM_INPUT)
2076       {
2077 	if (final_p)
2078 	  {
2079 #ifdef ENABLED_CHECKING
2080 	    extract_constrain_insn (insn);
2081 #endif
2082 	    continue;
2083 	  }
2084 	/* LRA code is based on assumption that all addresses can be
2085 	   correctly decomposed.  LRA can generate reloads for
2086 	   decomposable addresses.  The decomposition code checks the
2087 	   correctness of the addresses.  So we don't need to check
2088 	   the addresses here.  Don't call insn_invalid_p here, it can
2089 	   change the code at this stage.  */
2090 	if (recog_memoized (insn) < 0 && asm_noperands (PATTERN (insn)) < 0)
2091 	  fatal_insn_not_found (insn);
2092       }
2093 }
2094 #endif /* #ifdef ENABLE_CHECKING */
2095 
2096 /* Determine if the current function has an exception receiver block
2097    that reaches the exit block via non-exceptional edges  */
2098 static bool
2099 has_nonexceptional_receiver (void)
2100 {
2101   edge e;
2102   edge_iterator ei;
2103   basic_block *tos, *worklist, bb;
2104 
2105   /* If we're not optimizing, then just err on the safe side.  */
2106   if (!optimize)
2107     return true;
2108 
2109   /* First determine which blocks can reach exit via normal paths.  */
2110   tos = worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun) + 1);
2111 
2112   FOR_EACH_BB_FN (bb, cfun)
2113     bb->flags &= ~BB_REACHABLE;
2114 
2115   /* Place the exit block on our worklist.  */
2116   EXIT_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_REACHABLE;
2117   *tos++ = EXIT_BLOCK_PTR_FOR_FN (cfun);
2118 
2119   /* Iterate: find everything reachable from what we've already seen.  */
2120   while (tos != worklist)
2121     {
2122       bb = *--tos;
2123 
2124       FOR_EACH_EDGE (e, ei, bb->preds)
2125 	if (e->flags & EDGE_ABNORMAL)
2126 	  {
2127 	    free (worklist);
2128 	    return true;
2129 	  }
2130 	else
2131 	  {
2132 	    basic_block src = e->src;
2133 
2134 	    if (!(src->flags & BB_REACHABLE))
2135 	      {
2136 		src->flags |= BB_REACHABLE;
2137 		*tos++ = src;
2138 	      }
2139 	  }
2140     }
2141   free (worklist);
2142   /* No exceptional block reached exit unexceptionally.	 */
2143   return false;
2144 }
2145 
2146 #ifdef AUTO_INC_DEC
2147 
2148 /* Process recursively X of INSN and add REG_INC notes if necessary.  */
2149 static void
2150 add_auto_inc_notes (rtx_insn *insn, rtx x)
2151 {
2152   enum rtx_code code = GET_CODE (x);
2153   const char *fmt;
2154   int i, j;
2155 
2156   if (code == MEM && auto_inc_p (XEXP (x, 0)))
2157     {
2158       add_reg_note (insn, REG_INC, XEXP (XEXP (x, 0), 0));
2159       return;
2160     }
2161 
2162   /* Scan all X sub-expressions.  */
2163   fmt = GET_RTX_FORMAT (code);
2164   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2165     {
2166       if (fmt[i] == 'e')
2167 	add_auto_inc_notes (insn, XEXP (x, i));
2168       else if (fmt[i] == 'E')
2169 	for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2170 	  add_auto_inc_notes (insn, XVECEXP (x, i, j));
2171     }
2172 }
2173 
2174 #endif
2175 
2176 /* Remove all REG_DEAD and REG_UNUSED notes and regenerate REG_INC.
2177    We change pseudos by hard registers without notification of DF and
2178    that can make the notes obsolete.  DF-infrastructure does not deal
2179    with REG_INC notes -- so we should regenerate them here.  */
2180 static void
2181 update_inc_notes (void)
2182 {
2183   rtx *pnote;
2184   basic_block bb;
2185   rtx_insn *insn;
2186 
2187   FOR_EACH_BB_FN (bb, cfun)
2188     FOR_BB_INSNS (bb, insn)
2189     if (NONDEBUG_INSN_P (insn))
2190       {
2191 	pnote = &REG_NOTES (insn);
2192 	while (*pnote != 0)
2193 	  {
2194 	    if (REG_NOTE_KIND (*pnote) == REG_DEAD
2195                 || REG_NOTE_KIND (*pnote) == REG_UNUSED
2196                 || REG_NOTE_KIND (*pnote) == REG_INC)
2197 	      *pnote = XEXP (*pnote, 1);
2198 	    else
2199 	      pnote = &XEXP (*pnote, 1);
2200 	  }
2201 #ifdef AUTO_INC_DEC
2202 	add_auto_inc_notes (insn, PATTERN (insn));
2203 #endif
2204       }
2205 }
2206 
2207 /* Set to 1 while in lra.  */
2208 int lra_in_progress;
2209 
2210 /* Start of pseudo regnos before the LRA.  */
2211 int lra_new_regno_start;
2212 
2213 /* Start of reload pseudo regnos before the new spill pass.  */
2214 int lra_constraint_new_regno_start;
2215 
2216 /* Avoid spilling pseudos with regno more than the following value if
2217    it is possible.  */
2218 int lra_bad_spill_regno_start;
2219 
2220 /* Inheritance pseudo regnos before the new spill pass.	 */
2221 bitmap_head lra_inheritance_pseudos;
2222 
2223 /* Split regnos before the new spill pass.  */
2224 bitmap_head lra_split_regs;
2225 
2226 /* Reload pseudo regnos before the new assignmnet pass which still can
2227    be spilled after the assinment pass as memory is also accepted in
2228    insns for the reload pseudos.  */
2229 bitmap_head lra_optional_reload_pseudos;
2230 
2231 /* Pseudo regnos used for subreg reloads before the new assignment
2232    pass.  Such pseudos still can be spilled after the assinment
2233    pass.  */
2234 bitmap_head lra_subreg_reload_pseudos;
2235 
2236 /* File used for output of LRA debug information.  */
2237 FILE *lra_dump_file;
2238 
2239 /* True if we should try spill into registers of different classes
2240    instead of memory.  */
2241 bool lra_reg_spill_p;
2242 
2243 /* Set up value LRA_REG_SPILL_P.  */
2244 static void
2245 setup_reg_spill_flag (void)
2246 {
2247   int cl, mode;
2248 
2249   if (targetm.spill_class != NULL)
2250     for (cl = 0; cl < (int) LIM_REG_CLASSES; cl++)
2251       for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
2252 	if (targetm.spill_class ((enum reg_class) cl,
2253 				 (machine_mode) mode) != NO_REGS)
2254 	  {
2255 	    lra_reg_spill_p = true;
2256 	    return;
2257 	  }
2258   lra_reg_spill_p = false;
2259 }
2260 
2261 /* True if the current function is too big to use regular algorithms
2262    in LRA. In other words, we should use simpler and faster algorithms
2263    in LRA.  It also means we should not worry about generation code
2264    for caller saves.  The value is set up in IRA.  */
2265 bool lra_simple_p;
2266 
2267 /* Major LRA entry function.  F is a file should be used to dump LRA
2268    debug info.  */
2269 void
2270 lra (FILE *f)
2271 {
2272   int i;
2273   bool live_p, scratch_p, inserted_p;
2274 
2275   lra_dump_file = f;
2276 
2277   timevar_push (TV_LRA);
2278 
2279   /* Make sure that the last insn is a note.  Some subsequent passes
2280      need it.  */
2281   emit_note (NOTE_INSN_DELETED);
2282 
2283   COPY_HARD_REG_SET (lra_no_alloc_regs, ira_no_alloc_regs);
2284 
2285   init_reg_info ();
2286   expand_reg_info ();
2287 
2288   init_insn_recog_data ();
2289 
2290 #ifdef ENABLE_CHECKING
2291   /* Some quick check on RTL generated by previous passes.  */
2292   check_rtl (false);
2293 #endif
2294 
2295   lra_in_progress = 1;
2296 
2297   lra_live_range_iter = lra_coalesce_iter = lra_constraint_iter = 0;
2298   lra_assignment_iter = lra_assignment_iter_after_spill = 0;
2299   lra_inheritance_iter = lra_undo_inheritance_iter = 0;
2300   lra_rematerialization_iter = 0;
2301 
2302   setup_reg_spill_flag ();
2303 
2304   /* Function remove_scratches can creates new pseudos for clobbers --
2305      so set up lra_constraint_new_regno_start before its call to
2306      permit changing reg classes for pseudos created by this
2307      simplification.  */
2308   lra_constraint_new_regno_start = lra_new_regno_start = max_reg_num ();
2309   lra_bad_spill_regno_start = INT_MAX;
2310   remove_scratches ();
2311   scratch_p = lra_constraint_new_regno_start != max_reg_num ();
2312 
2313   /* A function that has a non-local label that can reach the exit
2314      block via non-exceptional paths must save all call-saved
2315      registers.	 */
2316   if (cfun->has_nonlocal_label && has_nonexceptional_receiver ())
2317     crtl->saves_all_registers = 1;
2318 
2319   if (crtl->saves_all_registers)
2320     for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2321       if (! call_used_regs[i] && ! fixed_regs[i] && ! LOCAL_REGNO (i))
2322 	df_set_regs_ever_live (i, true);
2323 
2324   /* We don't DF from now and avoid its using because it is to
2325      expensive when a lot of RTL changes are made.  */
2326   df_set_flags (DF_NO_INSN_RESCAN);
2327   lra_constraint_insn_stack.create (get_max_uid ());
2328   lra_constraint_insn_stack_bitmap = sbitmap_alloc (get_max_uid ());
2329   bitmap_clear (lra_constraint_insn_stack_bitmap);
2330   lra_live_ranges_init ();
2331   lra_constraints_init ();
2332   lra_curr_reload_num = 0;
2333   push_insns (get_last_insn (), NULL);
2334   /* It is needed for the 1st coalescing.  */
2335   bitmap_initialize (&lra_inheritance_pseudos, &reg_obstack);
2336   bitmap_initialize (&lra_split_regs, &reg_obstack);
2337   bitmap_initialize (&lra_optional_reload_pseudos, &reg_obstack);
2338   bitmap_initialize (&lra_subreg_reload_pseudos, &reg_obstack);
2339   live_p = false;
2340   if (get_frame_size () != 0 && crtl->stack_alignment_needed)
2341     /* If we have a stack frame, we must align it now.  The stack size
2342        may be a part of the offset computation for register
2343        elimination.  */
2344     assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
2345   lra_init_equiv ();
2346   for (;;)
2347     {
2348       for (;;)
2349 	{
2350 	  /* We should try to assign hard registers to scratches even
2351 	     if there were no RTL transformations in
2352 	     lra_constraints.  */
2353 	  if (! lra_constraints (lra_constraint_iter == 0)
2354 	      && (lra_constraint_iter > 1
2355 		  || (! scratch_p && ! caller_save_needed)))
2356 	    break;
2357 	  /* Constraint transformations may result in that eliminable
2358 	     hard regs become uneliminable and pseudos which use them
2359 	     should be spilled.	 It is better to do it before pseudo
2360 	     assignments.
2361 
2362 	     For example, rs6000 can make
2363 	     RS6000_PIC_OFFSET_TABLE_REGNUM uneliminable if we started
2364 	     to use a constant pool.  */
2365 	  lra_eliminate (false, false);
2366 	  /* Do inheritance only for regular algorithms.  */
2367 	  if (! lra_simple_p)
2368 	    {
2369 	      if (flag_ipa_ra)
2370 		{
2371 		  if (live_p)
2372 		    lra_clear_live_ranges ();
2373 		  /* As a side-effect of lra_create_live_ranges, we calculate
2374 		     actual_call_used_reg_set,  which is needed during
2375 		     lra_inheritance.  */
2376 		  lra_create_live_ranges (true, true);
2377 		  live_p = true;
2378 		}
2379 	      lra_inheritance ();
2380 	    }
2381 	  if (live_p)
2382 	    lra_clear_live_ranges ();
2383 	  /* We need live ranges for lra_assign -- so build them.  But
2384 	     don't remove dead insns or change global live info as we
2385 	     can undo inheritance transformations after inheritance
2386 	     pseudo assigning.  */
2387 	  lra_create_live_ranges (true, false);
2388 	  live_p = true;
2389 	  /* If we don't spill non-reload and non-inheritance pseudos,
2390 	     there is no sense to run memory-memory move coalescing.
2391 	     If inheritance pseudos were spilled, the memory-memory
2392 	     moves involving them will be removed by pass undoing
2393 	     inheritance.  */
2394 	  if (lra_simple_p)
2395 	    lra_assign ();
2396 	  else
2397 	    {
2398 	      bool spill_p = !lra_assign ();
2399 
2400 	      if (lra_undo_inheritance ())
2401 		live_p = false;
2402 	      if (spill_p)
2403 		{
2404 		  if (! live_p)
2405 		    {
2406 		      lra_create_live_ranges (true, true);
2407 		      live_p = true;
2408 		    }
2409 		  if (lra_coalesce ())
2410 		    live_p = false;
2411 		}
2412 	      if (! live_p)
2413 		lra_clear_live_ranges ();
2414 	    }
2415 	}
2416       /* Don't clear optional reloads bitmap until all constraints are
2417 	 satisfied as we need to differ them from regular reloads.  */
2418       bitmap_clear (&lra_optional_reload_pseudos);
2419       bitmap_clear (&lra_subreg_reload_pseudos);
2420       bitmap_clear (&lra_inheritance_pseudos);
2421       bitmap_clear (&lra_split_regs);
2422       if (! live_p)
2423 	{
2424 	  /* We need full live info for spilling pseudos into
2425 	     registers instead of memory.  */
2426 	  lra_create_live_ranges (lra_reg_spill_p, true);
2427 	  live_p = true;
2428 	}
2429       /* We should check necessity for spilling here as the above live
2430 	 range pass can remove spilled pseudos.  */
2431       if (! lra_need_for_spills_p ())
2432 	break;
2433       /* Now we know what pseudos should be spilled.  Try to
2434 	 rematerialize them first.  */
2435       if (lra_remat ())
2436 	{
2437 	  /* We need full live info -- see the comment above.  */
2438 	  lra_create_live_ranges (lra_reg_spill_p, true);
2439 	  live_p = true;
2440 	  if (! lra_need_for_spills_p ())
2441 	    break;
2442 	}
2443       lra_spill ();
2444       /* Assignment of stack slots changes elimination offsets for
2445 	 some eliminations.  So update the offsets here.  */
2446       lra_eliminate (false, false);
2447       lra_constraint_new_regno_start = max_reg_num ();
2448       if (lra_bad_spill_regno_start == INT_MAX
2449 	  && lra_inheritance_iter > LRA_MAX_INHERITANCE_PASSES
2450 	  && lra_rematerialization_iter > LRA_MAX_REMATERIALIZATION_PASSES)
2451 	/* After switching off inheritance and rematerialization
2452 	   passes, avoid spilling reload pseudos will be created to
2453 	   prevent LRA cycling in some complicated cases.  */
2454 	lra_bad_spill_regno_start = lra_constraint_new_regno_start;
2455       lra_assignment_iter_after_spill = 0;
2456     }
2457   restore_scratches ();
2458   lra_eliminate (true, false);
2459   lra_final_code_change ();
2460   lra_in_progress = 0;
2461   if (live_p)
2462     lra_clear_live_ranges ();
2463   lra_live_ranges_finish ();
2464   lra_constraints_finish ();
2465   finish_reg_info ();
2466   sbitmap_free (lra_constraint_insn_stack_bitmap);
2467   lra_constraint_insn_stack.release ();
2468   finish_insn_recog_data ();
2469   regstat_free_n_sets_and_refs ();
2470   regstat_free_ri ();
2471   reload_completed = 1;
2472   update_inc_notes ();
2473 
2474   inserted_p = fixup_abnormal_edges ();
2475 
2476   /* We've possibly turned single trapping insn into multiple ones.  */
2477   if (cfun->can_throw_non_call_exceptions)
2478     {
2479       sbitmap blocks;
2480       blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
2481       bitmap_ones (blocks);
2482       find_many_sub_basic_blocks (blocks);
2483       sbitmap_free (blocks);
2484     }
2485 
2486   if (inserted_p)
2487     commit_edge_insertions ();
2488 
2489   /* Replacing pseudos with their memory equivalents might have
2490      created shared rtx.  Subsequent passes would get confused
2491      by this, so unshare everything here.  */
2492   unshare_all_rtl_again (get_insns ());
2493 
2494 #ifdef ENABLE_CHECKING
2495   check_rtl (true);
2496 #endif
2497 
2498   timevar_pop (TV_LRA);
2499 }
2500 
2501 /* Called once per compiler to initialize LRA data once.  */
2502 void
2503 lra_init_once (void)
2504 {
2505   init_insn_code_data_once ();
2506 }
2507 
2508 /* Called once per compiler to finish LRA data which are initialize
2509    once.  */
2510 void
2511 lra_finish_once (void)
2512 {
2513   finish_insn_code_data_once ();
2514 }
2515