[Ada] Use Is_Generic_Subprogram where possible
[platform/upstream/gcc.git] / gcc / lra-remat.c
1 /* Rematerialize pseudos values.
2    Copyright (C) 2014-2020 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 /* This code objective is to rematerialize spilled pseudo values.  To
22    do this we calculate available insn candidates.  The candidate is
23    available at some point if there is dominated set of insns with the
24    same pattern, the insn inputs are not dying or modified on any path
25    from the set, the outputs are not modified.
26
27    The insns containing memory or spilled pseudos (except for the
28    rematerialized pseudo) are not considered as such insns are not
29    profitable in comparison with regular loads of spilled pseudo
30    values.  That simplifies the implementation as we don't need to
31    deal with memory aliasing.
32
33    To speed up available candidate calculation, we calculate partially
34    available candidates first and use them for initialization of the
35    availability.  That is because (partial) availability sets are
36    sparse.
37
38    The rematerialization sub-pass could be improved further in the
39    following ways:
40
41    o We could make longer live ranges of inputs in the
42      rematerialization candidates if their hard registers are not used
43      for other purposes.  This could be complicated if we need to
44      update BB live info information as LRA does not use
45      DF-infrastructure for compile-time reasons.  This problem could
46      be overcome if constrain making live ranges longer only in BB/EBB
47      scope.
48    o We could use cost-based decision to choose rematerialization insn
49      (currently all insns without memory is can be used).
50    o We could use other free hard regs for unused output pseudos in
51      rematerialization candidates although such cases probably will
52      be very rare.  */
53
54
55 #include "config.h"
56 #include "system.h"
57 #include "coretypes.h"
58 #include "backend.h"
59 #include "rtl.h"
60 #include "df.h"
61 #include "insn-config.h"
62 #include "regs.h"
63 #include "memmodel.h"
64 #include "ira.h"
65 #include "recog.h"
66 #include "lra.h"
67 #include "lra-int.h"
68 #include "function-abi.h"
69
70 /* Number of candidates for rematerialization.  */
71 static unsigned int cands_num;
72
73 /* Bitmap used for different calculations.  */
74 static bitmap_head temp_bitmap;
75
76 /* Registers accessed via subreg_p.  */
77 static bitmap_head subreg_regs;
78
79 typedef struct cand *cand_t;
80 typedef const struct cand *const_cand_t;
81
82 /* Insn candidates for rematerialization.  The candidate insn should
83    have the following properies:
84    o no any memory (as access to memory is non-profitable)
85    o no INOUT regs (it means no non-paradoxical subreg of output reg)
86    o one output spilled pseudo (or reload pseudo of a spilled pseudo)
87    o all other pseudos are with assigned hard regs.  */
88 struct cand
89 {
90   /* Index of the candidates in all_cands. */
91   int index;
92   /* Insn pseudo regno for rematerialization.  */
93   int regno;
94   /* The candidate insn.  */
95   rtx_insn *insn;
96   /* Non-negative if a reload pseudo is in the insn instead of the
97      pseudo for rematerialization.  */
98   int reload_regno;
99   /* Number of the operand containing the regno or its reload
100      regno.  */
101   int nop;
102   /* Next candidate for the same regno.  */
103   cand_t next_regno_cand;
104 };
105
106 /* Vector containing all candidates.  */
107 static vec<cand_t> all_cands;
108 /* Map: insn -> candidate representing it.  It is null if the insn cannot
109    be used for rematerialization.  */
110 static cand_t *insn_to_cand;
111 /* A secondary map, for candidates that involve two insns, where the
112    second one makes the equivalence.  The candidate must not be used
113    before seeing this activation insn.  */
114 static cand_t *insn_to_cand_activation;
115
116 /* Map regno -> candidates can be used for the regno
117    rematerialization.  */
118 static cand_t *regno_cands;
119
120 /* Data about basic blocks used for the rematerialization
121    sub-pass.  */
122 class remat_bb_data
123 {
124 public:
125   /* Basic block about which the below data are.  */
126   basic_block bb;
127   /* Registers changed in the basic block: */
128   bitmap_head changed_regs;
129   /* Registers becoming dead in the BB.  */
130   bitmap_head dead_regs;
131   /* Cands present in the BB whose in/out regs are not changed after
132      the cands occurence and are not dead (except the reload
133      regno).  */
134   bitmap_head gen_cands;
135   bitmap_head livein_cands; /* cands whose inputs live at the BB start.  */
136   bitmap_head pavin_cands; /* cands partially available at BB entry.  */
137   bitmap_head pavout_cands; /* cands partially available at BB exit.  */
138   bitmap_head avin_cands; /* cands available at the entry of the BB.  */
139   bitmap_head avout_cands; /* cands available at the exit of the BB.  */
140 };
141
142 /* Array for all BB data.  Indexed by the corresponding BB index.  */
143 typedef class remat_bb_data *remat_bb_data_t;
144
145 /* Basic blocks for data flow problems -- all bocks except the special
146    ones.  */
147 static bitmap_head all_blocks;
148
149 /* All basic block data are referred through the following array.  */
150 static remat_bb_data_t remat_bb_data;
151
152 /* Two small functions for access to the bb data.  */
153 static inline remat_bb_data_t
154 get_remat_bb_data (basic_block bb)
155 {
156   return &remat_bb_data[(bb)->index];
157 }
158
159 static inline remat_bb_data_t
160 get_remat_bb_data_by_index (int index)
161 {
162   return &remat_bb_data[index];
163 }
164
165 \f
166
167 /* Hash table for the candidates.  Different insns (e.g. structurally
168    the same insns or even insns with different unused output regs) can
169    be represented by the same candidate in the table.  */
170 static htab_t cand_table;
171
172 /* Hash function for candidate CAND.  */
173 static hashval_t
174 cand_hash (const void *cand)
175 {
176   const_cand_t c = (const_cand_t) cand;
177   lra_insn_recog_data_t id = lra_get_insn_recog_data (c->insn);
178   struct lra_static_insn_data *static_id = id->insn_static_data;
179   int nops = static_id->n_operands;
180   hashval_t hash = 0;
181
182   for (int i = 0; i < nops; i++)
183     if (i == c->nop)
184       hash = iterative_hash_object (c->regno, hash);
185     else if (static_id->operand[i].type == OP_IN)
186       hash = iterative_hash_object (*id->operand_loc[i], hash);
187   return hash;
188 }
189
190 /* Equal function for candidates CAND1 and CAND2.  They are equal if
191    the corresponding candidate insns have the same code, the same
192    regno for rematerialization, the same input operands.  */
193 static int
194 cand_eq_p (const void *cand1, const void *cand2)
195 {
196   const_cand_t c1 = (const_cand_t) cand1;
197   const_cand_t c2 = (const_cand_t) cand2;
198   lra_insn_recog_data_t id1 = lra_get_insn_recog_data (c1->insn);
199   lra_insn_recog_data_t id2 = lra_get_insn_recog_data (c2->insn);
200   struct lra_static_insn_data *static_id1 = id1->insn_static_data;
201   int nops = static_id1->n_operands;
202
203   if (c1->regno != c2->regno
204       || INSN_CODE (c1->insn) < 0
205       || INSN_CODE (c1->insn) != INSN_CODE (c2->insn))
206     return false;
207   gcc_assert (c1->nop == c2->nop);
208   for (int i = 0; i < nops; i++)
209     if (i != c1->nop && static_id1->operand[i].type == OP_IN
210         && *id1->operand_loc[i] != *id2->operand_loc[i])
211       return false;
212   return true;
213 }
214
215 /* Insert candidate CAND into the table if it is not there yet.
216    Return candidate which is in the table.  */
217 static cand_t
218 insert_cand (cand_t cand)
219 {
220   void **entry_ptr;
221
222   entry_ptr = htab_find_slot (cand_table, cand, INSERT);
223   if (*entry_ptr == NULL)
224     *entry_ptr = (void *) cand;
225   return (cand_t) *entry_ptr;
226 }
227
228 /* Free candidate CAND memory.  */
229 static void
230 free_cand (void *cand)
231 {
232   free (cand);
233 }
234
235 /* Initiate the candidate table.  */
236 static void
237 initiate_cand_table (void)
238 {
239   cand_table = htab_create (8000, cand_hash, cand_eq_p,
240                             (htab_del) free_cand);
241 }
242
243 /* Finish the candidate table.  */
244 static void
245 finish_cand_table (void)
246 {
247   htab_delete (cand_table);
248 }
249
250 \f
251
252 /* Return true if X contains memory or some UNSPEC.  We cannot just
253    check insn operands as memory or unspec might be not an operand
254    itself but contain an operand.  Insn with memory access is not
255    profitable for rematerialization.  Rematerialization of UNSPEC
256    might result in wrong code generation as the UNPEC effect is
257    unknown (e.g. generating a label).  */
258 static bool
259 bad_for_rematerialization_p (rtx x)
260 {
261   int i, j;
262   const char *fmt;
263   enum rtx_code code;
264
265   if (MEM_P (x) || GET_CODE (x) == UNSPEC || GET_CODE (x) == UNSPEC_VOLATILE)
266     return true;
267   code = GET_CODE (x);
268   fmt = GET_RTX_FORMAT (code);
269   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
270     {
271       if (fmt[i] == 'e')
272         {
273           if (bad_for_rematerialization_p (XEXP (x, i)))
274             return true;
275         }
276       else if (fmt[i] == 'E')
277         {
278           for (j = XVECLEN (x, i) - 1; j >= 0; j--)
279             if (bad_for_rematerialization_p (XVECEXP (x, i, j)))
280               return true;
281         }
282     }
283   return false;
284 }
285
286 /* If INSN cannot be used for rematerialization, return negative
287    value.  If INSN can be considered as a candidate for
288    rematerialization, return value which is the operand number of the
289    pseudo for which the insn can be used for rematerialization.  Here
290    we consider the insns without any memory, spilled pseudo (except
291    for the rematerialization pseudo), or dying or unused regs.  */
292 static int
293 operand_to_remat (rtx_insn *insn)
294 {
295   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
296   struct lra_static_insn_data *static_id = id->insn_static_data;
297   struct lra_insn_reg *reg, *found_reg = NULL;
298
299   /* Don't rematerialize insns which can change PC.  */
300   if (JUMP_P (insn) || CALL_P (insn))
301     return -1;
302   /* First find a pseudo which can be rematerialized.  */
303   for (reg = id->regs; reg != NULL; reg = reg->next)
304     {
305       /* True FRAME_POINTER_NEEDED might be because we cannot follow
306          changing sp offsets, e.g. alloca is used.  If the insn contains
307          stack pointer in such case, we cannot rematerialize it as we
308          cannot know sp offset at a rematerialization place.  */
309       if (reg->regno == STACK_POINTER_REGNUM && frame_pointer_needed)
310         return -1;
311       else if (reg->type == OP_OUT && ! reg->subreg_p
312                && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL)
313         {
314           /* We permits only one spilled reg.  */
315           if (found_reg != NULL)
316             return -1;
317           found_reg = reg;
318         }
319       /* IRA calculates conflicts separately for subregs of two words
320          pseudo.  Even if the pseudo lives, e.g. one its subreg can be
321          used lately, another subreg hard register can be already used
322          for something else.  In such case, it is not safe to
323          rematerialize the insn.  */
324       if (reg->regno >= FIRST_PSEUDO_REGISTER
325           && bitmap_bit_p (&subreg_regs, reg->regno))
326         return -1;
327
328       /* Don't allow hard registers to be rematerialized.  */
329       if (reg->regno < FIRST_PSEUDO_REGISTER)
330         return -1;
331     }
332   if (found_reg == NULL)
333     return -1;
334   if (found_reg->regno < FIRST_PSEUDO_REGISTER)
335     return -1;
336   if (bad_for_rematerialization_p (PATTERN (insn)))
337     return -1;
338   /* Check the other regs are not spilled. */
339   for (reg = id->regs; reg != NULL; reg = reg->next)
340     if (found_reg == reg)
341       continue;
342     else if (reg->type == OP_INOUT)
343       return -1;
344     else if (reg->regno >= FIRST_PSEUDO_REGISTER
345              && reg_renumber[reg->regno] < 0)
346       /* Another spilled reg.  */
347       return -1;
348     else if (reg->type == OP_IN)
349       {
350         if (find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
351           /* We don't want to make live ranges longer.  */
352           return -1;
353         /* Check that there is no output reg as the input one.  */
354         for (struct lra_insn_reg *reg2 = id->regs;
355              reg2 != NULL;
356              reg2 = reg2->next)
357           if (reg2->type == OP_OUT && reg->regno == reg2->regno)
358             return -1;
359         if (reg->regno < FIRST_PSEUDO_REGISTER)
360           for (struct lra_insn_reg *reg2 = static_id->hard_regs;
361                reg2 != NULL;
362                reg2 = reg2->next)
363             if (reg2->type == OP_OUT
364                 && reg->regno <= reg2->regno
365                 && (reg2->regno
366                     < (int) end_hard_regno (reg->biggest_mode, reg->regno)))
367               return -1;
368       }
369   /* Check hard coded insn registers.  */
370   for (struct lra_insn_reg *reg = static_id->hard_regs;
371        reg != NULL;
372        reg = reg->next)
373     if (reg->type == OP_INOUT)
374       return -1;
375     else if (reg->type == OP_IN)
376       {
377         /* Check that there is no output hard reg as the input
378            one.  */
379           for (struct lra_insn_reg *reg2 = static_id->hard_regs;
380                reg2 != NULL;
381                reg2 = reg2->next)
382             if (reg2->type == OP_OUT && reg->regno == reg2->regno)
383                 return -1;
384       }
385   /* Find the rematerialization operand.  */
386   int nop = static_id->n_operands;
387   for (int i = 0; i < nop; i++)
388     if (REG_P (*id->operand_loc[i])
389         && (int) REGNO (*id->operand_loc[i]) == found_reg->regno)
390       return i;
391   return -1;
392 }
393
394 /* Create candidate for INSN with rematerialization operand NOP and
395    REGNO.  Insert the candidate into the table and set up the
396    corresponding INSN_TO_CAND element.  */
397 static void
398 create_cand (rtx_insn *insn, int nop, int regno, rtx_insn *activation = NULL)
399 {
400   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
401   rtx reg = *id->operand_loc[nop];
402   gcc_assert (REG_P (reg));
403   int op_regno = REGNO (reg);
404   gcc_assert (op_regno >= FIRST_PSEUDO_REGISTER);
405   cand_t cand = XNEW (struct cand);
406   cand->insn = insn;
407   cand->nop = nop;
408   cand->regno = regno;
409   cand->reload_regno = op_regno == regno ? -1 : op_regno;
410   gcc_assert (cand->regno >= 0);
411   cand_t cand_in_table = insert_cand (cand);
412   insn_to_cand[INSN_UID (insn)] = cand_in_table;
413   if (cand != cand_in_table)
414     free (cand);
415   else
416     {
417       /* A new cand.  */
418       cand->index = all_cands.length ();
419       all_cands.safe_push (cand);
420       cand->next_regno_cand = regno_cands[cand->regno];
421       regno_cands[cand->regno] = cand;
422     }
423   if (activation)
424     insn_to_cand_activation[INSN_UID (activation)] = cand_in_table;
425 }
426
427 /* Create rematerialization candidates (inserting them into the
428    table).  */
429 static void
430 create_cands (void)
431 {
432   rtx_insn *insn;
433   struct potential_cand
434   {
435     rtx_insn *insn;
436     int nop;
437   };
438   struct potential_cand *regno_potential_cand;
439
440   /* Create candidates.  */
441   regno_potential_cand = XCNEWVEC (struct potential_cand, max_reg_num ());
442   for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
443     if (NONDEBUG_INSN_P (insn))
444       {
445         lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
446         int keep_regno = -1;
447         rtx set = single_set (insn);
448         int nop;
449
450         /* See if this is an output reload for a previous insn.  */
451         if (set != NULL
452             && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set)))
453           {
454             rtx dstreg = SET_DEST (set);
455             int src_regno = REGNO (SET_SRC (set));
456             int dst_regno = REGNO (dstreg);
457             rtx_insn *insn2 = regno_potential_cand[src_regno].insn;
458
459             if (insn2 != NULL 
460                 && dst_regno >= FIRST_PSEUDO_REGISTER
461                 && reg_renumber[dst_regno] < 0
462                 && BLOCK_FOR_INSN (insn2) == BLOCK_FOR_INSN (insn))
463               {
464                 create_cand (insn2, regno_potential_cand[src_regno].nop,
465                              dst_regno, insn);
466                 goto done;
467               }
468           }
469
470         nop = operand_to_remat (insn);
471         if (nop >= 0)
472           {
473             gcc_assert (REG_P (*id->operand_loc[nop]));
474             int regno = REGNO (*id->operand_loc[nop]);
475             gcc_assert (regno >= FIRST_PSEUDO_REGISTER);
476             /* If we're setting an unrenumbered pseudo, make a candidate immediately.
477                If it's an output reload register, save it for later; the code above
478                looks for output reload insns later on.  */
479             if (reg_renumber[regno] < 0)
480               create_cand (insn, nop, regno);
481             else if (regno >= lra_constraint_new_regno_start)
482               {
483                 regno_potential_cand[regno].insn = insn;
484                 regno_potential_cand[regno].nop = nop;
485                 keep_regno = regno;
486               }
487           }
488
489       done:
490         for (struct lra_insn_reg *reg = id->regs; reg != NULL; reg = reg->next)
491           if (reg->type != OP_IN && reg->regno != keep_regno
492               && reg->regno >= FIRST_PSEUDO_REGISTER)
493             regno_potential_cand[reg->regno].insn = NULL;
494       }
495   cands_num = all_cands.length ();
496   free (regno_potential_cand);
497 }
498
499 \f
500
501 /* Create and initialize BB data.  */
502 static void
503 create_remat_bb_data (void)
504 {
505   basic_block bb;
506   remat_bb_data_t bb_info;
507
508   remat_bb_data = XNEWVEC (class remat_bb_data,
509                            last_basic_block_for_fn (cfun));
510   FOR_ALL_BB_FN (bb, cfun)
511     {
512       gcc_checking_assert (bb->index >= 0
513                            && bb->index < last_basic_block_for_fn (cfun));
514       bb_info = get_remat_bb_data (bb);
515       bb_info->bb = bb;
516       bitmap_initialize (&bb_info->changed_regs, &reg_obstack);
517       bitmap_initialize (&bb_info->dead_regs, &reg_obstack);
518       bitmap_initialize (&bb_info->gen_cands, &reg_obstack);
519       bitmap_initialize (&bb_info->livein_cands, &reg_obstack);
520       bitmap_initialize (&bb_info->pavin_cands, &reg_obstack);
521       bitmap_initialize (&bb_info->pavout_cands, &reg_obstack);
522       bitmap_initialize (&bb_info->avin_cands, &reg_obstack);
523       bitmap_initialize (&bb_info->avout_cands, &reg_obstack);
524     }
525 }
526
527 /* Dump all candidates to DUMP_FILE.  */
528 static void
529 dump_cands (FILE *dump_file)
530 {
531   int i;
532   cand_t cand;
533
534   fprintf (dump_file, "\nCands:\n");
535   for (i = 0; i < (int) cands_num; i++)
536     {
537       cand = all_cands[i];
538       fprintf (dump_file, "%d (nop=%d, remat_regno=%d, reload_regno=%d):\n",
539                i, cand->nop, cand->regno, cand->reload_regno);
540       print_inline_rtx (dump_file, cand->insn, 6);
541       fprintf (dump_file, "\n");
542     }
543 }
544
545 /* Dump all candidates and BB data.  */
546 static void
547 dump_candidates_and_remat_bb_data (void)
548 {
549   basic_block bb;
550
551   if (lra_dump_file == NULL)
552     return;
553   dump_cands (lra_dump_file);
554   FOR_EACH_BB_FN (bb, cfun)
555     {
556       fprintf (lra_dump_file, "\nBB %d:\n", bb->index);
557       /* Livein */
558       fprintf (lra_dump_file, "  register live in:");
559       dump_regset (df_get_live_in (bb), lra_dump_file);
560       putc ('\n', lra_dump_file);
561       /* Liveout */
562       fprintf (lra_dump_file, "  register live out:");
563       dump_regset (df_get_live_out (bb), lra_dump_file);
564       putc ('\n', lra_dump_file);
565       /* Changed/dead regs: */
566       fprintf (lra_dump_file, "  changed regs:");
567       dump_regset (&get_remat_bb_data (bb)->changed_regs, lra_dump_file);
568       putc ('\n', lra_dump_file);
569       fprintf (lra_dump_file, "  dead regs:");
570       dump_regset (&get_remat_bb_data (bb)->dead_regs, lra_dump_file);
571       putc ('\n', lra_dump_file);
572       lra_dump_bitmap_with_title ("cands generated in BB",
573                                   &get_remat_bb_data (bb)->gen_cands, bb->index);
574       lra_dump_bitmap_with_title ("livein cands in BB",
575                                   &get_remat_bb_data (bb)->livein_cands, bb->index);
576       lra_dump_bitmap_with_title ("pavin cands in BB",
577                                   &get_remat_bb_data (bb)->pavin_cands, bb->index);
578       lra_dump_bitmap_with_title ("pavout cands in BB",
579                                   &get_remat_bb_data (bb)->pavout_cands, bb->index);
580       lra_dump_bitmap_with_title ("avin cands in BB",
581                                   &get_remat_bb_data (bb)->avin_cands, bb->index);
582       lra_dump_bitmap_with_title ("avout cands in BB",
583                                   &get_remat_bb_data (bb)->avout_cands, bb->index);
584     }
585   fprintf (lra_dump_file, "subreg regs:");
586   dump_regset (&subreg_regs, lra_dump_file);
587   putc ('\n', lra_dump_file);
588 }
589
590 /* Free all BB data.  */
591 static void
592 finish_remat_bb_data (void)
593 {
594   basic_block bb;
595
596   FOR_EACH_BB_FN (bb, cfun)
597     {
598       bitmap_clear (&get_remat_bb_data (bb)->avout_cands);
599       bitmap_clear (&get_remat_bb_data (bb)->avin_cands);
600       bitmap_clear (&get_remat_bb_data (bb)->pavout_cands);
601       bitmap_clear (&get_remat_bb_data (bb)->pavin_cands);
602       bitmap_clear (&get_remat_bb_data (bb)->livein_cands);
603       bitmap_clear (&get_remat_bb_data (bb)->gen_cands);
604       bitmap_clear (&get_remat_bb_data (bb)->dead_regs);
605       bitmap_clear (&get_remat_bb_data (bb)->changed_regs);
606     }
607   free (remat_bb_data);
608 }
609
610 \f
611
612 /* Update changed_regs, dead_regs, subreg_regs of BB from INSN.  */
613 static void
614 set_bb_regs (basic_block bb, rtx_insn *insn)
615 {
616   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
617   remat_bb_data_t bb_info = get_remat_bb_data (bb);
618   struct lra_insn_reg *reg;
619
620   for (reg = id->regs; reg != NULL; reg = reg->next)
621     {
622       unsigned regno = reg->regno;
623       if (reg->type != OP_IN)
624         bitmap_set_bit (&bb_info->changed_regs, regno);
625       else if (find_regno_note (insn, REG_DEAD, regno) != NULL)
626         bitmap_set_bit (&bb_info->dead_regs, regno);
627       if (regno >= FIRST_PSEUDO_REGISTER && reg->subreg_p)
628         bitmap_set_bit (&subreg_regs, regno);
629     }
630   if (CALL_P (insn))
631     {
632       /* Partially-clobbered registers might still be live.  */
633       HARD_REG_SET clobbers = insn_callee_abi (insn).full_reg_clobbers ();
634       bitmap_ior_into (&get_remat_bb_data (bb)->dead_regs,
635                        bitmap_view<HARD_REG_SET> (clobbers));
636     }
637 }
638
639 /* Calculate changed_regs and dead_regs for each BB.  */
640 static void
641 calculate_local_reg_remat_bb_data (void)
642 {
643   basic_block bb;
644   rtx_insn *insn;
645
646   FOR_EACH_BB_FN (bb, cfun)
647     FOR_BB_INSNS (bb, insn)
648       if (NONDEBUG_INSN_P (insn))
649         set_bb_regs (bb, insn);
650 }
651
652 \f
653
654 /* Return true if REG overlaps an input operand of INSN.  */
655 static bool
656 reg_overlap_for_remat_p (lra_insn_reg *reg, rtx_insn *insn)
657 {
658   int iter;
659   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
660   struct lra_static_insn_data *static_id = id->insn_static_data;
661   unsigned regno = reg->regno;
662   int nregs;
663
664   if (regno >= FIRST_PSEUDO_REGISTER && reg_renumber[regno] >= 0)
665     regno = reg_renumber[regno];
666   if (regno >= FIRST_PSEUDO_REGISTER)
667     nregs = 1;
668   else
669     nregs = hard_regno_nregs (regno, reg->biggest_mode);
670
671   struct lra_insn_reg *reg2;
672
673   for (iter = 0; iter < 2; iter++)
674     for (reg2 = (iter == 0 ? id->regs : static_id->hard_regs);
675          reg2 != NULL;
676          reg2 = reg2->next)
677       {
678         if (reg2->type != OP_IN)
679           continue;
680         unsigned regno2 = reg2->regno;
681         int nregs2;
682
683         if (regno2 >= FIRST_PSEUDO_REGISTER && reg_renumber[regno2] >= 0)
684           regno2 = reg_renumber[regno2];
685         if (regno2 >= FIRST_PSEUDO_REGISTER)
686           nregs2 = 1;
687         else
688           nregs2 = hard_regno_nregs (regno2, reg->biggest_mode);
689
690         if ((regno2 + nregs2 - 1 >= regno && regno2 < regno + nregs)
691             || (regno + nregs - 1 >= regno2 && regno < regno2 + nregs2))
692           return true;
693       }
694   return false;
695 }
696
697 /* Return true if a call used register is an input operand of INSN.  */
698 static bool
699 call_used_input_regno_present_p (const function_abi &abi, rtx_insn *insn)
700 {
701   int iter;
702   lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
703   struct lra_static_insn_data *static_id = id->insn_static_data;
704   struct lra_insn_reg *reg;
705
706   for (iter = 0; iter < 2; iter++)
707     for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
708          reg != NULL;
709          reg = reg->next)
710       if (reg->type == OP_IN
711           && reg->regno < FIRST_PSEUDO_REGISTER
712           && abi.clobbers_reg_p (reg->biggest_mode, reg->regno))
713         return true;
714   return false;
715 }
716
717 /* Calculate livein_cands for each BB.  */
718 static void
719 calculate_livein_cands (void)
720 {
721   basic_block bb;
722
723   FOR_EACH_BB_FN (bb, cfun)
724     {
725       bitmap livein_regs = df_get_live_in (bb);
726       bitmap livein_cands = &get_remat_bb_data (bb)->livein_cands;
727       for (unsigned int i = 0; i < cands_num; i++)
728         {
729           cand_t cand = all_cands[i];
730           lra_insn_recog_data_t id = lra_get_insn_recog_data (cand->insn);
731           struct lra_insn_reg *reg;
732
733           for (reg = id->regs; reg != NULL; reg = reg->next)
734             if (reg->type == OP_IN && ! bitmap_bit_p (livein_regs, reg->regno))
735               break;
736           if (reg == NULL)
737             bitmap_set_bit (livein_cands, i);
738         }
739     }
740 }
741
742 /* Calculate gen_cands for each BB.  */
743 static void
744 calculate_gen_cands (void)
745 {
746   basic_block bb;
747   bitmap gen_cands;
748   rtx_insn *insn;
749
750   FOR_EACH_BB_FN (bb, cfun)
751     {
752       gen_cands = &get_remat_bb_data (bb)->gen_cands;
753       auto_bitmap gen_insns (&reg_obstack);
754       FOR_BB_INSNS (bb, insn)
755         if (INSN_P (insn))
756           {
757             lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
758             struct lra_static_insn_data *static_id = id->insn_static_data;
759             struct lra_insn_reg *reg;
760             unsigned int uid;
761             bitmap_iterator bi;
762             cand_t cand;
763             rtx set;
764             int iter;
765             int src_regno = -1, dst_regno = -1;
766
767             if ((set = single_set (insn)) != NULL
768                 && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set)))
769               {
770                 src_regno = REGNO (SET_SRC (set));
771                 dst_regno = REGNO (SET_DEST (set));
772               }
773
774             /* Update gen_cands:  */
775             bitmap_clear (&temp_bitmap);
776             for (iter = 0; iter < 2; iter++)
777               for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
778                    reg != NULL;
779                    reg = reg->next)
780                 if (reg->type != OP_IN
781                     || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
782                   EXECUTE_IF_SET_IN_BITMAP (gen_insns, 0, uid, bi)
783                     {
784                       rtx_insn *insn2 = lra_insn_recog_data[uid]->insn;
785                       
786                       cand = insn_to_cand[INSN_UID (insn2)];
787                       gcc_assert (cand != NULL);
788                       /* Ignore the reload insn.  */
789                       if (src_regno == cand->reload_regno
790                           && dst_regno == cand->regno)
791                         continue;
792                       if (cand->regno == reg->regno
793                           || reg_overlap_for_remat_p (reg, insn2))
794                         {
795                           bitmap_clear_bit (gen_cands, cand->index);
796                           bitmap_set_bit (&temp_bitmap, uid);
797                         }
798                     }
799             
800             if (CALL_P (insn))
801               {
802                 function_abi callee_abi = insn_callee_abi (insn);
803                 EXECUTE_IF_SET_IN_BITMAP (gen_insns, 0, uid, bi)
804                   {
805                     rtx_insn *insn2 = lra_insn_recog_data[uid]->insn;
806                   
807                     cand = insn_to_cand[INSN_UID (insn2)];
808                     gcc_assert (cand != NULL);
809                     if (call_used_input_regno_present_p (callee_abi, insn2))
810                       {
811                         bitmap_clear_bit (gen_cands, cand->index);
812                         bitmap_set_bit (&temp_bitmap, uid);
813                       }
814                   }
815               }
816             bitmap_and_compl_into (gen_insns, &temp_bitmap);
817
818             cand = insn_to_cand[INSN_UID (insn)];
819             if (cand != NULL)
820               {
821                 bitmap_set_bit (gen_cands, cand->index);
822                 bitmap_set_bit (gen_insns, INSN_UID (insn));
823               }
824           }
825     }  
826 }
827
828 \f
829
830 /* The common transfer function used by the DF equation solver to
831    propagate (partial) availability info BB_IN to BB_OUT through block
832    with BB_INDEX according to the following equation:
833
834       bb.out =  ((bb.in & bb.livein) - bb.killed) OR  bb.gen
835 */
836 static bool
837 cand_trans_fun (int bb_index, bitmap bb_in, bitmap bb_out)
838 {
839   remat_bb_data_t bb_info;
840   bitmap bb_livein, bb_changed_regs, bb_dead_regs;
841   unsigned int cid;
842   bitmap_iterator bi;
843
844   bb_info = get_remat_bb_data_by_index (bb_index);
845   bb_livein = &bb_info->livein_cands;
846   bb_changed_regs = &bb_info->changed_regs;
847   bb_dead_regs = &bb_info->dead_regs;
848   /* Calculate killed avin cands -- cands whose regs are changed or
849      becoming dead in the BB.  We calculate it here as we hope that
850      repeated calculations are compensated by smaller size of BB_IN in
851      comparison with all candidates number.  */
852   bitmap_clear (&temp_bitmap);
853   EXECUTE_IF_SET_IN_BITMAP (bb_in, 0, cid, bi)
854     {
855       cand_t cand = all_cands[cid];
856       lra_insn_recog_data_t id = lra_get_insn_recog_data (cand->insn);
857       struct lra_insn_reg *reg;
858
859       if (! bitmap_bit_p (bb_livein, cid))
860         {
861           bitmap_set_bit (&temp_bitmap, cid);
862           continue;
863         }
864       for (reg = id->regs; reg != NULL; reg = reg->next)
865         /* Ignore all outputs which are not the regno for
866            rematerialization.  */
867         if (reg->type == OP_OUT && reg->regno != cand->regno)
868           continue;
869         else if (bitmap_bit_p (bb_changed_regs, reg->regno)
870                  || bitmap_bit_p (bb_dead_regs, reg->regno))
871           {
872             bitmap_set_bit (&temp_bitmap, cid);
873             break;
874           }
875       /* Check regno for rematerialization.  */
876       if (bitmap_bit_p (bb_changed_regs, cand->regno)
877           || bitmap_bit_p (bb_dead_regs, cand->regno))
878         bitmap_set_bit (&temp_bitmap, cid);
879     }
880   return bitmap_ior_and_compl (bb_out,
881                                &bb_info->gen_cands, bb_in, &temp_bitmap);
882 }
883
884 \f
885
886 /* The transfer function used by the DF equation solver to propagate
887    partial candidate availability info through block with BB_INDEX
888    according to the following equation:
889
890      bb.pavout = ((bb.pavin & bb.livein) - bb.killed) OR bb.gen
891 */
892 static bool
893 cand_pav_trans_fun (int bb_index)
894 {
895   remat_bb_data_t bb_info;
896
897   bb_info = get_remat_bb_data_by_index (bb_index);
898   return cand_trans_fun (bb_index, &bb_info->pavin_cands,
899                          &bb_info->pavout_cands);
900 }
901
902 /* The confluence function used by the DF equation solver to set up
903    cand_pav info for a block BB without predecessor.  */
904 static void
905 cand_pav_con_fun_0 (basic_block bb)
906 {
907   bitmap_clear (&get_remat_bb_data (bb)->pavin_cands);
908 }
909
910 /* The confluence function used by the DF equation solver to propagate
911    partial candidate availability info from predecessor to successor
912    on edge E (pred->bb) according to the following equation:
913
914       bb.pavin_cands = 0 for entry block | OR (pavout_cands of predecessors)
915  */
916 static bool
917 cand_pav_con_fun_n (edge e)
918 {
919   basic_block pred = e->src;
920   basic_block bb = e->dest;
921   remat_bb_data_t bb_info;
922   bitmap bb_pavin, pred_pavout;
923   
924   bb_info = get_remat_bb_data (bb);
925   bb_pavin = &bb_info->pavin_cands;
926   pred_pavout = &get_remat_bb_data (pred)->pavout_cands;
927   return bitmap_ior_into (bb_pavin, pred_pavout);
928 }
929
930 \f
931
932 /* The transfer function used by the DF equation solver to propagate
933    candidate availability info through block with BB_INDEX according
934    to the following equation:
935
936       bb.avout =  ((bb.avin & bb.livein) - bb.killed) OR  bb.gen
937 */
938 static bool
939 cand_av_trans_fun (int bb_index)
940 {
941   remat_bb_data_t bb_info;
942
943   bb_info = get_remat_bb_data_by_index (bb_index);
944   return cand_trans_fun (bb_index, &bb_info->avin_cands,
945                          &bb_info->avout_cands);
946 }
947
948 /* The confluence function used by the DF equation solver to set up
949    cand_av info for a block BB without predecessor.  */
950 static void
951 cand_av_con_fun_0 (basic_block bb)
952 {
953   bitmap_clear (&get_remat_bb_data (bb)->avin_cands);
954 }
955
956 /* The confluence function used by the DF equation solver to propagate
957    cand_av info from predecessor to successor on edge E (pred->bb)
958    according to the following equation:
959
960       bb.avin_cands = 0 for entry block | AND (avout_cands of predecessors)
961  */
962 static bool
963 cand_av_con_fun_n (edge e)
964 {
965   basic_block pred = e->src;
966   basic_block bb = e->dest;
967   remat_bb_data_t bb_info;
968   bitmap bb_avin, pred_avout;
969   
970   bb_info = get_remat_bb_data (bb);
971   bb_avin = &bb_info->avin_cands;
972   pred_avout = &get_remat_bb_data (pred)->avout_cands;
973   return bitmap_and_into (bb_avin, pred_avout);
974 }
975
976 /* Calculate available candidates for each BB.  */
977 static void
978 calculate_global_remat_bb_data (void)
979 {
980   basic_block bb;
981
982   df_simple_dataflow
983     (DF_FORWARD, NULL, cand_pav_con_fun_0, cand_pav_con_fun_n,
984      cand_pav_trans_fun, &all_blocks,
985      df_get_postorder (DF_FORWARD), df_get_n_blocks (DF_FORWARD));
986   /* Initialize avin by pavin.  */
987   FOR_EACH_BB_FN (bb, cfun)
988     bitmap_copy (&get_remat_bb_data (bb)->avin_cands,
989                  &get_remat_bb_data (bb)->pavin_cands);
990   df_simple_dataflow
991     (DF_FORWARD, NULL, cand_av_con_fun_0, cand_av_con_fun_n,
992      cand_av_trans_fun, &all_blocks,
993      df_get_postorder (DF_FORWARD), df_get_n_blocks (DF_FORWARD));
994 }
995
996 \f
997
998 /* Setup sp offset attribute to SP_OFFSET for all INSNS.  */
999 static void
1000 change_sp_offset (rtx_insn *insns, poly_int64 sp_offset)
1001 {
1002   for (rtx_insn *insn = insns; insn != NULL; insn = NEXT_INSN (insn))
1003     eliminate_regs_in_insn (insn, false, false, sp_offset);
1004 }
1005
1006 /* Return start hard register of REG (can be a hard or a pseudo reg)
1007    or -1 (if it is a spilled pseudo).  Return number of hard registers
1008    occupied by REG through parameter NREGS if the start hard reg is
1009    not negative.  */
1010 static int
1011 get_hard_regs (struct lra_insn_reg *reg, int &nregs)
1012 {
1013   int regno = reg->regno;
1014   int hard_regno = regno < FIRST_PSEUDO_REGISTER ? regno : reg_renumber[regno];
1015
1016   if (hard_regno >= 0)
1017     nregs = hard_regno_nregs (hard_regno, reg->biggest_mode);
1018   return hard_regno;
1019 }
1020
1021 /* Make copy of and register scratch pseudos in rematerialized insn
1022    REMAT_INSN.  */
1023 static void
1024 update_scratch_ops (rtx_insn *remat_insn)
1025 {
1026   lra_insn_recog_data_t id = lra_get_insn_recog_data (remat_insn);
1027   struct lra_static_insn_data *static_id = id->insn_static_data;
1028   for (int i = 0; i < static_id->n_operands; i++)
1029     {
1030       rtx *loc = id->operand_loc[i];
1031       if (! REG_P (*loc))
1032         continue;
1033       int regno = REGNO (*loc);
1034       if (! lra_former_scratch_p (regno))
1035         continue;
1036       *loc = lra_create_new_reg (GET_MODE (*loc), *loc,
1037                                  lra_get_allocno_class (regno),
1038                                  "scratch pseudo copy");
1039       lra_register_new_scratch_op (remat_insn, i, id->icode);
1040     }
1041   
1042 }
1043
1044 /* Insert rematerialization insns using the data-flow data calculated
1045    earlier.  */
1046 static bool
1047 do_remat (void)
1048 {
1049   unsigned regno;
1050   rtx_insn *insn;
1051   basic_block bb;
1052   bool changed_p = false;
1053   /* Living hard regs and hard registers of living pseudos.  */
1054   HARD_REG_SET live_hard_regs;
1055   bitmap_iterator bi;
1056
1057   auto_bitmap avail_cands (&reg_obstack);
1058   auto_bitmap active_cands (&reg_obstack);
1059   FOR_EACH_BB_FN (bb, cfun)
1060     {
1061       CLEAR_HARD_REG_SET (live_hard_regs);
1062       EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb), 0, regno, bi)
1063         {
1064           int hard_regno = regno < FIRST_PSEUDO_REGISTER
1065                            ? regno
1066                            : reg_renumber[regno];
1067           if (hard_regno >= 0)
1068             SET_HARD_REG_BIT (live_hard_regs, hard_regno);
1069         }
1070       bitmap_and (avail_cands, &get_remat_bb_data (bb)->avin_cands,
1071                   &get_remat_bb_data (bb)->livein_cands);
1072       /* Activating insns are always in the same block as their corresponding
1073          remat insn, so at the start of a block the two bitsets are equal.  */
1074       bitmap_copy (active_cands, avail_cands);
1075       FOR_BB_INSNS (bb, insn)
1076         {
1077           if (!NONDEBUG_INSN_P (insn))
1078             continue;
1079
1080           lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
1081           struct lra_static_insn_data *static_id = id->insn_static_data;
1082           struct lra_insn_reg *reg;
1083           cand_t cand;
1084           unsigned int cid;
1085           bitmap_iterator bi;
1086           rtx set;
1087           int iter;
1088           int src_regno = -1, dst_regno = -1;
1089
1090           if ((set = single_set (insn)) != NULL
1091               && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set)))
1092             {
1093               src_regno = REGNO (SET_SRC (set));
1094               dst_regno = REGNO (SET_DEST (set));
1095             }
1096
1097           cand = NULL;
1098           /* Check possibility of rematerialization (hard reg or
1099              unpsilled pseudo <- spilled pseudo): */
1100           if (dst_regno >= 0 && src_regno >= FIRST_PSEUDO_REGISTER
1101               && reg_renumber[src_regno] < 0
1102               && (dst_regno < FIRST_PSEUDO_REGISTER
1103                   || reg_renumber[dst_regno] >= 0))
1104             {
1105               for (cand = regno_cands[src_regno];
1106                    cand != NULL;
1107                    cand = cand->next_regno_cand)
1108                 if (bitmap_bit_p (avail_cands, cand->index)
1109                     && bitmap_bit_p (active_cands, cand->index))
1110                   break;
1111             }
1112           int i, hard_regno, nregs;
1113           int dst_hard_regno, dst_nregs;
1114           rtx_insn *remat_insn = NULL;
1115           poly_int64 cand_sp_offset = 0;
1116           if (cand != NULL)
1117             {
1118               lra_insn_recog_data_t cand_id
1119                 = lra_get_insn_recog_data (cand->insn);
1120               struct lra_static_insn_data *static_cand_id
1121                 = cand_id->insn_static_data;
1122               rtx saved_op = *cand_id->operand_loc[cand->nop];
1123
1124               /* Check clobbers do not kill something living.  */
1125               gcc_assert (REG_P (saved_op));
1126               int ignore_regno = REGNO (saved_op); 
1127
1128               dst_hard_regno = dst_regno < FIRST_PSEUDO_REGISTER
1129                 ? dst_regno : reg_renumber[dst_regno];
1130               gcc_assert (dst_hard_regno >= 0);
1131               machine_mode mode = GET_MODE (SET_DEST (set));
1132               dst_nregs = hard_regno_nregs (dst_hard_regno, mode);
1133
1134               for (reg = cand_id->regs; reg != NULL; reg = reg->next)
1135                 if (reg->type != OP_IN && reg->regno != ignore_regno)
1136                   {
1137                     hard_regno = get_hard_regs (reg, nregs);
1138                     gcc_assert (hard_regno >= 0);
1139                     for (i = 0; i < nregs; i++)
1140                       if (TEST_HARD_REG_BIT (live_hard_regs, hard_regno + i))
1141                         break;
1142                     if (i < nregs)
1143                       break;
1144                     /* Ensure the clobber also doesn't overlap dst_regno.  */
1145                     if (hard_regno + nregs > dst_hard_regno
1146                         && hard_regno < dst_hard_regno + dst_nregs)
1147                       break;
1148                   }
1149
1150               if (reg == NULL)
1151                 {
1152                   for (reg = static_cand_id->hard_regs;
1153                        reg != NULL;
1154                        reg = reg->next)
1155                     if (reg->type != OP_IN)
1156                       {
1157                         if (TEST_HARD_REG_BIT (live_hard_regs, reg->regno))
1158                           break;
1159                         if (reg->regno >= dst_hard_regno
1160                             && reg->regno < dst_hard_regno + dst_nregs)
1161                           break;
1162                       }
1163                 }
1164
1165               if (reg == NULL)
1166                 {
1167                   *cand_id->operand_loc[cand->nop] = SET_DEST (set);
1168                   lra_update_insn_regno_info (cand->insn);
1169                   bool ok_p = lra_constrain_insn (cand->insn);
1170                   if (ok_p)
1171                     {
1172                       rtx remat_pat = copy_insn (PATTERN (cand->insn));
1173                       
1174                       start_sequence ();
1175                       emit_insn (remat_pat);
1176                       remat_insn = get_insns ();
1177                       end_sequence ();
1178                       if (recog_memoized (remat_insn) < 0)
1179                         remat_insn = NULL;
1180                       cand_sp_offset = cand_id->sp_offset;
1181                     }
1182                   *cand_id->operand_loc[cand->nop] = saved_op;
1183                   lra_update_insn_regno_info (cand->insn);
1184                 }
1185             }
1186
1187           bitmap_clear (&temp_bitmap);
1188           /* Update avail_cands (see analogous code for
1189              calculate_gen_cands).  */
1190           for (iter = 0; iter < 2; iter++)
1191             for (reg = (iter == 0 ? id->regs : static_id->hard_regs);
1192                  reg != NULL;
1193                  reg = reg->next)
1194               if (reg->type != OP_IN
1195                   || find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
1196                 EXECUTE_IF_SET_IN_BITMAP (avail_cands, 0, cid, bi)
1197                   {
1198                     cand = all_cands[cid];
1199                     
1200                     /* Ignore the reload insn.  */
1201                     if (src_regno == cand->reload_regno
1202                         && dst_regno == cand->regno)
1203                       continue;
1204                     if (cand->regno == reg->regno
1205                         || reg_overlap_for_remat_p (reg, cand->insn))
1206                       bitmap_set_bit (&temp_bitmap, cand->index);
1207                   }
1208
1209           if (CALL_P (insn))
1210             {
1211               function_abi callee_abi = insn_callee_abi (insn);
1212               EXECUTE_IF_SET_IN_BITMAP (avail_cands, 0, cid, bi)
1213                 {
1214                   cand = all_cands[cid];
1215                 
1216                   if (call_used_input_regno_present_p (callee_abi, cand->insn))
1217                     bitmap_set_bit (&temp_bitmap, cand->index);
1218                 }
1219             }
1220
1221           bitmap_and_compl_into (avail_cands, &temp_bitmap);
1222
1223           /* Now see whether a candidate is made active or available
1224              by this insn.  */
1225           cand = insn_to_cand_activation[INSN_UID (insn)];
1226           if (cand)
1227             bitmap_set_bit (active_cands, cand->index);
1228
1229           cand = insn_to_cand[INSN_UID (insn)];
1230           if (cand != NULL)
1231             {
1232               bitmap_set_bit (avail_cands, cand->index);
1233               if (cand->reload_regno == -1)
1234                 bitmap_set_bit (active_cands, cand->index);
1235               else
1236                 bitmap_clear_bit (active_cands, cand->index);
1237             }
1238
1239           if (remat_insn != NULL)
1240             {
1241               poly_int64 sp_offset_change = cand_sp_offset - id->sp_offset;
1242               if (maybe_ne (sp_offset_change, 0))
1243                 change_sp_offset (remat_insn, sp_offset_change);
1244               update_scratch_ops (remat_insn);
1245               lra_process_new_insns (insn, remat_insn, NULL,
1246                                      "Inserting rematerialization insn");
1247               lra_set_insn_deleted (insn);
1248               changed_p = true;
1249               continue;
1250             }
1251
1252           /* Update live hard regs: */
1253           for (reg = id->regs; reg != NULL; reg = reg->next)
1254             if (reg->type == OP_IN
1255                 && find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
1256               {
1257                 if ((hard_regno = get_hard_regs (reg, nregs)) < 0)
1258                   continue;
1259                 for (i = 0; i < nregs; i++)
1260                   CLEAR_HARD_REG_BIT (live_hard_regs, hard_regno + i);
1261               }
1262           /* Process also hard regs (e.g. CC register) which are part
1263              of insn definition.  */
1264           for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
1265             if (reg->type == OP_IN
1266                 && find_regno_note (insn, REG_DEAD, reg->regno) != NULL)
1267               CLEAR_HARD_REG_BIT (live_hard_regs, reg->regno);
1268           /* Inputs have been processed, now process outputs.  */
1269           for (reg = id->regs; reg != NULL; reg = reg->next)
1270             if (reg->type != OP_IN
1271                 && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL)
1272               {
1273                 if ((hard_regno = get_hard_regs (reg, nregs)) < 0)
1274                   continue;
1275                 for (i = 0; i < nregs; i++)
1276                   SET_HARD_REG_BIT (live_hard_regs, hard_regno + i);
1277               }
1278           for (reg = static_id->hard_regs; reg != NULL; reg = reg->next)
1279             if (reg->type != OP_IN
1280                 && find_regno_note (insn, REG_UNUSED, reg->regno) == NULL)
1281               SET_HARD_REG_BIT (live_hard_regs, reg->regno);
1282         }
1283     }
1284   return changed_p;
1285 }
1286
1287 \f
1288
1289 /* Current number of rematerialization iteration.  */
1290 int lra_rematerialization_iter;
1291
1292 /* Entry point of the rematerialization sub-pass.  Return true if we
1293    did any rematerialization.  */
1294 bool
1295 lra_remat (void)
1296 {
1297   basic_block bb;
1298   bool result;
1299   int max_regno = max_reg_num ();
1300
1301   if (! flag_lra_remat)
1302     return false;
1303   lra_rematerialization_iter++;
1304   if (lra_rematerialization_iter > LRA_MAX_REMATERIALIZATION_PASSES)
1305     return false;
1306   if (lra_dump_file != NULL)
1307     fprintf (lra_dump_file,
1308              "\n******** Rematerialization #%d: ********\n\n",
1309              lra_rematerialization_iter);
1310   timevar_push (TV_LRA_REMAT);
1311   insn_to_cand = XCNEWVEC (cand_t, get_max_uid ());
1312   insn_to_cand_activation = XCNEWVEC (cand_t, get_max_uid ());
1313   regno_cands = XCNEWVEC (cand_t, max_regno);
1314   all_cands.create (8000);
1315   initiate_cand_table ();
1316   create_remat_bb_data ();
1317   bitmap_initialize (&temp_bitmap, &reg_obstack);
1318   bitmap_initialize (&subreg_regs, &reg_obstack);
1319   calculate_local_reg_remat_bb_data ();
1320   create_cands ();
1321   calculate_livein_cands ();
1322   calculate_gen_cands ();
1323   bitmap_initialize (&all_blocks, &reg_obstack);
1324   FOR_ALL_BB_FN (bb, cfun)
1325     bitmap_set_bit (&all_blocks, bb->index);
1326   calculate_global_remat_bb_data ();
1327   dump_candidates_and_remat_bb_data ();
1328   result = do_remat ();
1329   all_cands.release ();
1330   bitmap_clear (&temp_bitmap);
1331   bitmap_clear (&subreg_regs);
1332   finish_remat_bb_data ();
1333   finish_cand_table ();
1334   bitmap_clear (&all_blocks);
1335   free (regno_cands);
1336   free (insn_to_cand);
1337   free (insn_to_cand_activation);
1338   timevar_pop (TV_LRA_REMAT);
1339   return result;
1340 }