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