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