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