libstdc++: Refactor loops in std::__platform_semaphore
[official-gcc.git] / gcc / lra.cc
blobb84384b21454959f7c83a6dc207dcafb533a0951
1 /* LRA (local register allocator) driver and LRA utilities.
2 Copyright (C) 2010-2024 Free Software Foundation, Inc.
3 Contributed by Vladimir Makarov <vmakarov@redhat.com>.
5 This file is part of GCC.
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.
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.
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/>. */
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.
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)
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.
45 Here is block diagram of LRA passes:
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
75 -------------------------
76 | Hard regs substitution, |
77 | devirtalization, and |------> Finish
78 | restoring scratches got |
79 | memory |
80 -------------------------
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).
100 This file contains LRA driver, LRA utility functions and data, and
101 code for dealing with scratches. */
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 "rtl-error.h"
110 #include "tree.h"
111 #include "predict.h"
112 #include "df.h"
113 #include "memmodel.h"
114 #include "tm_p.h"
115 #include "optabs.h"
116 #include "regs.h"
117 #include "ira.h"
118 #include "recog.h"
119 #include "expr.h"
120 #include "cfgrtl.h"
121 #include "cfgbuild.h"
122 #include "lra.h"
123 #include "lra-int.h"
124 #include "print-rtl.h"
125 #include "function-abi.h"
127 /* Dump bitmap SET with TITLE and BB INDEX. */
128 void
129 lra_dump_bitmap_with_title (const char *title, bitmap set, int index)
131 unsigned int i;
132 int count;
133 bitmap_iterator bi;
134 static const int max_nums_on_line = 10;
136 if (bitmap_empty_p (set))
137 return;
138 fprintf (lra_dump_file, " %s %d:", title, index);
139 fprintf (lra_dump_file, "\n");
140 count = max_nums_on_line + 1;
141 EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi)
143 if (count > max_nums_on_line)
145 fprintf (lra_dump_file, "\n ");
146 count = 0;
148 fprintf (lra_dump_file, " %4u", i);
149 count++;
151 fprintf (lra_dump_file, "\n");
154 /* Hard registers currently not available for allocation. It can
155 changed after some hard registers become not eliminable. */
156 HARD_REG_SET lra_no_alloc_regs;
158 static int get_new_reg_value (void);
159 static void expand_reg_info (void);
160 static void invalidate_insn_recog_data (int);
161 static int get_insn_freq (rtx_insn *);
162 static void invalidate_insn_data_regno_info (lra_insn_recog_data_t,
163 rtx_insn *, int);
164 /* Expand all regno related info needed for LRA. */
165 static void
166 expand_reg_data (int old)
168 resize_reg_info ();
169 expand_reg_info ();
170 ira_expand_reg_equiv ();
171 for (int i = (int) max_reg_num () - 1; i >= old; i--)
172 lra_change_class (i, ALL_REGS, " Set", true);
175 /* Create and return a new reg of ORIGINAL mode. If ORIGINAL is NULL
176 or of VOIDmode, use MD_MODE for the new reg. Initialize its
177 register class to RCLASS. Print message about assigning class
178 RCLASS containing new register name TITLE unless it is NULL. Use
179 attributes of ORIGINAL if it is a register. The created register
180 will have unique held value. */
182 lra_create_new_reg_with_unique_value (machine_mode md_mode, rtx original,
183 enum reg_class rclass,
184 HARD_REG_SET *exclude_start_hard_regs,
185 const char *title)
187 machine_mode mode;
188 rtx new_reg;
190 if (original == NULL_RTX || (mode = GET_MODE (original)) == VOIDmode)
191 mode = md_mode;
192 lra_assert (mode != VOIDmode);
193 new_reg = gen_reg_rtx (mode);
194 if (original == NULL_RTX || ! REG_P (original))
196 if (lra_dump_file != NULL)
197 fprintf (lra_dump_file, " Creating newreg=%i", REGNO (new_reg));
199 else
201 if (ORIGINAL_REGNO (original) >= FIRST_PSEUDO_REGISTER)
202 ORIGINAL_REGNO (new_reg) = ORIGINAL_REGNO (original);
203 REG_USERVAR_P (new_reg) = REG_USERVAR_P (original);
204 REG_POINTER (new_reg) = REG_POINTER (original);
205 REG_ATTRS (new_reg) = REG_ATTRS (original);
206 if (lra_dump_file != NULL)
207 fprintf (lra_dump_file, " Creating newreg=%i from oldreg=%i",
208 REGNO (new_reg), REGNO (original));
210 if (lra_dump_file != NULL)
212 if (title != NULL)
213 fprintf (lra_dump_file, ", assigning class %s to%s%s r%d",
214 reg_class_names[rclass], *title == '\0' ? "" : " ",
215 title, REGNO (new_reg));
216 fprintf (lra_dump_file, "\n");
218 expand_reg_data (max_reg_num ());
219 setup_reg_classes (REGNO (new_reg), rclass, NO_REGS, rclass);
220 if (exclude_start_hard_regs != NULL)
221 lra_reg_info[REGNO (new_reg)].exclude_start_hard_regs
222 = *exclude_start_hard_regs;
223 return new_reg;
226 /* Analogous to the previous function but also inherits value of
227 ORIGINAL. */
229 lra_create_new_reg (machine_mode md_mode, rtx original, enum reg_class rclass,
230 HARD_REG_SET *exclude_start_hard_regs, const char *title)
232 rtx new_reg;
234 new_reg
235 = lra_create_new_reg_with_unique_value (md_mode, original, rclass,
236 exclude_start_hard_regs, title);
237 if (original != NULL_RTX && REG_P (original))
238 lra_assign_reg_val (REGNO (original), REGNO (new_reg));
239 return new_reg;
242 /* Set up for REGNO unique hold value. */
243 void
244 lra_set_regno_unique_value (int regno)
246 lra_reg_info[regno].val = get_new_reg_value ();
249 /* Invalidate INSN related info used by LRA. The info should never be
250 used after that. */
251 void
252 lra_invalidate_insn_data (rtx_insn *insn)
254 lra_invalidate_insn_regno_info (insn);
255 invalidate_insn_recog_data (INSN_UID (insn));
258 /* Mark INSN deleted and invalidate the insn related info used by
259 LRA. */
260 void
261 lra_set_insn_deleted (rtx_insn *insn)
263 lra_invalidate_insn_data (insn);
264 SET_INSN_DELETED (insn);
267 /* Delete an unneeded INSN and any previous insns who sole purpose is
268 loading data that is dead in INSN. */
269 void
270 lra_delete_dead_insn (rtx_insn *insn)
272 rtx_insn *prev = prev_real_insn (insn);
273 rtx prev_dest;
275 /* If the previous insn sets a register that dies in our insn,
276 delete it too. */
277 if (prev && GET_CODE (PATTERN (prev)) == SET
278 && (prev_dest = SET_DEST (PATTERN (prev)), REG_P (prev_dest))
279 && reg_mentioned_p (prev_dest, PATTERN (insn))
280 && find_regno_note (insn, REG_DEAD, REGNO (prev_dest))
281 && ! side_effects_p (SET_SRC (PATTERN (prev))))
282 lra_delete_dead_insn (prev);
284 lra_set_insn_deleted (insn);
287 /* Emit insn x = y + z. Return NULL if we failed to do it.
288 Otherwise, return the insn. We don't use gen_add3_insn as it might
289 clobber CC. */
290 static rtx_insn *
291 emit_add3_insn (rtx x, rtx y, rtx z)
293 rtx_insn *last;
295 last = get_last_insn ();
297 if (have_addptr3_insn (x, y, z))
299 rtx_insn *insn = gen_addptr3_insn (x, y, z);
301 /* If the target provides an "addptr" pattern it hopefully does
302 for a reason. So falling back to the normal add would be
303 a bug. */
304 lra_assert (insn != NULL_RTX);
305 emit_insn (insn);
306 return insn;
309 rtx_insn *insn = emit_insn (gen_rtx_SET (x, gen_rtx_PLUS (GET_MODE (y),
310 y, z)));
311 if (recog_memoized (insn) < 0)
313 delete_insns_since (last);
314 insn = NULL;
316 return insn;
319 /* Emit insn x = x + y. Return the insn. We use gen_add2_insn as the
320 last resort. */
321 static rtx_insn *
322 emit_add2_insn (rtx x, rtx y)
324 rtx_insn *insn = emit_add3_insn (x, x, y);
325 if (insn == NULL_RTX)
327 insn = gen_add2_insn (x, y);
328 if (insn != NULL_RTX)
329 emit_insn (insn);
331 return insn;
334 /* Target checks operands through operand predicates to recognize an
335 insn. We should have a special precaution to generate add insns
336 which are frequent results of elimination.
338 Emit insns for x = y + z. X can be used to store intermediate
339 values and should be not in Y and Z when we use X to store an
340 intermediate value. Y + Z should form [base] [+ index[ * scale]] [
341 + disp] where base and index are registers, disp and scale are
342 constants. Y should contain base if it is present, Z should
343 contain disp if any. index[*scale] can be part of Y or Z. */
344 void
345 lra_emit_add (rtx x, rtx y, rtx z)
347 int old;
348 rtx_insn *last;
349 rtx a1, a2, base, index, disp, scale, index_scale;
350 bool ok_p;
352 rtx_insn *add3_insn = emit_add3_insn (x, y, z);
353 old = max_reg_num ();
354 if (add3_insn != NULL)
356 else
358 disp = a2 = NULL_RTX;
359 if (GET_CODE (y) == PLUS)
361 a1 = XEXP (y, 0);
362 a2 = XEXP (y, 1);
363 disp = z;
365 else
367 a1 = y;
368 if (CONSTANT_P (z))
369 disp = z;
370 else
371 a2 = z;
373 index_scale = scale = NULL_RTX;
374 if (GET_CODE (a1) == MULT)
376 index_scale = a1;
377 index = XEXP (a1, 0);
378 scale = XEXP (a1, 1);
379 base = a2;
381 else if (a2 != NULL_RTX && GET_CODE (a2) == MULT)
383 index_scale = a2;
384 index = XEXP (a2, 0);
385 scale = XEXP (a2, 1);
386 base = a1;
388 else
390 base = a1;
391 index = a2;
393 if ((base != NULL_RTX && ! (REG_P (base) || GET_CODE (base) == SUBREG))
394 || (index != NULL_RTX
395 && ! (REG_P (index) || GET_CODE (index) == SUBREG))
396 || (disp != NULL_RTX && ! CONSTANT_P (disp))
397 || (scale != NULL_RTX && ! CONSTANT_P (scale)))
399 /* Probably we have no 3 op add. Last chance is to use 2-op
400 add insn. To succeed, don't move Z to X as an address
401 segment always comes in Y. Otherwise, we might fail when
402 adding the address segment to register. */
403 lra_assert (x != y && x != z);
404 emit_move_insn (x, y);
405 rtx_insn *insn = emit_add2_insn (x, z);
406 lra_assert (insn != NULL_RTX);
408 else
410 if (index_scale == NULL_RTX)
411 index_scale = index;
412 if (disp == NULL_RTX)
414 /* Generate x = index_scale; x = x + base. */
415 lra_assert (index_scale != NULL_RTX && base != NULL_RTX);
416 emit_move_insn (x, index_scale);
417 rtx_insn *insn = emit_add2_insn (x, base);
418 lra_assert (insn != NULL_RTX);
420 else if (scale == NULL_RTX)
422 /* Try x = base + disp. */
423 lra_assert (base != NULL_RTX);
424 last = get_last_insn ();
425 rtx_insn *move_insn =
426 emit_move_insn (x, gen_rtx_PLUS (GET_MODE (base), base, disp));
427 if (recog_memoized (move_insn) < 0)
429 delete_insns_since (last);
430 /* Generate x = disp; x = x + base. */
431 emit_move_insn (x, disp);
432 rtx_insn *add2_insn = emit_add2_insn (x, base);
433 lra_assert (add2_insn != NULL_RTX);
435 /* Generate x = x + index. */
436 if (index != NULL_RTX)
438 rtx_insn *insn = emit_add2_insn (x, index);
439 lra_assert (insn != NULL_RTX);
442 else
444 /* Try x = index_scale; x = x + disp; x = x + base. */
445 last = get_last_insn ();
446 rtx_insn *move_insn = emit_move_insn (x, index_scale);
447 ok_p = false;
448 if (recog_memoized (move_insn) >= 0)
450 rtx_insn *insn = emit_add2_insn (x, disp);
451 if (insn != NULL_RTX)
453 if (base == NULL_RTX)
454 ok_p = true;
455 else
457 insn = emit_add2_insn (x, base);
458 if (insn != NULL_RTX)
459 ok_p = true;
463 if (! ok_p)
465 rtx_insn *insn;
467 delete_insns_since (last);
468 /* Generate x = disp; x = x + base; x = x + index_scale. */
469 emit_move_insn (x, disp);
470 if (base != NULL_RTX)
472 insn = emit_add2_insn (x, base);
473 lra_assert (insn != NULL_RTX);
475 insn = emit_add2_insn (x, index_scale);
476 lra_assert (insn != NULL_RTX);
481 /* Functions emit_... can create pseudos -- so expand the pseudo
482 data. */
483 if (old != max_reg_num ())
484 expand_reg_data (old);
487 /* The number of emitted reload insns so far. */
488 int lra_curr_reload_num;
490 static void remove_insn_scratches (rtx_insn *insn);
492 /* Emit x := y, processing special case when y = u + v or y = u + v *
493 scale + w through emit_add (Y can be an address which is base +
494 index reg * scale + displacement in general case). X may be used
495 as intermediate result therefore it should be not in Y. */
496 void
497 lra_emit_move (rtx x, rtx y)
499 int old;
500 rtx_insn *insn;
502 if (GET_CODE (y) != PLUS)
504 if (rtx_equal_p (x, y))
505 return;
506 old = max_reg_num ();
508 insn = (GET_CODE (x) != STRICT_LOW_PART
509 ? emit_move_insn (x, y) : emit_insn (gen_rtx_SET (x, y)));
510 /* The move pattern may require scratch registers, so convert them
511 into real registers now. */
512 if (insn != NULL_RTX)
513 remove_insn_scratches (insn);
514 if (REG_P (x))
515 lra_reg_info[ORIGINAL_REGNO (x)].last_reload = ++lra_curr_reload_num;
516 /* Function emit_move can create pseudos -- so expand the pseudo
517 data. */
518 if (old != max_reg_num ())
519 expand_reg_data (old);
520 return;
522 lra_emit_add (x, XEXP (y, 0), XEXP (y, 1));
525 /* Update insn operands which are duplication of operands whose
526 numbers are in array of NOPS (with end marker -1). The insn is
527 represented by its LRA internal representation ID. */
528 void
529 lra_update_dups (lra_insn_recog_data_t id, signed char *nops)
531 int i, j, nop;
532 struct lra_static_insn_data *static_id = id->insn_static_data;
534 for (i = 0; i < static_id->n_dups; i++)
535 for (j = 0; (nop = nops[j]) >= 0; j++)
536 if (static_id->dup_num[i] == nop)
537 *id->dup_loc[i] = *id->operand_loc[nop];
540 /* Report asm insn error and modify the asm insn. */
541 void
542 lra_asm_insn_error (rtx_insn *insn)
544 lra_asm_error_p = true;
545 error_for_asm (insn,
546 "%<asm%> operand has impossible constraints"
547 " or there are not enough registers");
548 /* Avoid further trouble with this insn. */
549 if (JUMP_P (insn))
551 ira_nullify_asm_goto (insn);
552 lra_update_insn_regno_info (insn);
554 else
556 PATTERN (insn) = gen_rtx_USE (VOIDmode, const0_rtx);
557 lra_set_insn_deleted (insn);
563 /* This page contains code dealing with info about registers in the
564 insns. */
566 /* Pools for insn reg info. */
567 object_allocator<lra_insn_reg> lra_insn_reg_pool ("insn regs");
569 /* Create LRA insn related info about a reference to REGNO in INSN
570 with TYPE (in/out/inout), biggest reference mode MODE, flag that it
571 is reference through subreg (SUBREG_P), and reference to the next
572 insn reg info (NEXT). If REGNO can be early clobbered,
573 alternatives in which it can be early clobbered are given by
574 EARLY_CLOBBER_ALTS. */
575 static struct lra_insn_reg *
576 new_insn_reg (rtx_insn *insn, int regno, enum op_type type,
577 machine_mode mode, bool subreg_p,
578 alternative_mask early_clobber_alts,
579 struct lra_insn_reg *next)
581 lra_insn_reg *ir = lra_insn_reg_pool.allocate ();
582 ir->type = type;
583 ir->biggest_mode = mode;
584 if (NONDEBUG_INSN_P (insn))
585 lra_update_biggest_mode (regno, mode);
586 ir->subreg_p = subreg_p;
587 ir->early_clobber_alts = early_clobber_alts;
588 ir->regno = regno;
589 ir->next = next;
590 return ir;
593 /* Free insn reg info list IR. */
594 static void
595 free_insn_regs (struct lra_insn_reg *ir)
597 struct lra_insn_reg *next_ir;
599 for (; ir != NULL; ir = next_ir)
601 next_ir = ir->next;
602 lra_insn_reg_pool.remove (ir);
606 /* Finish pool for insn reg info. */
607 static void
608 finish_insn_regs (void)
610 lra_insn_reg_pool.release ();
615 /* This page contains code dealing LRA insn info (or in other words
616 LRA internal insn representation). */
618 /* Map INSN_CODE -> the static insn data. This info is valid during
619 all translation unit. */
620 struct lra_static_insn_data *insn_code_data[NUM_INSN_CODES];
622 /* Debug insns are represented as a special insn with one input
623 operand which is RTL expression in var_location. */
625 /* The following data are used as static insn operand data for all
626 debug insns. If structure lra_operand_data is changed, the
627 initializer should be changed too. */
628 static struct lra_operand_data debug_operand_data =
630 NULL, /* alternative */
631 0, /* early_clobber_alts */
632 E_VOIDmode, /* We are not interesting in the operand mode. */
633 OP_IN,
634 0, 0, 0
637 /* The following data are used as static insn data for all debug
638 bind insns. If structure lra_static_insn_data is changed, the
639 initializer should be changed too. */
640 static struct lra_static_insn_data debug_bind_static_data =
642 &debug_operand_data,
643 0, /* Duplication operands #. */
644 -1, /* Commutative operand #. */
645 1, /* Operands #. There is only one operand which is debug RTL
646 expression. */
647 0, /* Duplications #. */
648 0, /* Alternatives #. We are not interesting in alternatives
649 because we does not proceed debug_insns for reloads. */
650 NULL, /* Hard registers referenced in machine description. */
651 NULL /* Descriptions of operands in alternatives. */
654 /* The following data are used as static insn data for all debug
655 marker insns. If structure lra_static_insn_data is changed, the
656 initializer should be changed too. */
657 static struct lra_static_insn_data debug_marker_static_data =
659 &debug_operand_data,
660 0, /* Duplication operands #. */
661 -1, /* Commutative operand #. */
662 0, /* Operands #. There isn't any operand. */
663 0, /* Duplications #. */
664 0, /* Alternatives #. We are not interesting in alternatives
665 because we does not proceed debug_insns for reloads. */
666 NULL, /* Hard registers referenced in machine description. */
667 NULL /* Descriptions of operands in alternatives. */
670 /* Called once per compiler work to initialize some LRA data related
671 to insns. */
672 static void
673 init_insn_code_data_once (void)
675 memset (insn_code_data, 0, sizeof (insn_code_data));
678 /* Called once per compiler work to finalize some LRA data related to
679 insns. */
680 static void
681 finish_insn_code_data_once (void)
683 for (unsigned int i = 0; i < NUM_INSN_CODES; i++)
685 if (insn_code_data[i] != NULL)
687 free (insn_code_data[i]);
688 insn_code_data[i] = NULL;
693 /* Return static insn data, allocate and setup if necessary. Although
694 dup_num is static data (it depends only on icode), to set it up we
695 need to extract insn first. So recog_data should be valid for
696 normal insn (ICODE >= 0) before the call. */
697 static struct lra_static_insn_data *
698 get_static_insn_data (int icode, int nop, int ndup, int nalt)
700 struct lra_static_insn_data *data;
701 size_t n_bytes;
703 lra_assert (icode < (int) NUM_INSN_CODES);
704 if (icode >= 0 && (data = insn_code_data[icode]) != NULL)
705 return data;
706 lra_assert (nop >= 0 && ndup >= 0 && nalt >= 0);
707 n_bytes = sizeof (struct lra_static_insn_data)
708 + sizeof (struct lra_operand_data) * nop
709 + sizeof (int) * ndup;
710 data = XNEWVAR (struct lra_static_insn_data, n_bytes);
711 data->operand_alternative = NULL;
712 data->n_operands = nop;
713 data->n_dups = ndup;
714 data->n_alternatives = nalt;
715 data->operand = ((struct lra_operand_data *)
716 ((char *) data + sizeof (struct lra_static_insn_data)));
717 data->dup_num = ((int *) ((char *) data->operand
718 + sizeof (struct lra_operand_data) * nop));
719 if (icode >= 0)
721 int i;
723 insn_code_data[icode] = data;
724 for (i = 0; i < nop; i++)
726 data->operand[i].constraint
727 = insn_data[icode].operand[i].constraint;
728 data->operand[i].mode = insn_data[icode].operand[i].mode;
729 data->operand[i].strict_low = insn_data[icode].operand[i].strict_low;
730 data->operand[i].is_operator
731 = insn_data[icode].operand[i].is_operator;
732 data->operand[i].type
733 = (data->operand[i].constraint[0] == '=' ? OP_OUT
734 : data->operand[i].constraint[0] == '+' ? OP_INOUT
735 : OP_IN);
736 data->operand[i].is_address = false;
738 for (i = 0; i < ndup; i++)
739 data->dup_num[i] = recog_data.dup_num[i];
741 return data;
744 /* The current length of the following array. */
745 int lra_insn_recog_data_len;
747 /* Map INSN_UID -> the insn recog data (NULL if unknown). */
748 lra_insn_recog_data_t *lra_insn_recog_data;
750 /* Alloc pool we allocate entries for lra_insn_recog_data from. */
751 static object_allocator<class lra_insn_recog_data>
752 lra_insn_recog_data_pool ("insn recog data pool");
754 /* Initialize LRA data about insns. */
755 static void
756 init_insn_recog_data (void)
758 lra_insn_recog_data_len = 0;
759 lra_insn_recog_data = NULL;
762 /* Expand, if necessary, LRA data about insns. */
763 static void
764 check_and_expand_insn_recog_data (int index)
766 int i, old;
768 if (lra_insn_recog_data_len > index)
769 return;
770 old = lra_insn_recog_data_len;
771 lra_insn_recog_data_len = index * 3U / 2;
772 if (lra_insn_recog_data_len <= index)
773 lra_insn_recog_data_len = index + 1;
774 lra_insn_recog_data = XRESIZEVEC (lra_insn_recog_data_t,
775 lra_insn_recog_data,
776 lra_insn_recog_data_len);
777 for (i = old; i < lra_insn_recog_data_len; i++)
778 lra_insn_recog_data[i] = NULL;
781 /* Finish LRA DATA about insn. */
782 static void
783 free_insn_recog_data (lra_insn_recog_data_t data)
785 if (data->operand_loc != NULL)
786 free (data->operand_loc);
787 if (data->dup_loc != NULL)
788 free (data->dup_loc);
789 if (data->arg_hard_regs != NULL)
790 free (data->arg_hard_regs);
791 if (data->icode < 0 && NONDEBUG_INSN_P (data->insn))
793 if (data->insn_static_data->operand_alternative != NULL)
794 free (const_cast <operand_alternative *>
795 (data->insn_static_data->operand_alternative));
796 free_insn_regs (data->insn_static_data->hard_regs);
797 free (data->insn_static_data);
799 free_insn_regs (data->regs);
800 data->regs = NULL;
801 lra_insn_recog_data_pool.remove (data);
804 /* Pools for copies. */
805 static object_allocator<lra_copy> lra_copy_pool ("lra copies");
807 /* Finish LRA data about all insns. */
808 static void
809 finish_insn_recog_data (void)
811 int i;
812 lra_insn_recog_data_t data;
814 for (i = 0; i < lra_insn_recog_data_len; i++)
815 if ((data = lra_insn_recog_data[i]) != NULL)
816 free_insn_recog_data (data);
817 finish_insn_regs ();
818 lra_copy_pool.release ();
819 lra_insn_reg_pool.release ();
820 lra_insn_recog_data_pool.release ();
821 free (lra_insn_recog_data);
824 /* Setup info about operands in alternatives of LRA DATA of insn. */
825 static void
826 setup_operand_alternative (lra_insn_recog_data_t data,
827 const operand_alternative *op_alt)
829 int i, j, nop, nalt;
830 int icode = data->icode;
831 struct lra_static_insn_data *static_data = data->insn_static_data;
833 static_data->commutative = -1;
834 nop = static_data->n_operands;
835 nalt = static_data->n_alternatives;
836 static_data->operand_alternative = op_alt;
837 for (i = 0; i < nop; i++)
839 static_data->operand[i].early_clobber_alts = 0;
840 static_data->operand[i].is_address = false;
841 if (static_data->operand[i].constraint[0] == '%')
843 /* We currently only support one commutative pair of operands. */
844 if (static_data->commutative < 0)
845 static_data->commutative = i;
846 else
847 lra_assert (icode < 0); /* Asm */
848 /* The last operand should not be marked commutative. */
849 lra_assert (i != nop - 1);
852 for (j = 0; j < nalt; j++)
853 for (i = 0; i < nop; i++, op_alt++)
855 if (op_alt->earlyclobber)
856 static_data->operand[i].early_clobber_alts |= (alternative_mask) 1 << j;
857 static_data->operand[i].is_address |= op_alt->is_address;
861 /* Recursively process X and collect info about registers, which are
862 not the insn operands, in X with TYPE (in/out/inout) and flag that
863 it is early clobbered in the insn (EARLY_CLOBBER) and add the info
864 to LIST. X is a part of insn given by DATA. Return the result
865 list. */
866 static struct lra_insn_reg *
867 collect_non_operand_hard_regs (rtx_insn *insn, rtx *x,
868 lra_insn_recog_data_t data,
869 struct lra_insn_reg *list,
870 enum op_type type, bool early_clobber)
872 int i, j, regno, last;
873 bool subreg_p;
874 machine_mode mode;
875 struct lra_insn_reg *curr;
876 rtx op = *x;
877 enum rtx_code code = GET_CODE (op);
878 const char *fmt = GET_RTX_FORMAT (code);
880 for (i = 0; i < data->insn_static_data->n_operands; i++)
881 if (! data->insn_static_data->operand[i].is_operator
882 && x == data->operand_loc[i])
883 /* It is an operand loc. Stop here. */
884 return list;
885 for (i = 0; i < data->insn_static_data->n_dups; i++)
886 if (x == data->dup_loc[i])
887 /* It is a dup loc. Stop here. */
888 return list;
889 mode = GET_MODE (op);
890 subreg_p = false;
891 if (code == SUBREG)
893 mode = wider_subreg_mode (op);
894 if (read_modify_subreg_p (op))
895 subreg_p = true;
896 op = SUBREG_REG (op);
897 code = GET_CODE (op);
899 if (REG_P (op))
901 if ((regno = REGNO (op)) >= FIRST_PSEUDO_REGISTER)
902 return list;
903 /* Process all regs even unallocatable ones as we need info
904 about all regs for rematerialization pass. */
905 for (last = end_hard_regno (mode, regno); regno < last; regno++)
907 for (curr = list; curr != NULL; curr = curr->next)
908 if (curr->regno == regno && curr->subreg_p == subreg_p
909 && curr->biggest_mode == mode)
911 if (curr->type != type)
912 curr->type = OP_INOUT;
913 if (early_clobber)
914 curr->early_clobber_alts = ALL_ALTERNATIVES;
915 break;
917 if (curr == NULL)
919 /* This is a new hard regno or the info cannot be
920 integrated into the found structure. */
921 #ifdef STACK_REGS
922 early_clobber
923 = (early_clobber
924 /* This clobber is to inform popping floating
925 point stack only. */
926 && ! (FIRST_STACK_REG <= regno
927 && regno <= LAST_STACK_REG));
928 #endif
929 list = new_insn_reg (data->insn, regno, type, mode, subreg_p,
930 early_clobber ? ALL_ALTERNATIVES : 0, list);
933 return list;
935 switch (code)
937 case SET:
938 list = collect_non_operand_hard_regs (insn, &SET_DEST (op), data,
939 list, OP_OUT, false);
940 list = collect_non_operand_hard_regs (insn, &SET_SRC (op), data,
941 list, OP_IN, false);
942 break;
943 case CLOBBER:
944 /* We treat clobber of non-operand hard registers as early clobber. */
945 list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
946 list, OP_OUT, true);
947 break;
948 case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
949 list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
950 list, OP_INOUT, false);
951 break;
952 case PRE_MODIFY: case POST_MODIFY:
953 list = collect_non_operand_hard_regs (insn, &XEXP (op, 0), data,
954 list, OP_INOUT, false);
955 list = collect_non_operand_hard_regs (insn, &XEXP (op, 1), data,
956 list, OP_IN, false);
957 break;
958 default:
959 fmt = GET_RTX_FORMAT (code);
960 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
962 if (fmt[i] == 'e')
963 list = collect_non_operand_hard_regs (insn, &XEXP (op, i), data,
964 list, OP_IN, false);
965 else if (fmt[i] == 'E')
966 for (j = XVECLEN (op, i) - 1; j >= 0; j--)
967 list = collect_non_operand_hard_regs (insn, &XVECEXP (op, i, j),
968 data, list, OP_IN, false);
971 return list;
974 /* Set up and return info about INSN. Set up the info if it is not set up
975 yet. */
976 lra_insn_recog_data_t
977 lra_set_insn_recog_data (rtx_insn *insn)
979 lra_insn_recog_data_t data;
980 int i, n, icode;
981 rtx **locs;
982 unsigned int uid = INSN_UID (insn);
983 struct lra_static_insn_data *insn_static_data;
985 check_and_expand_insn_recog_data (uid);
986 if (DEBUG_INSN_P (insn))
987 icode = -1;
988 else
990 icode = INSN_CODE (insn);
991 if (icode < 0)
992 /* It might be a new simple insn which is not recognized yet. */
993 INSN_CODE (insn) = icode = recog_memoized (insn);
995 data = lra_insn_recog_data_pool.allocate ();
996 lra_insn_recog_data[uid] = data;
997 data->insn = insn;
998 data->used_insn_alternative = LRA_UNKNOWN_ALT;
999 data->asm_reloads_num = 0;
1000 data->icode = icode;
1001 data->regs = NULL;
1002 if (DEBUG_INSN_P (insn))
1004 data->dup_loc = NULL;
1005 data->arg_hard_regs = NULL;
1006 data->preferred_alternatives = ALL_ALTERNATIVES;
1007 if (DEBUG_BIND_INSN_P (insn))
1009 data->insn_static_data = &debug_bind_static_data;
1010 data->operand_loc = XNEWVEC (rtx *, 1);
1011 data->operand_loc[0] = &INSN_VAR_LOCATION_LOC (insn);
1013 else if (DEBUG_MARKER_INSN_P (insn))
1015 data->insn_static_data = &debug_marker_static_data;
1016 data->operand_loc = NULL;
1018 return data;
1020 if (icode < 0)
1022 int nop, nalt;
1023 machine_mode operand_mode[MAX_RECOG_OPERANDS];
1024 const char *constraints[MAX_RECOG_OPERANDS];
1026 nop = asm_noperands (PATTERN (insn));
1027 data->operand_loc = data->dup_loc = NULL;
1028 nalt = 1;
1029 if (nop < 0)
1031 /* It is a special insn like USE or CLOBBER. We should
1032 recognize any regular insn otherwise LRA can do nothing
1033 with this insn. */
1034 gcc_assert (GET_CODE (PATTERN (insn)) == USE
1035 || GET_CODE (PATTERN (insn)) == CLOBBER
1036 || GET_CODE (PATTERN (insn)) == ASM_INPUT);
1037 data->insn_static_data = insn_static_data
1038 = get_static_insn_data (-1, 0, 0, nalt);
1040 else
1042 /* expand_asm_operands makes sure there aren't too many
1043 operands. */
1044 lra_assert (nop <= MAX_RECOG_OPERANDS);
1045 if (nop != 0)
1046 data->operand_loc = XNEWVEC (rtx *, nop);
1047 /* Now get the operand values and constraints out of the
1048 insn. */
1049 decode_asm_operands (PATTERN (insn), NULL,
1050 data->operand_loc,
1051 constraints, operand_mode, NULL);
1052 if (nop > 0)
1053 for (const char *p =constraints[0]; *p; p++)
1054 nalt += *p == ',';
1055 data->insn_static_data = insn_static_data
1056 = get_static_insn_data (-1, nop, 0, nalt);
1057 for (i = 0; i < nop; i++)
1059 insn_static_data->operand[i].mode = operand_mode[i];
1060 insn_static_data->operand[i].constraint = constraints[i];
1061 insn_static_data->operand[i].strict_low = false;
1062 insn_static_data->operand[i].is_operator = false;
1063 insn_static_data->operand[i].is_address = false;
1066 for (i = 0; i < insn_static_data->n_operands; i++)
1067 insn_static_data->operand[i].type
1068 = (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
1069 : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
1070 : OP_IN);
1071 data->preferred_alternatives = ALL_ALTERNATIVES;
1072 if (nop > 0)
1074 operand_alternative *op_alt = XCNEWVEC (operand_alternative,
1075 nalt * nop);
1076 preprocess_constraints (nop, nalt, constraints, op_alt,
1077 data->operand_loc);
1078 setup_operand_alternative (data, op_alt);
1081 else
1083 insn_extract (insn);
1084 data->insn_static_data = insn_static_data
1085 = get_static_insn_data (icode, insn_data[icode].n_operands,
1086 insn_data[icode].n_dups,
1087 insn_data[icode].n_alternatives);
1088 n = insn_static_data->n_operands;
1089 if (n == 0)
1090 locs = NULL;
1091 else
1093 locs = XNEWVEC (rtx *, n);
1094 memcpy (locs, recog_data.operand_loc, n * sizeof (rtx *));
1096 data->operand_loc = locs;
1097 n = insn_static_data->n_dups;
1098 if (n == 0)
1099 locs = NULL;
1100 else
1102 locs = XNEWVEC (rtx *, n);
1103 memcpy (locs, recog_data.dup_loc, n * sizeof (rtx *));
1105 data->dup_loc = locs;
1106 data->preferred_alternatives = get_preferred_alternatives (insn);
1107 const operand_alternative *op_alt = preprocess_insn_constraints (icode);
1108 if (!insn_static_data->operand_alternative)
1109 setup_operand_alternative (data, op_alt);
1110 else if (op_alt != insn_static_data->operand_alternative)
1111 insn_static_data->operand_alternative = op_alt;
1113 if (GET_CODE (PATTERN (insn)) == CLOBBER || GET_CODE (PATTERN (insn)) == USE)
1114 insn_static_data->hard_regs = NULL;
1115 else
1116 insn_static_data->hard_regs
1117 = collect_non_operand_hard_regs (insn, &PATTERN (insn), data,
1118 NULL, OP_IN, false);
1119 data->arg_hard_regs = NULL;
1120 if (CALL_P (insn))
1122 bool use_p;
1123 rtx link;
1124 int n_hard_regs, regno, arg_hard_regs[FIRST_PSEUDO_REGISTER];
1126 n_hard_regs = 0;
1127 /* Finding implicit hard register usage. We believe it will be
1128 not changed whatever transformations are used. Call insns
1129 are such example. */
1130 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1131 link != NULL_RTX;
1132 link = XEXP (link, 1))
1133 if (((use_p = GET_CODE (XEXP (link, 0)) == USE)
1134 || GET_CODE (XEXP (link, 0)) == CLOBBER)
1135 && REG_P (XEXP (XEXP (link, 0), 0)))
1137 regno = REGNO (XEXP (XEXP (link, 0), 0));
1138 lra_assert (regno < FIRST_PSEUDO_REGISTER);
1139 /* It is an argument register. */
1140 for (i = REG_NREGS (XEXP (XEXP (link, 0), 0)) - 1; i >= 0; i--)
1141 arg_hard_regs[n_hard_regs++]
1142 = regno + i + (use_p ? 0 : FIRST_PSEUDO_REGISTER);
1145 if (n_hard_regs != 0)
1147 arg_hard_regs[n_hard_regs++] = -1;
1148 data->arg_hard_regs = XNEWVEC (int, n_hard_regs);
1149 memcpy (data->arg_hard_regs, arg_hard_regs,
1150 sizeof (int) * n_hard_regs);
1153 /* Some output operand can be recognized only from the context not
1154 from the constraints which are empty in this case. Call insn may
1155 contain a hard register in set destination with empty constraint
1156 and extract_insn treats them as an input. */
1157 for (i = 0; i < insn_static_data->n_operands; i++)
1159 int j;
1160 rtx pat, set;
1161 struct lra_operand_data *operand = &insn_static_data->operand[i];
1163 /* ??? Should we treat 'X' the same way. It looks to me that
1164 'X' means anything and empty constraint means we do not
1165 care. */
1166 if (operand->type != OP_IN || *operand->constraint != '\0'
1167 || operand->is_operator)
1168 continue;
1169 pat = PATTERN (insn);
1170 if (GET_CODE (pat) == SET)
1172 if (data->operand_loc[i] != &SET_DEST (pat))
1173 continue;
1175 else if (GET_CODE (pat) == PARALLEL)
1177 for (j = XVECLEN (pat, 0) - 1; j >= 0; j--)
1179 set = XVECEXP (PATTERN (insn), 0, j);
1180 if (GET_CODE (set) == SET
1181 && &SET_DEST (set) == data->operand_loc[i])
1182 break;
1184 if (j < 0)
1185 continue;
1187 else
1188 continue;
1189 operand->type = OP_OUT;
1191 return data;
1194 /* Return info about insn give by UID. The info should be already set
1195 up. */
1196 static lra_insn_recog_data_t
1197 get_insn_recog_data_by_uid (int uid)
1199 lra_insn_recog_data_t data;
1201 data = lra_insn_recog_data[uid];
1202 lra_assert (data != NULL);
1203 return data;
1206 /* Invalidate all info about insn given by its UID. */
1207 static void
1208 invalidate_insn_recog_data (int uid)
1210 lra_insn_recog_data_t data;
1212 data = lra_insn_recog_data[uid];
1213 lra_assert (data != NULL);
1214 free_insn_recog_data (data);
1215 lra_insn_recog_data[uid] = NULL;
1218 /* Update all the insn info about INSN. It is usually called when
1219 something in the insn was changed. Return the updated info. */
1220 lra_insn_recog_data_t
1221 lra_update_insn_recog_data (rtx_insn *insn)
1223 lra_insn_recog_data_t data;
1224 int n;
1225 unsigned int uid = INSN_UID (insn);
1226 struct lra_static_insn_data *insn_static_data;
1227 poly_int64 sp_offset = 0;
1229 check_and_expand_insn_recog_data (uid);
1230 if ((data = lra_insn_recog_data[uid]) != NULL
1231 && data->icode != INSN_CODE (insn))
1233 sp_offset = data->sp_offset;
1234 invalidate_insn_data_regno_info (data, insn, get_insn_freq (insn));
1235 invalidate_insn_recog_data (uid);
1236 data = NULL;
1238 if (data == NULL)
1240 data = lra_get_insn_recog_data (insn);
1241 /* Initiate or restore SP offset. */
1242 data->sp_offset = sp_offset;
1243 return data;
1245 insn_static_data = data->insn_static_data;
1246 data->used_insn_alternative = LRA_UNKNOWN_ALT;
1247 if (DEBUG_INSN_P (insn))
1248 return data;
1249 if (data->icode < 0)
1251 int nop;
1252 machine_mode operand_mode[MAX_RECOG_OPERANDS];
1253 const char *constraints[MAX_RECOG_OPERANDS];
1255 nop = asm_noperands (PATTERN (insn));
1256 if (nop >= 0)
1258 lra_assert (nop == data->insn_static_data->n_operands);
1259 /* Now get the operand values and constraints out of the
1260 insn. */
1261 decode_asm_operands (PATTERN (insn), NULL,
1262 data->operand_loc,
1263 constraints, operand_mode, NULL);
1265 if (flag_checking)
1266 for (int i = 0; i < nop; i++)
1267 lra_assert
1268 (insn_static_data->operand[i].mode == operand_mode[i]
1269 && insn_static_data->operand[i].constraint == constraints[i]
1270 && ! insn_static_data->operand[i].is_operator);
1273 if (flag_checking)
1274 for (int i = 0; i < insn_static_data->n_operands; i++)
1275 lra_assert
1276 (insn_static_data->operand[i].type
1277 == (insn_static_data->operand[i].constraint[0] == '=' ? OP_OUT
1278 : insn_static_data->operand[i].constraint[0] == '+' ? OP_INOUT
1279 : OP_IN));
1281 else
1283 insn_extract (insn);
1284 n = insn_static_data->n_operands;
1285 if (n != 0)
1286 memcpy (data->operand_loc, recog_data.operand_loc, n * sizeof (rtx *));
1287 n = insn_static_data->n_dups;
1288 if (n != 0)
1289 memcpy (data->dup_loc, recog_data.dup_loc, n * sizeof (rtx *));
1290 lra_assert (check_bool_attrs (insn));
1292 return data;
1295 /* Set up that INSN is using alternative ALT now. */
1296 void
1297 lra_set_used_insn_alternative (rtx_insn *insn, int alt)
1299 lra_insn_recog_data_t data;
1301 data = lra_get_insn_recog_data (insn);
1302 data->used_insn_alternative = alt;
1305 /* Set up that insn with UID is using alternative ALT now. The insn
1306 info should be already set up. */
1307 void
1308 lra_set_used_insn_alternative_by_uid (int uid, int alt)
1310 lra_insn_recog_data_t data;
1312 check_and_expand_insn_recog_data (uid);
1313 data = lra_insn_recog_data[uid];
1314 lra_assert (data != NULL);
1315 data->used_insn_alternative = alt;
1320 /* This page contains code dealing with common register info and
1321 pseudo copies. */
1323 /* The size of the following array. */
1324 static int reg_info_size;
1325 /* Common info about each register. */
1326 class lra_reg *lra_reg_info;
1328 HARD_REG_SET hard_regs_spilled_into;
1330 /* Last register value. */
1331 static int last_reg_value;
1333 /* Return new register value. */
1334 static int
1335 get_new_reg_value (void)
1337 return ++last_reg_value;
1340 /* Vec referring to pseudo copies. */
1341 static vec<lra_copy_t> copy_vec;
1343 /* Initialize I-th element of lra_reg_info. */
1344 static inline void
1345 initialize_lra_reg_info_element (int i)
1347 bitmap_initialize (&lra_reg_info[i].insn_bitmap, &reg_obstack);
1348 #ifdef STACK_REGS
1349 lra_reg_info[i].no_stack_p = false;
1350 #endif
1351 CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
1352 CLEAR_HARD_REG_SET (lra_reg_info[i].exclude_start_hard_regs);
1353 lra_reg_info[i].preferred_hard_regno1 = -1;
1354 lra_reg_info[i].preferred_hard_regno2 = -1;
1355 lra_reg_info[i].preferred_hard_regno_profit1 = 0;
1356 lra_reg_info[i].preferred_hard_regno_profit2 = 0;
1357 lra_reg_info[i].biggest_mode = VOIDmode;
1358 lra_reg_info[i].live_ranges = NULL;
1359 lra_reg_info[i].nrefs = lra_reg_info[i].freq = 0;
1360 lra_reg_info[i].last_reload = 0;
1361 lra_reg_info[i].restore_rtx = NULL_RTX;
1362 lra_reg_info[i].val = get_new_reg_value ();
1363 lra_reg_info[i].offset = 0;
1364 lra_reg_info[i].copies = NULL;
1367 /* Initialize common reg info and copies. */
1368 static void
1369 init_reg_info (void)
1371 int i;
1373 last_reg_value = 0;
1374 reg_info_size = max_reg_num () * 3 / 2 + 1;
1375 lra_reg_info = XNEWVEC (class lra_reg, reg_info_size);
1376 for (i = 0; i < reg_info_size; i++)
1377 initialize_lra_reg_info_element (i);
1378 copy_vec.truncate (0);
1379 CLEAR_HARD_REG_SET (hard_regs_spilled_into);
1383 /* Finish common reg info and copies. */
1384 static void
1385 finish_reg_info (void)
1387 int i;
1389 for (i = 0; i < reg_info_size; i++)
1390 bitmap_clear (&lra_reg_info[i].insn_bitmap);
1391 free (lra_reg_info);
1392 reg_info_size = 0;
1395 /* Expand common reg info if it is necessary. */
1396 static void
1397 expand_reg_info (void)
1399 int i, old = reg_info_size;
1401 if (reg_info_size > max_reg_num ())
1402 return;
1403 reg_info_size = max_reg_num () * 3 / 2 + 1;
1404 lra_reg_info = XRESIZEVEC (class lra_reg, lra_reg_info, reg_info_size);
1405 for (i = old; i < reg_info_size; i++)
1406 initialize_lra_reg_info_element (i);
1409 /* Free all copies. */
1410 void
1411 lra_free_copies (void)
1413 lra_copy_t cp;
1415 while (copy_vec.length () != 0)
1417 cp = copy_vec.pop ();
1418 lra_reg_info[cp->regno1].copies = lra_reg_info[cp->regno2].copies = NULL;
1419 lra_copy_pool.remove (cp);
1423 /* Create copy of two pseudos REGNO1 and REGNO2. The copy execution
1424 frequency is FREQ. */
1425 void
1426 lra_create_copy (int regno1, int regno2, int freq)
1428 bool regno1_dest_p;
1429 lra_copy_t cp;
1431 lra_assert (regno1 != regno2);
1432 regno1_dest_p = true;
1433 if (regno1 > regno2)
1435 std::swap (regno1, regno2);
1436 regno1_dest_p = false;
1438 cp = lra_copy_pool.allocate ();
1439 copy_vec.safe_push (cp);
1440 cp->regno1_dest_p = regno1_dest_p;
1441 cp->freq = freq;
1442 cp->regno1 = regno1;
1443 cp->regno2 = regno2;
1444 cp->regno1_next = lra_reg_info[regno1].copies;
1445 lra_reg_info[regno1].copies = cp;
1446 cp->regno2_next = lra_reg_info[regno2].copies;
1447 lra_reg_info[regno2].copies = cp;
1448 if (lra_dump_file != NULL)
1449 fprintf (lra_dump_file, " Creating copy r%d%sr%d@%d\n",
1450 regno1, regno1_dest_p ? "<-" : "->", regno2, freq);
1453 /* Return N-th (0, 1, ...) copy. If there is no copy, return
1454 NULL. */
1455 lra_copy_t
1456 lra_get_copy (int n)
1458 if (n >= (int) copy_vec.length ())
1459 return NULL;
1460 return copy_vec[n];
1465 /* This page contains code dealing with info about registers in
1466 insns. */
1468 /* Process X of INSN recursively and add info (operand type is given
1469 by TYPE) about registers in X to the insn DATA. If X can be early
1470 clobbered, alternatives in which it can be early clobbered are given
1471 by EARLY_CLOBBER_ALTS. */
1472 static void
1473 add_regs_to_insn_regno_info (lra_insn_recog_data_t data, rtx x,
1474 rtx_insn *insn, enum op_type type,
1475 alternative_mask early_clobber_alts)
1477 int i, j, regno;
1478 bool subreg_p;
1479 machine_mode mode;
1480 const char *fmt;
1481 enum rtx_code code;
1482 struct lra_insn_reg *curr;
1484 code = GET_CODE (x);
1485 mode = GET_MODE (x);
1486 subreg_p = false;
1487 if (GET_CODE (x) == SUBREG)
1489 mode = wider_subreg_mode (x);
1490 if (read_modify_subreg_p (x))
1491 subreg_p = true;
1492 x = SUBREG_REG (x);
1493 code = GET_CODE (x);
1495 if (REG_P (x))
1497 regno = REGNO (x);
1498 /* Process all regs even unallocatable ones as we need info about
1499 all regs for rematerialization pass. */
1500 expand_reg_info ();
1501 if (bitmap_set_bit (&lra_reg_info[regno].insn_bitmap, INSN_UID (insn)))
1503 data->regs = new_insn_reg (data->insn, regno, type, mode, subreg_p,
1504 early_clobber_alts, data->regs);
1505 return;
1507 else
1509 for (curr = data->regs; curr != NULL; curr = curr->next)
1510 if (curr->regno == regno)
1512 if (curr->subreg_p != subreg_p || curr->biggest_mode != mode)
1513 /* The info cannot be integrated into the found
1514 structure. */
1515 data->regs = new_insn_reg (data->insn, regno, type, mode,
1516 subreg_p, early_clobber_alts,
1517 data->regs);
1518 else
1520 if (curr->type != type)
1521 curr->type = OP_INOUT;
1522 curr->early_clobber_alts |= early_clobber_alts;
1524 return;
1526 gcc_unreachable ();
1530 switch (code)
1532 case SET:
1533 add_regs_to_insn_regno_info (data, SET_DEST (x), insn, OP_OUT, 0);
1534 add_regs_to_insn_regno_info (data, SET_SRC (x), insn, OP_IN, 0);
1535 break;
1536 case CLOBBER:
1537 /* We treat clobber of non-operand hard registers as early
1538 clobber. */
1539 add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_OUT,
1540 ALL_ALTERNATIVES);
1541 break;
1542 case PRE_INC: case PRE_DEC: case POST_INC: case POST_DEC:
1543 add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, 0);
1544 break;
1545 case PRE_MODIFY: case POST_MODIFY:
1546 add_regs_to_insn_regno_info (data, XEXP (x, 0), insn, OP_INOUT, 0);
1547 add_regs_to_insn_regno_info (data, XEXP (x, 1), insn, OP_IN, 0);
1548 break;
1549 default:
1550 if ((code != PARALLEL && code != EXPR_LIST) || type != OP_OUT)
1551 /* Some targets place small structures in registers for return
1552 values of functions, and those registers are wrapped in
1553 PARALLEL that we may see as the destination of a SET. Here
1554 is an example:
1556 (call_insn 13 12 14 2 (set (parallel:BLK [
1557 (expr_list:REG_DEP_TRUE (reg:DI 0 ax)
1558 (const_int 0 [0]))
1559 (expr_list:REG_DEP_TRUE (reg:DI 1 dx)
1560 (const_int 8 [0x8]))
1562 (call (mem:QI (symbol_ref:DI (... */
1563 type = OP_IN;
1564 fmt = GET_RTX_FORMAT (code);
1565 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1567 if (fmt[i] == 'e')
1568 add_regs_to_insn_regno_info (data, XEXP (x, i), insn, type, 0);
1569 else if (fmt[i] == 'E')
1571 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
1572 add_regs_to_insn_regno_info (data, XVECEXP (x, i, j), insn,
1573 type, 0);
1579 /* Return execution frequency of INSN. */
1580 static int
1581 get_insn_freq (rtx_insn *insn)
1583 basic_block bb = BLOCK_FOR_INSN (insn);
1585 gcc_checking_assert (bb != NULL);
1586 return REG_FREQ_FROM_BB (bb);
1589 /* Invalidate all reg info of INSN with DATA and execution frequency
1590 FREQ. Update common info about the invalidated registers. */
1591 static void
1592 invalidate_insn_data_regno_info (lra_insn_recog_data_t data, rtx_insn *insn,
1593 int freq)
1595 int uid;
1596 bool debug_p;
1597 unsigned int i;
1598 struct lra_insn_reg *ir, *next_ir;
1600 uid = INSN_UID (insn);
1601 debug_p = DEBUG_INSN_P (insn);
1602 for (ir = data->regs; ir != NULL; ir = next_ir)
1604 i = ir->regno;
1605 next_ir = ir->next;
1606 lra_insn_reg_pool.remove (ir);
1607 bitmap_clear_bit (&lra_reg_info[i].insn_bitmap, uid);
1608 if (i >= FIRST_PSEUDO_REGISTER && ! debug_p)
1610 lra_reg_info[i].nrefs--;
1611 lra_reg_info[i].freq -= freq;
1612 lra_assert (lra_reg_info[i].nrefs >= 0 && lra_reg_info[i].freq >= 0);
1615 data->regs = NULL;
1618 /* Invalidate all reg info of INSN. Update common info about the
1619 invalidated registers. */
1620 void
1621 lra_invalidate_insn_regno_info (rtx_insn *insn)
1623 invalidate_insn_data_regno_info (lra_get_insn_recog_data (insn), insn,
1624 get_insn_freq (insn));
1627 /* Update common reg info from reg info of insn given by its DATA and
1628 execution frequency FREQ. */
1629 static void
1630 setup_insn_reg_info (lra_insn_recog_data_t data, int freq)
1632 unsigned int i;
1633 struct lra_insn_reg *ir;
1635 for (ir = data->regs; ir != NULL; ir = ir->next)
1636 if ((i = ir->regno) >= FIRST_PSEUDO_REGISTER)
1638 lra_reg_info[i].nrefs++;
1639 lra_reg_info[i].freq += freq;
1643 /* Set up insn reg info of INSN. Update common reg info from reg info
1644 of INSN. */
1645 void
1646 lra_update_insn_regno_info (rtx_insn *insn)
1648 int i, freq;
1649 lra_insn_recog_data_t data;
1650 struct lra_static_insn_data *static_data;
1651 enum rtx_code code;
1652 rtx link;
1654 if (! INSN_P (insn))
1655 return;
1656 data = lra_get_insn_recog_data (insn);
1657 static_data = data->insn_static_data;
1658 freq = NONDEBUG_INSN_P (insn) ? get_insn_freq (insn) : 0;
1659 invalidate_insn_data_regno_info (data, insn, freq);
1660 for (i = static_data->n_operands - 1; i >= 0; i--)
1661 add_regs_to_insn_regno_info (data, *data->operand_loc[i], insn,
1662 static_data->operand[i].type,
1663 static_data->operand[i].early_clobber_alts);
1664 if ((code = GET_CODE (PATTERN (insn))) == CLOBBER || code == USE)
1665 add_regs_to_insn_regno_info (data, XEXP (PATTERN (insn), 0), insn,
1666 code == USE ? OP_IN : OP_OUT, 0);
1667 if (CALL_P (insn))
1668 /* On some targets call insns can refer to pseudos in memory in
1669 CALL_INSN_FUNCTION_USAGE list. Process them in order to
1670 consider their occurrences in calls for different
1671 transformations (e.g. inheritance) with given pseudos. */
1672 for (link = CALL_INSN_FUNCTION_USAGE (insn);
1673 link != NULL_RTX;
1674 link = XEXP (link, 1))
1676 code = GET_CODE (XEXP (link, 0));
1677 if ((code == USE || code == CLOBBER)
1678 && MEM_P (XEXP (XEXP (link, 0), 0)))
1679 add_regs_to_insn_regno_info (data, XEXP (XEXP (link, 0), 0), insn,
1680 code == USE ? OP_IN : OP_OUT, 0);
1682 if (NONDEBUG_INSN_P (insn))
1683 setup_insn_reg_info (data, freq);
1686 /* Return reg info of insn given by it UID. */
1687 struct lra_insn_reg *
1688 lra_get_insn_regs (int uid)
1690 lra_insn_recog_data_t data;
1692 data = get_insn_recog_data_by_uid (uid);
1693 return data->regs;
1698 /* Recursive hash function for RTL X. */
1699 hashval_t
1700 lra_rtx_hash (rtx x)
1702 int i, j;
1703 enum rtx_code code;
1704 const char *fmt;
1705 hashval_t val = 0;
1707 if (x == 0)
1708 return val;
1710 code = GET_CODE (x);
1711 val += (int) code + 4095;
1713 /* Some RTL can be compared nonrecursively. */
1714 switch (code)
1716 case REG:
1717 return val + REGNO (x);
1719 case LABEL_REF:
1720 return iterative_hash_object (XEXP (x, 0), val);
1722 case SYMBOL_REF:
1723 return iterative_hash_object (XSTR (x, 0), val);
1725 case SCRATCH:
1726 case CONST_DOUBLE:
1727 case CONST_VECTOR:
1728 return val;
1730 case CONST_INT:
1731 return val + UINTVAL (x);
1733 default:
1734 break;
1737 /* Hash the elements. */
1738 fmt = GET_RTX_FORMAT (code);
1739 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
1741 switch (fmt[i])
1743 case 'w':
1744 val += XWINT (x, i);
1745 break;
1747 case 'n':
1748 case 'i':
1749 val += XINT (x, i);
1750 break;
1752 case 'V':
1753 case 'E':
1754 val += XVECLEN (x, i);
1756 for (j = 0; j < XVECLEN (x, i); j++)
1757 val += lra_rtx_hash (XVECEXP (x, i, j));
1758 break;
1760 case 'e':
1761 val += lra_rtx_hash (XEXP (x, i));
1762 break;
1764 case 'S':
1765 case 's':
1766 val += htab_hash_string (XSTR (x, i));
1767 break;
1769 case 'u':
1770 case '0':
1771 case 't':
1772 break;
1774 /* It is believed that rtx's at this level will never
1775 contain anything but integers and other rtx's, except for
1776 within LABEL_REFs and SYMBOL_REFs. */
1777 default:
1778 abort ();
1781 return val;
1786 /* This page contains code dealing with stack of the insns which
1787 should be processed by the next constraint pass. */
1789 /* Bitmap used to put an insn on the stack only in one exemplar. */
1790 static sbitmap lra_constraint_insn_stack_bitmap;
1792 /* The stack itself. */
1793 vec<rtx_insn *> lra_constraint_insn_stack;
1795 /* Put INSN on the stack. If ALWAYS_UPDATE is true, always update the reg
1796 info for INSN, otherwise only update it if INSN is not already on the
1797 stack. */
1798 static inline void
1799 lra_push_insn_1 (rtx_insn *insn, bool always_update)
1801 unsigned int uid = INSN_UID (insn);
1802 if (always_update)
1803 lra_update_insn_regno_info (insn);
1804 if (uid >= SBITMAP_SIZE (lra_constraint_insn_stack_bitmap))
1805 lra_constraint_insn_stack_bitmap =
1806 sbitmap_resize (lra_constraint_insn_stack_bitmap, 3 * uid / 2, 0);
1807 if (bitmap_bit_p (lra_constraint_insn_stack_bitmap, uid))
1808 return;
1809 bitmap_set_bit (lra_constraint_insn_stack_bitmap, uid);
1810 if (! always_update)
1811 lra_update_insn_regno_info (insn);
1812 lra_constraint_insn_stack.safe_push (insn);
1815 /* Put INSN on the stack. */
1816 void
1817 lra_push_insn (rtx_insn *insn)
1819 lra_push_insn_1 (insn, false);
1822 /* Put INSN on the stack and update its reg info. */
1823 void
1824 lra_push_insn_and_update_insn_regno_info (rtx_insn *insn)
1826 lra_push_insn_1 (insn, true);
1829 /* Put insn with UID on the stack. */
1830 void
1831 lra_push_insn_by_uid (unsigned int uid)
1833 lra_push_insn (lra_insn_recog_data[uid]->insn);
1836 /* Take the last-inserted insns off the stack and return it. */
1837 rtx_insn *
1838 lra_pop_insn (void)
1840 rtx_insn *insn = lra_constraint_insn_stack.pop ();
1841 bitmap_clear_bit (lra_constraint_insn_stack_bitmap, INSN_UID (insn));
1842 return insn;
1845 /* Return the current size of the insn stack. */
1846 unsigned int
1847 lra_insn_stack_length (void)
1849 return lra_constraint_insn_stack.length ();
1852 /* Push insns FROM to TO (excluding it) going in reverse order. */
1853 static void
1854 push_insns (rtx_insn *from, rtx_insn *to)
1856 rtx_insn *insn;
1858 if (from == NULL_RTX)
1859 return;
1860 for (insn = from; insn != to; insn = PREV_INSN (insn))
1861 if (INSN_P (insn))
1862 lra_push_insn (insn);
1865 /* Set up and return sp offset for insns in range [FROM, LAST]. The offset is
1866 taken from the BB insn before FROM after simulating its effects,
1867 or zero if there is no such insn. */
1868 static poly_int64
1869 setup_sp_offset (rtx_insn *from, rtx_insn *last)
1871 rtx_insn *before = prev_nonnote_nondebug_insn_bb (from);
1872 poly_int64 offset = 0;
1874 if (before && INSN_P (before))
1875 offset = lra_update_sp_offset (PATTERN (before),
1876 lra_get_insn_recog_data (before)->sp_offset);
1878 for (rtx_insn *insn = from; insn != NEXT_INSN (last); insn = NEXT_INSN (insn))
1880 lra_get_insn_recog_data (insn)->sp_offset = offset;
1881 offset = lra_update_sp_offset (PATTERN (insn), offset);
1883 return offset;
1886 /* Dump all func insns in a slim form. */
1887 void
1888 lra_dump_insns (FILE *f)
1890 dump_rtl_slim (f, get_insns (), NULL, -1, 0);
1893 /* Dump all func insns in a slim form with TITLE when the dump file is open and
1894 lra_verbose >=7. */
1895 void
1896 lra_dump_insns_if_possible (const char *title)
1898 if (lra_dump_file == NULL || lra_verbose < 7)
1899 return;
1900 fprintf (lra_dump_file, "%s:", title);
1901 lra_dump_insns (lra_dump_file);
1904 /* Emit insns BEFORE before INSN and insns AFTER after INSN. Put the
1905 insns onto the stack. Print about emitting the insns with
1906 TITLE. */
1907 void
1908 lra_process_new_insns (rtx_insn *insn, rtx_insn *before, rtx_insn *after,
1909 const char *title)
1911 if (before == NULL_RTX && after == NULL_RTX)
1912 return;
1913 if (lra_dump_file != NULL)
1915 dump_insn_slim (lra_dump_file, insn);
1916 if (before != NULL_RTX)
1918 fprintf (lra_dump_file," %s before:\n", title);
1919 dump_rtl_slim (lra_dump_file, before, NULL, -1, 0);
1922 if (before != NULL_RTX)
1924 if (cfun->can_throw_non_call_exceptions)
1925 copy_reg_eh_region_note_forward (insn, before, NULL);
1926 emit_insn_before (before, insn);
1927 poly_int64 old_sp_offset = lra_get_insn_recog_data (insn)->sp_offset;
1928 poly_int64 new_sp_offset = setup_sp_offset (before, PREV_INSN (insn));
1929 if (maybe_ne (old_sp_offset, new_sp_offset))
1931 if (lra_dump_file != NULL)
1933 fprintf (lra_dump_file, " Changing sp offset from ");
1934 print_dec (old_sp_offset, lra_dump_file);
1935 fprintf (lra_dump_file, " to ");
1936 print_dec (new_sp_offset, lra_dump_file);
1937 fprintf (lra_dump_file, " for insn");
1938 dump_rtl_slim (lra_dump_file, insn, NULL, -1, 0);
1940 lra_get_insn_recog_data (insn)->sp_offset = new_sp_offset;
1941 eliminate_regs_in_insn (insn, false, false,
1942 old_sp_offset - new_sp_offset);
1943 lra_push_insn (insn);
1945 push_insns (PREV_INSN (insn), PREV_INSN (before));
1947 if (after != NULL_RTX)
1949 if (cfun->can_throw_non_call_exceptions)
1950 copy_reg_eh_region_note_forward (insn, after, NULL);
1951 if (! JUMP_P (insn))
1953 rtx_insn *last;
1955 if (lra_dump_file != NULL)
1957 fprintf (lra_dump_file, " %s after:\n", title);
1958 dump_rtl_slim (lra_dump_file, after, NULL, -1, 0);
1960 for (last = after;
1961 NEXT_INSN (last) != NULL_RTX;
1962 last = NEXT_INSN (last))
1964 emit_insn_after (after, insn);
1965 push_insns (last, insn);
1966 setup_sp_offset (after, last);
1968 else
1970 /* Put output reload insns on successor BBs: */
1971 edge_iterator ei;
1972 edge e;
1974 FOR_EACH_EDGE (e, ei, BLOCK_FOR_INSN (insn)->succs)
1975 if (e->dest != EXIT_BLOCK_PTR_FOR_FN (cfun))
1977 /* We already made the edge no-critical in ira.cc::ira */
1978 lra_assert (!EDGE_CRITICAL_P (e));
1979 rtx_insn *curr, *tmp = BB_HEAD (e->dest);
1980 if (LABEL_P (tmp))
1981 tmp = NEXT_INSN (tmp);
1982 if (NOTE_INSN_BASIC_BLOCK_P (tmp))
1983 tmp = NEXT_INSN (tmp);
1984 /* Do not put reload insns if it is the last BB
1985 without actual insns. */
1986 if (tmp == NULL)
1987 continue;
1988 start_sequence ();
1989 for (curr = after; curr != NULL_RTX; curr = NEXT_INSN (curr))
1990 emit_insn (copy_insn (PATTERN (curr)));
1991 rtx_insn *copy = get_insns (), *last = get_last_insn ();
1992 end_sequence ();
1993 if (lra_dump_file != NULL)
1995 fprintf (lra_dump_file, " %s after in bb%d:\n", title,
1996 e->dest->index);
1997 dump_rtl_slim (lra_dump_file, copy, NULL, -1, 0);
1999 /* Use the right emit func for setting up BB_END/BB_HEAD: */
2000 if (BB_END (e->dest) == PREV_INSN (tmp))
2001 emit_insn_after_noloc (copy, PREV_INSN (tmp), e->dest);
2002 else
2003 emit_insn_before_noloc (copy, tmp, e->dest);
2004 push_insns (last, PREV_INSN (copy));
2005 setup_sp_offset (copy, last);
2006 /* We can ignore BB live info here as it and reg notes
2007 will be updated before the next assignment
2008 sub-pass. */
2012 if (lra_dump_file != NULL)
2013 fprintf (lra_dump_file, "\n");
2014 if (cfun->can_throw_non_call_exceptions)
2016 rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX);
2017 if (note && !insn_could_throw_p (insn))
2018 remove_note (insn, note);
2023 /* Replace all references to register OLD_REGNO in *LOC with pseudo
2024 register NEW_REG. Try to simplify subreg of constant if SUBREG_P.
2025 DEBUG_P is if LOC is within a DEBUG_INSN. Return true if any
2026 change was made. */
2027 bool
2028 lra_substitute_pseudo (rtx *loc, int old_regno, rtx new_reg, bool subreg_p,
2029 bool debug_p)
2031 rtx x = *loc;
2032 bool result = false;
2033 enum rtx_code code;
2034 const char *fmt;
2035 int i, j;
2037 if (x == NULL_RTX)
2038 return false;
2040 code = GET_CODE (x);
2041 if (code == SUBREG && subreg_p)
2043 rtx subst, inner = SUBREG_REG (x);
2044 /* Transform subreg of constant while we still have inner mode
2045 of the subreg. The subreg internal should not be an insn
2046 operand. */
2047 if (REG_P (inner) && (int) REGNO (inner) == old_regno
2048 && CONSTANT_P (new_reg)
2049 && (subst = simplify_subreg (GET_MODE (x), new_reg, GET_MODE (inner),
2050 SUBREG_BYTE (x))) != NULL_RTX)
2052 *loc = subst;
2053 return true;
2057 else if (code == REG && (int) REGNO (x) == old_regno)
2059 machine_mode mode = GET_MODE (x);
2060 machine_mode inner_mode = GET_MODE (new_reg);
2062 if (mode != inner_mode
2063 && ! (CONST_SCALAR_INT_P (new_reg) && SCALAR_INT_MODE_P (mode)))
2065 poly_uint64 offset = 0;
2066 if (partial_subreg_p (mode, inner_mode)
2067 && SCALAR_INT_MODE_P (inner_mode))
2068 offset = subreg_lowpart_offset (mode, inner_mode);
2069 if (debug_p)
2070 new_reg = gen_rtx_raw_SUBREG (mode, new_reg, offset);
2071 else
2072 new_reg = gen_rtx_SUBREG (mode, new_reg, offset);
2074 *loc = new_reg;
2075 return true;
2078 /* Scan all the operand sub-expressions. */
2079 fmt = GET_RTX_FORMAT (code);
2080 for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
2082 if (fmt[i] == 'e')
2084 if (debug_p
2085 && i == 0
2086 && (code == SUBREG
2087 || code == ZERO_EXTEND
2088 || code == SIGN_EXTEND
2089 || code == FLOAT
2090 || code == UNSIGNED_FLOAT))
2092 rtx y = XEXP (x, 0);
2093 if (lra_substitute_pseudo (&y, old_regno,
2094 new_reg, subreg_p, debug_p))
2096 result = true;
2097 if (CONST_SCALAR_INT_P (y))
2099 if (code == SUBREG)
2100 y = simplify_subreg (GET_MODE (x), y,
2101 GET_MODE (SUBREG_REG (x)),
2102 SUBREG_BYTE (x));
2103 else
2104 y = simplify_unary_operation (code, GET_MODE (x), y,
2105 GET_MODE (XEXP (x, 0)));
2106 if (y)
2107 *loc = y;
2108 else
2109 *loc = gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
2111 else
2112 XEXP (x, 0) = y;
2115 else if (lra_substitute_pseudo (&XEXP (x, i), old_regno,
2116 new_reg, subreg_p, debug_p))
2117 result = true;
2119 else if (fmt[i] == 'E')
2121 for (j = XVECLEN (x, i) - 1; j >= 0; j--)
2122 if (lra_substitute_pseudo (&XVECEXP (x, i, j), old_regno,
2123 new_reg, subreg_p, debug_p))
2124 result = true;
2127 return result;
2130 /* Call lra_substitute_pseudo within an insn. Try to simplify subreg
2131 of constant if SUBREG_P. This won't update the insn ptr, just the
2132 contents of the insn. */
2133 bool
2134 lra_substitute_pseudo_within_insn (rtx_insn *insn, int old_regno,
2135 rtx new_reg, bool subreg_p)
2137 rtx loc = insn;
2138 return lra_substitute_pseudo (&loc, old_regno, new_reg, subreg_p,
2139 DEBUG_INSN_P (insn));
2144 /* Return new register of the same mode as ORIGINAL of class ALL_REGS.
2145 Used in ira_remove_scratches. */
2146 static rtx
2147 get_scratch_reg (rtx original)
2149 return lra_create_new_reg (GET_MODE (original), original, ALL_REGS,
2150 NULL, NULL);
2153 /* Remove all insn scratches in INSN. */
2154 static void
2155 remove_insn_scratches (rtx_insn *insn)
2157 if (ira_remove_insn_scratches (insn, true, lra_dump_file, get_scratch_reg))
2158 df_insn_rescan (insn);
2161 /* Remove all insn scratches in the current function. */
2162 static void
2163 remove_scratches (void)
2165 basic_block bb;
2166 rtx_insn *insn;
2168 FOR_EACH_BB_FN (bb, cfun)
2169 FOR_BB_INSNS (bb, insn)
2170 if (INSN_P (insn))
2171 remove_insn_scratches (insn);
2174 /* Function checks RTL for correctness. If FINAL_P is true, it is
2175 done at the end of LRA and the check is more rigorous. */
2176 static void
2177 check_rtl (bool final_p)
2179 basic_block bb;
2180 rtx_insn *insn;
2182 lra_assert (! final_p || reload_completed);
2183 FOR_EACH_BB_FN (bb, cfun)
2184 FOR_BB_INSNS (bb, insn)
2185 if (NONDEBUG_INSN_P (insn)
2186 && GET_CODE (PATTERN (insn)) != USE
2187 && GET_CODE (PATTERN (insn)) != CLOBBER
2188 && GET_CODE (PATTERN (insn)) != ASM_INPUT)
2190 if (final_p)
2192 extract_constrain_insn (insn);
2193 continue;
2195 /* LRA code is based on assumption that all addresses can be
2196 correctly decomposed. LRA can generate reloads for
2197 decomposable addresses. The decomposition code checks the
2198 correctness of the addresses. So we don't need to check
2199 the addresses here. Don't call insn_invalid_p here, it can
2200 change the code at this stage. */
2201 if (recog_memoized (insn) < 0 && asm_noperands (PATTERN (insn)) < 0)
2202 fatal_insn_not_found (insn);
2206 /* Determine if the current function has an exception receiver block
2207 that reaches the exit block via non-exceptional edges */
2208 static bool
2209 has_nonexceptional_receiver (void)
2211 edge e;
2212 edge_iterator ei;
2213 basic_block *tos, *worklist, bb;
2215 /* If we're not optimizing, then just err on the safe side. */
2216 if (!optimize)
2217 return true;
2219 /* First determine which blocks can reach exit via normal paths. */
2220 tos = worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun) + 1);
2222 FOR_EACH_BB_FN (bb, cfun)
2223 bb->flags &= ~BB_REACHABLE;
2225 /* Place the exit block on our worklist. */
2226 EXIT_BLOCK_PTR_FOR_FN (cfun)->flags |= BB_REACHABLE;
2227 *tos++ = EXIT_BLOCK_PTR_FOR_FN (cfun);
2229 /* Iterate: find everything reachable from what we've already seen. */
2230 while (tos != worklist)
2232 bb = *--tos;
2234 FOR_EACH_EDGE (e, ei, bb->preds)
2235 if (e->flags & EDGE_ABNORMAL)
2237 free (worklist);
2238 return true;
2240 else
2242 basic_block src = e->src;
2244 if (!(src->flags & BB_REACHABLE))
2246 src->flags |= BB_REACHABLE;
2247 *tos++ = src;
2251 free (worklist);
2252 /* No exceptional block reached exit unexceptionally. */
2253 return false;
2256 /* Remove all REG_DEAD and REG_UNUSED notes and regenerate REG_INC.
2257 We change pseudos by hard registers without notification of DF and
2258 that can make the notes obsolete. DF-infrastructure does not deal
2259 with REG_INC notes -- so we should regenerate them here. */
2260 static void
2261 update_inc_notes (void)
2263 rtx *pnote;
2264 basic_block bb;
2265 rtx_insn *insn;
2267 FOR_EACH_BB_FN (bb, cfun)
2268 FOR_BB_INSNS (bb, insn)
2269 if (NONDEBUG_INSN_P (insn))
2271 pnote = &REG_NOTES (insn);
2272 while (*pnote != 0)
2274 if (REG_NOTE_KIND (*pnote) == REG_DEAD
2275 || REG_NOTE_KIND (*pnote) == REG_UNUSED
2276 || REG_NOTE_KIND (*pnote) == REG_INC)
2277 *pnote = XEXP (*pnote, 1);
2278 else
2279 pnote = &XEXP (*pnote, 1);
2282 if (AUTO_INC_DEC)
2283 add_auto_inc_notes (insn, PATTERN (insn));
2287 /* Set to true while in LRA. */
2288 bool lra_in_progress = false;
2290 /* Start of pseudo regnos before the LRA. */
2291 int lra_new_regno_start;
2293 /* Start of reload pseudo regnos before the new spill pass. */
2294 int lra_constraint_new_regno_start;
2296 /* Avoid spilling pseudos with regno more than the following value if
2297 it is possible. */
2298 int lra_bad_spill_regno_start;
2300 /* A pseudo of Pmode. */
2301 rtx lra_pmode_pseudo;
2303 /* Inheritance pseudo regnos before the new spill pass. */
2304 bitmap_head lra_inheritance_pseudos;
2306 /* Split regnos before the new spill pass. */
2307 bitmap_head lra_split_regs;
2309 /* Reload pseudo regnos before the new assignment pass which still can
2310 be spilled after the assignment pass as memory is also accepted in
2311 insns for the reload pseudos. */
2312 bitmap_head lra_optional_reload_pseudos;
2314 /* Pseudo regnos used for subreg reloads before the new assignment
2315 pass. Such pseudos still can be spilled after the assignment
2316 pass. */
2317 bitmap_head lra_subreg_reload_pseudos;
2319 /* File used for output of LRA debug information. */
2320 FILE *lra_dump_file;
2322 /* How verbose should be the debug information. */
2323 int lra_verbose;
2325 /* True if we split hard reg after the last constraint sub-pass. */
2326 bool lra_hard_reg_split_p;
2328 /* True if we found an asm error. */
2329 bool lra_asm_error_p;
2331 /* True if we should try spill into registers of different classes
2332 instead of memory. */
2333 bool lra_reg_spill_p;
2335 /* Set up value LRA_REG_SPILL_P. */
2336 static void
2337 setup_reg_spill_flag (void)
2339 int cl, mode;
2341 if (targetm.spill_class != NULL)
2342 for (cl = 0; cl < (int) LIM_REG_CLASSES; cl++)
2343 for (mode = 0; mode < MAX_MACHINE_MODE; mode++)
2344 if (targetm.spill_class ((enum reg_class) cl,
2345 (machine_mode) mode) != NO_REGS)
2347 lra_reg_spill_p = true;
2348 return;
2350 lra_reg_spill_p = false;
2353 /* True if the current function is too big to use regular algorithms
2354 in LRA. In other words, we should use simpler and faster algorithms
2355 in LRA. It also means we should not worry about generation code
2356 for caller saves. The value is set up in IRA. */
2357 bool lra_simple_p;
2359 /* Major LRA entry function. F is a file should be used to dump LRA
2360 debug info with given verbosity. */
2361 void
2362 lra (FILE *f, int verbose)
2364 int i;
2365 bool live_p, inserted_p;
2367 lra_dump_file = f;
2368 lra_verbose = verbose;
2369 lra_asm_error_p = false;
2370 lra_pmode_pseudo = gen_reg_rtx (Pmode);
2372 timevar_push (TV_LRA);
2374 /* Make sure that the last insn is a note. Some subsequent passes
2375 need it. */
2376 emit_note (NOTE_INSN_DELETED);
2378 lra_no_alloc_regs = ira_no_alloc_regs;
2380 init_reg_info ();
2381 expand_reg_info ();
2383 init_insn_recog_data ();
2385 /* Some quick check on RTL generated by previous passes. */
2386 if (flag_checking)
2387 check_rtl (false);
2389 lra_in_progress = true;
2391 lra_live_range_iter = lra_coalesce_iter = lra_constraint_iter = 0;
2392 lra_assignment_iter = lra_assignment_iter_after_spill = 0;
2393 lra_inheritance_iter = lra_undo_inheritance_iter = 0;
2394 lra_rematerialization_iter = 0;
2396 setup_reg_spill_flag ();
2398 /* Function remove_scratches can creates new pseudos for clobbers --
2399 so set up lra_constraint_new_regno_start before its call to
2400 permit changing reg classes for pseudos created by this
2401 simplification. */
2402 lra_constraint_new_regno_start = lra_new_regno_start = max_reg_num ();
2403 lra_bad_spill_regno_start = INT_MAX;
2404 remove_scratches ();
2406 /* A function that has a non-local label that can reach the exit
2407 block via non-exceptional paths must save all call-saved
2408 registers. */
2409 if (cfun->has_nonlocal_label && has_nonexceptional_receiver ())
2410 crtl->saves_all_registers = 1;
2412 if (crtl->saves_all_registers)
2413 for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
2414 if (!crtl->abi->clobbers_full_reg_p (i)
2415 && !fixed_regs[i]
2416 && !LOCAL_REGNO (i))
2417 df_set_regs_ever_live (i, true);
2419 /* We don't DF from now and avoid its using because it is to
2420 expensive when a lot of RTL changes are made. */
2421 df_set_flags (DF_NO_INSN_RESCAN);
2422 lra_constraint_insn_stack.create (get_max_uid ());
2423 lra_constraint_insn_stack_bitmap = sbitmap_alloc (get_max_uid ());
2424 bitmap_clear (lra_constraint_insn_stack_bitmap);
2425 lra_live_ranges_init ();
2426 lra_constraints_init ();
2427 lra_curr_reload_num = 0;
2428 push_insns (get_last_insn (), NULL);
2429 /* It is needed for the 1st coalescing. */
2430 bitmap_initialize (&lra_inheritance_pseudos, &reg_obstack);
2431 bitmap_initialize (&lra_split_regs, &reg_obstack);
2432 bitmap_initialize (&lra_optional_reload_pseudos, &reg_obstack);
2433 bitmap_initialize (&lra_subreg_reload_pseudos, &reg_obstack);
2434 live_p = false;
2435 if (maybe_ne (get_frame_size (), 0) && crtl->stack_alignment_needed)
2436 /* If we have a stack frame, we must align it now. The stack size
2437 may be a part of the offset computation for register
2438 elimination. */
2439 assign_stack_local (BLKmode, 0, crtl->stack_alignment_needed);
2440 lra_init_equiv ();
2441 for (;;)
2443 for (;;)
2445 bool reloads_p = lra_constraints (lra_constraint_iter == 0);
2446 /* Constraint transformations may result in that eliminable
2447 hard regs become uneliminable and pseudos which use them
2448 should be spilled. It is better to do it before pseudo
2449 assignments.
2451 For example, rs6000 can make
2452 RS6000_PIC_OFFSET_TABLE_REGNUM uneliminable if we started
2453 to use a constant pool. */
2454 lra_eliminate (false, false);
2455 /* We should try to assign hard registers to scratches even
2456 if there were no RTL transformations in lra_constraints.
2457 Also we should check IRA assignments on the first
2458 iteration as they can be wrong because of early clobbers
2459 operands which are ignored in IRA. */
2460 if (! reloads_p && lra_constraint_iter > 1)
2462 /* Stack is not empty here only when there are changes
2463 during the elimination sub-pass. */
2464 if (bitmap_empty_p (lra_constraint_insn_stack_bitmap))
2465 break;
2466 else
2467 /* If there are no reloads but changing due
2468 elimination, restart the constraint sub-pass
2469 first. */
2470 continue;
2472 /* Do inheritance only for regular algorithms. */
2473 if (! lra_simple_p)
2474 lra_inheritance ();
2475 if (live_p)
2476 lra_clear_live_ranges ();
2477 bool fails_p;
2478 lra_hard_reg_split_p = false;
2481 /* We need live ranges for lra_assign -- so build them.
2482 But don't remove dead insns or change global live
2483 info as we can undo inheritance transformations after
2484 inheritance pseudo assigning. */
2485 lra_create_live_ranges (true, !lra_simple_p);
2486 live_p = true;
2487 /* If we don't spill non-reload and non-inheritance
2488 pseudos, there is no sense to run memory-memory move
2489 coalescing. If inheritance pseudos were spilled, the
2490 memory-memory moves involving them will be removed by
2491 pass undoing inheritance. */
2492 if (lra_simple_p)
2493 lra_assign (fails_p);
2494 else
2496 bool spill_p = !lra_assign (fails_p);
2498 if (lra_undo_inheritance ())
2499 live_p = false;
2500 if (spill_p && ! fails_p)
2502 if (! live_p)
2504 lra_create_live_ranges (true, true);
2505 live_p = true;
2507 if (lra_coalesce ())
2508 live_p = false;
2510 if (! live_p)
2511 lra_clear_live_ranges ();
2513 if (fails_p)
2515 /* It is a very rare case. It is the last hope to
2516 split a hard regno live range for a reload
2517 pseudo. */
2518 if (live_p)
2519 lra_clear_live_ranges ();
2520 live_p = false;
2521 if (! lra_split_hard_reg_for ())
2522 break;
2523 lra_hard_reg_split_p = true;
2526 while (fails_p && !lra_asm_error_p);
2527 if (! live_p) {
2528 /* We need the correct reg notes for work of constraint sub-pass. */
2529 lra_create_live_ranges (true, true);
2530 live_p = true;
2533 /* Don't clear optional reloads bitmap until all constraints are
2534 satisfied as we need to differ them from regular reloads. */
2535 bitmap_clear (&lra_optional_reload_pseudos);
2536 bitmap_clear (&lra_subreg_reload_pseudos);
2537 bitmap_clear (&lra_inheritance_pseudos);
2538 bitmap_clear (&lra_split_regs);
2539 if (! live_p)
2541 /* We need full live info for spilling pseudos into
2542 registers instead of memory. */
2543 lra_create_live_ranges (lra_reg_spill_p, true);
2544 live_p = true;
2546 /* We should check necessity for spilling here as the above live
2547 range pass can remove spilled pseudos. */
2548 if (! lra_need_for_spills_p ())
2549 break;
2550 /* Now we know what pseudos should be spilled. Try to
2551 rematerialize them first. */
2552 if (lra_remat ())
2554 /* We need full live info -- see the comment above. */
2555 lra_create_live_ranges (lra_reg_spill_p, true);
2556 live_p = true;
2557 if (! lra_need_for_spills_p ())
2559 if (lra_need_for_scratch_reg_p ())
2560 continue;
2561 break;
2564 lra_spill ();
2565 /* Assignment of stack slots changes elimination offsets for
2566 some eliminations. So update the offsets here. */
2567 lra_eliminate (false, false);
2568 lra_constraint_new_regno_start = max_reg_num ();
2569 if (lra_bad_spill_regno_start == INT_MAX
2570 && lra_inheritance_iter > LRA_MAX_INHERITANCE_PASSES
2571 && lra_rematerialization_iter > LRA_MAX_REMATERIALIZATION_PASSES)
2572 /* After switching off inheritance and rematerialization
2573 passes, avoid spilling reload pseudos will be created to
2574 prevent LRA cycling in some complicated cases. */
2575 lra_bad_spill_regno_start = lra_constraint_new_regno_start;
2576 lra_assignment_iter_after_spill = 0;
2578 ira_restore_scratches (lra_dump_file);
2579 lra_eliminate (true, false);
2580 lra_final_code_change ();
2581 lra_in_progress = false;
2582 if (live_p)
2583 lra_clear_live_ranges ();
2584 lra_live_ranges_finish ();
2585 lra_constraints_finish ();
2586 finish_reg_info ();
2587 sbitmap_free (lra_constraint_insn_stack_bitmap);
2588 lra_constraint_insn_stack.release ();
2589 finish_insn_recog_data ();
2590 regstat_free_n_sets_and_refs ();
2591 regstat_free_ri ();
2592 reload_completed = 1;
2593 update_inc_notes ();
2595 inserted_p = fixup_abnormal_edges ();
2597 /* We've possibly turned single trapping insn into multiple ones. */
2598 if (cfun->can_throw_non_call_exceptions)
2600 auto_sbitmap blocks (last_basic_block_for_fn (cfun));
2601 bitmap_ones (blocks);
2602 find_many_sub_basic_blocks (blocks);
2605 if (inserted_p)
2606 commit_edge_insertions ();
2608 /* Subsequent passes expect that rtl is unshared, so unshare everything
2609 here. */
2610 unshare_all_rtl_again (get_insns ());
2612 if (flag_checking)
2613 check_rtl (true);
2615 timevar_pop (TV_LRA);
2618 /* Called once per compiler to initialize LRA data once. */
2619 void
2620 lra_init_once (void)
2622 init_insn_code_data_once ();
2625 /* Called once per compiler to finish LRA data which are initialize
2626 once. */
2627 void
2628 lra_finish_once (void)
2630 finish_insn_code_data_once ();