xref: /dragonfly/contrib/gcc-4.7/gcc/ira-lives.c (revision c69bf40f)
1 /* IRA processing allocno lives to build allocno live ranges.
2    Copyright (C) 2006, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "regs.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "target.h"
30 #include "flags.h"
31 #include "except.h"
32 #include "hard-reg-set.h"
33 #include "basic-block.h"
34 #include "insn-config.h"
35 #include "recog.h"
36 #include "diagnostic-core.h"
37 #include "params.h"
38 #include "df.h"
39 #include "sbitmap.h"
40 #include "sparseset.h"
41 #include "ira-int.h"
42 
43 /* The code in this file is similar to one in global but the code
44    works on the allocno basis and creates live ranges instead of
45    pseudo-register conflicts.  */
46 
47 /* Program points are enumerated by numbers from range
48    0..IRA_MAX_POINT-1.  There are approximately two times more program
49    points than insns.  Program points are places in the program where
50    liveness info can be changed.  In most general case (there are more
51    complicated cases too) some program points correspond to places
52    where input operand dies and other ones correspond to places where
53    output operands are born.  */
54 int ira_max_point;
55 
56 /* Arrays of size IRA_MAX_POINT mapping a program point to the allocno
57    live ranges with given start/finish point.  */
58 live_range_t *ira_start_point_ranges, *ira_finish_point_ranges;
59 
60 /* Number of the current program point.  */
61 static int curr_point;
62 
63 /* Point where register pressure excess started or -1 if there is no
64    register pressure excess.  Excess pressure for a register class at
65    some point means that there are more allocnos of given register
66    class living at the point than number of hard-registers of the
67    class available for the allocation.  It is defined only for
68    pressure classes.  */
69 static int high_pressure_start_point[N_REG_CLASSES];
70 
71 /* Objects live at current point in the scan.  */
72 static sparseset objects_live;
73 
74 /* A temporary bitmap used in functions that wish to avoid visiting an allocno
75    multiple times.  */
76 static sparseset allocnos_processed;
77 
78 /* Set of hard regs (except eliminable ones) currently live.  */
79 static HARD_REG_SET hard_regs_live;
80 
81 /* The loop tree node corresponding to the current basic block.  */
82 static ira_loop_tree_node_t curr_bb_node;
83 
84 /* The number of the last processed call.  */
85 static int last_call_num;
86 /* The number of last call at which given allocno was saved.  */
87 static int *allocno_saved_at_call;
88 
89 /* Record the birth of hard register REGNO, updating hard_regs_live and
90    hard reg conflict information for living allocnos.  */
91 static void
92 make_hard_regno_born (int regno)
93 {
94   unsigned int i;
95 
96   SET_HARD_REG_BIT (hard_regs_live, regno);
97   EXECUTE_IF_SET_IN_SPARSESET (objects_live, i)
98     {
99       ira_object_t obj = ira_object_id_map[i];
100 
101       SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
102       SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), regno);
103     }
104 }
105 
106 /* Process the death of hard register REGNO.  This updates
107    hard_regs_live.  */
108 static void
109 make_hard_regno_dead (int regno)
110 {
111   CLEAR_HARD_REG_BIT (hard_regs_live, regno);
112 }
113 
114 /* Record the birth of object OBJ.  Set a bit for it in objects_live,
115    start a new live range for it if necessary and update hard register
116    conflicts.  */
117 static void
118 make_object_born (ira_object_t obj)
119 {
120   live_range_t lr = OBJECT_LIVE_RANGES (obj);
121 
122   sparseset_set_bit (objects_live, OBJECT_CONFLICT_ID (obj));
123   IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj), hard_regs_live);
124   IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), hard_regs_live);
125 
126   if (lr == NULL
127       || (lr->finish != curr_point && lr->finish + 1 != curr_point))
128     ira_add_live_range_to_object (obj, curr_point, -1);
129 }
130 
131 /* Update ALLOCNO_EXCESS_PRESSURE_POINTS_NUM for the allocno
132    associated with object OBJ.  */
133 static void
134 update_allocno_pressure_excess_length (ira_object_t obj)
135 {
136   ira_allocno_t a = OBJECT_ALLOCNO (obj);
137   int start, i;
138   enum reg_class aclass, pclass, cl;
139   live_range_t p;
140 
141   aclass = ALLOCNO_CLASS (a);
142   pclass = ira_pressure_class_translate[aclass];
143   for (i = 0;
144        (cl = ira_reg_class_super_classes[pclass][i]) != LIM_REG_CLASSES;
145        i++)
146     {
147       if (! ira_reg_pressure_class_p[cl])
148 	continue;
149       if (high_pressure_start_point[cl] < 0)
150 	continue;
151       p = OBJECT_LIVE_RANGES (obj);
152       ira_assert (p != NULL);
153       start = (high_pressure_start_point[cl] > p->start
154 	       ? high_pressure_start_point[cl] : p->start);
155       ALLOCNO_EXCESS_PRESSURE_POINTS_NUM (a) += curr_point - start + 1;
156     }
157 }
158 
159 /* Process the death of object OBJ, which is associated with allocno
160    A.  This finishes the current live range for it.  */
161 static void
162 make_object_dead (ira_object_t obj)
163 {
164   live_range_t lr;
165 
166   sparseset_clear_bit (objects_live, OBJECT_CONFLICT_ID (obj));
167   lr = OBJECT_LIVE_RANGES (obj);
168   ira_assert (lr != NULL);
169   lr->finish = curr_point;
170   update_allocno_pressure_excess_length (obj);
171 }
172 
173 /* The current register pressures for each pressure class for the current
174    basic block.  */
175 static int curr_reg_pressure[N_REG_CLASSES];
176 
177 /* Record that register pressure for PCLASS increased by N registers.
178    Update the current register pressure, maximal register pressure for
179    the current BB and the start point of the register pressure
180    excess.  */
181 static void
182 inc_register_pressure (enum reg_class pclass, int n)
183 {
184   int i;
185   enum reg_class cl;
186 
187   for (i = 0;
188        (cl = ira_reg_class_super_classes[pclass][i]) != LIM_REG_CLASSES;
189        i++)
190     {
191       if (! ira_reg_pressure_class_p[cl])
192 	continue;
193       curr_reg_pressure[cl] += n;
194       if (high_pressure_start_point[cl] < 0
195 	  && (curr_reg_pressure[cl] > ira_available_class_regs[cl]))
196 	high_pressure_start_point[cl] = curr_point;
197       if (curr_bb_node->reg_pressure[cl] < curr_reg_pressure[cl])
198 	curr_bb_node->reg_pressure[cl] = curr_reg_pressure[cl];
199     }
200 }
201 
202 /* Record that register pressure for PCLASS has decreased by NREGS
203    registers; update current register pressure, start point of the
204    register pressure excess, and register pressure excess length for
205    living allocnos.  */
206 
207 static void
208 dec_register_pressure (enum reg_class pclass, int nregs)
209 {
210   int i;
211   unsigned int j;
212   enum reg_class cl;
213   bool set_p = false;
214 
215   for (i = 0;
216        (cl = ira_reg_class_super_classes[pclass][i]) != LIM_REG_CLASSES;
217        i++)
218     {
219       if (! ira_reg_pressure_class_p[cl])
220 	continue;
221       curr_reg_pressure[cl] -= nregs;
222       ira_assert (curr_reg_pressure[cl] >= 0);
223       if (high_pressure_start_point[cl] >= 0
224 	  && curr_reg_pressure[cl] <= ira_available_class_regs[cl])
225 	set_p = true;
226     }
227   if (set_p)
228     {
229       EXECUTE_IF_SET_IN_SPARSESET (objects_live, j)
230 	update_allocno_pressure_excess_length (ira_object_id_map[j]);
231       for (i = 0;
232 	   (cl = ira_reg_class_super_classes[pclass][i]) != LIM_REG_CLASSES;
233 	   i++)
234 	{
235 	  if (! ira_reg_pressure_class_p[cl])
236 	    continue;
237 	  if (high_pressure_start_point[cl] >= 0
238 	      && curr_reg_pressure[cl] <= ira_available_class_regs[cl])
239 	    high_pressure_start_point[cl] = -1;
240 	}
241     }
242 }
243 
244 /* Mark the pseudo register REGNO as live.  Update all information about
245    live ranges and register pressure.  */
246 static void
247 mark_pseudo_regno_live (int regno)
248 {
249   ira_allocno_t a = ira_curr_regno_allocno_map[regno];
250   enum reg_class pclass;
251   int i, n, nregs;
252 
253   if (a == NULL)
254     return;
255 
256   /* Invalidate because it is referenced.  */
257   allocno_saved_at_call[ALLOCNO_NUM (a)] = 0;
258 
259   n = ALLOCNO_NUM_OBJECTS (a);
260   pclass = ira_pressure_class_translate[ALLOCNO_CLASS (a)];
261   nregs = ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)];
262   if (n > 1)
263     {
264       /* We track every subobject separately.  */
265       gcc_assert (nregs == n);
266       nregs = 1;
267     }
268 
269   for (i = 0; i < n; i++)
270     {
271       ira_object_t obj = ALLOCNO_OBJECT (a, i);
272 
273       if (sparseset_bit_p (objects_live, OBJECT_CONFLICT_ID (obj)))
274 	continue;
275 
276       inc_register_pressure (pclass, nregs);
277       make_object_born (obj);
278     }
279 }
280 
281 /* Like mark_pseudo_regno_live, but try to only mark one subword of
282    the pseudo as live.  SUBWORD indicates which; a value of 0
283    indicates the low part.  */
284 static void
285 mark_pseudo_regno_subword_live (int regno, int subword)
286 {
287   ira_allocno_t a = ira_curr_regno_allocno_map[regno];
288   int n;
289   enum reg_class pclass;
290   ira_object_t obj;
291 
292   if (a == NULL)
293     return;
294 
295   /* Invalidate because it is referenced.  */
296   allocno_saved_at_call[ALLOCNO_NUM (a)] = 0;
297 
298   n = ALLOCNO_NUM_OBJECTS (a);
299   if (n == 1)
300     {
301       mark_pseudo_regno_live (regno);
302       return;
303     }
304 
305   pclass = ira_pressure_class_translate[ALLOCNO_CLASS (a)];
306   gcc_assert
307     (n == ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]);
308   obj = ALLOCNO_OBJECT (a, subword);
309 
310   if (sparseset_bit_p (objects_live, OBJECT_CONFLICT_ID (obj)))
311     return;
312 
313   inc_register_pressure (pclass, 1);
314   make_object_born (obj);
315 }
316 
317 /* Mark the register REG as live.  Store a 1 in hard_regs_live for
318    this register, record how many consecutive hardware registers it
319    actually needs.  */
320 static void
321 mark_hard_reg_live (rtx reg)
322 {
323   int regno = REGNO (reg);
324 
325   if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno))
326     {
327       int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
328       enum reg_class aclass, pclass;
329 
330       while (regno < last)
331 	{
332 	  if (! TEST_HARD_REG_BIT (hard_regs_live, regno)
333 	      && ! TEST_HARD_REG_BIT (eliminable_regset, regno))
334 	    {
335 	      aclass = ira_hard_regno_allocno_class[regno];
336 	      pclass = ira_pressure_class_translate[aclass];
337 	      inc_register_pressure (pclass, 1);
338 	      make_hard_regno_born (regno);
339 	    }
340 	  regno++;
341 	}
342     }
343 }
344 
345 /* Mark a pseudo, or one of its subwords, as live.  REGNO is the pseudo's
346    register number; ORIG_REG is the access in the insn, which may be a
347    subreg.  */
348 static void
349 mark_pseudo_reg_live (rtx orig_reg, unsigned regno)
350 {
351   if (df_read_modify_subreg_p (orig_reg))
352     {
353       mark_pseudo_regno_subword_live (regno,
354 				      subreg_lowpart_p (orig_reg) ? 0 : 1);
355     }
356   else
357     mark_pseudo_regno_live (regno);
358 }
359 
360 /* Mark the register referenced by use or def REF as live.  */
361 static void
362 mark_ref_live (df_ref ref)
363 {
364   rtx reg = DF_REF_REG (ref);
365   rtx orig_reg = reg;
366 
367   if (GET_CODE (reg) == SUBREG)
368     reg = SUBREG_REG (reg);
369 
370   if (REGNO (reg) >= FIRST_PSEUDO_REGISTER)
371     mark_pseudo_reg_live (orig_reg, REGNO (reg));
372   else
373     mark_hard_reg_live (reg);
374 }
375 
376 /* Mark the pseudo register REGNO as dead.  Update all information about
377    live ranges and register pressure.  */
378 static void
379 mark_pseudo_regno_dead (int regno)
380 {
381   ira_allocno_t a = ira_curr_regno_allocno_map[regno];
382   int n, i, nregs;
383   enum reg_class cl;
384 
385   if (a == NULL)
386     return;
387 
388   /* Invalidate because it is referenced.  */
389   allocno_saved_at_call[ALLOCNO_NUM (a)] = 0;
390 
391   n = ALLOCNO_NUM_OBJECTS (a);
392   cl = ira_pressure_class_translate[ALLOCNO_CLASS (a)];
393   nregs = ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)];
394   if (n > 1)
395     {
396       /* We track every subobject separately.  */
397       gcc_assert (nregs == n);
398       nregs = 1;
399     }
400   for (i = 0; i < n; i++)
401     {
402       ira_object_t obj = ALLOCNO_OBJECT (a, i);
403       if (!sparseset_bit_p (objects_live, OBJECT_CONFLICT_ID (obj)))
404 	continue;
405 
406       dec_register_pressure (cl, nregs);
407       make_object_dead (obj);
408     }
409 }
410 
411 /* Like mark_pseudo_regno_dead, but called when we know that only part of the
412    register dies.  SUBWORD indicates which; a value of 0 indicates the low part.  */
413 static void
414 mark_pseudo_regno_subword_dead (int regno, int subword)
415 {
416   ira_allocno_t a = ira_curr_regno_allocno_map[regno];
417   int n;
418   enum reg_class cl;
419   ira_object_t obj;
420 
421   if (a == NULL)
422     return;
423 
424   /* Invalidate because it is referenced.  */
425   allocno_saved_at_call[ALLOCNO_NUM (a)] = 0;
426 
427   n = ALLOCNO_NUM_OBJECTS (a);
428   if (n == 1)
429     /* The allocno as a whole doesn't die in this case.  */
430     return;
431 
432   cl = ira_pressure_class_translate[ALLOCNO_CLASS (a)];
433   gcc_assert
434     (n == ira_reg_class_max_nregs[ALLOCNO_CLASS (a)][ALLOCNO_MODE (a)]);
435 
436   obj = ALLOCNO_OBJECT (a, subword);
437   if (!sparseset_bit_p (objects_live, OBJECT_CONFLICT_ID (obj)))
438     return;
439 
440   dec_register_pressure (cl, 1);
441   make_object_dead (obj);
442 }
443 
444 /* Mark the hard register REG as dead.  Store a 0 in hard_regs_live for the
445    register.  */
446 static void
447 mark_hard_reg_dead (rtx reg)
448 {
449   int regno = REGNO (reg);
450 
451   if (! TEST_HARD_REG_BIT (ira_no_alloc_regs, regno))
452     {
453       int last = regno + hard_regno_nregs[regno][GET_MODE (reg)];
454       enum reg_class aclass, pclass;
455 
456       while (regno < last)
457 	{
458 	  if (TEST_HARD_REG_BIT (hard_regs_live, regno))
459 	    {
460 	      aclass = ira_hard_regno_allocno_class[regno];
461 	      pclass = ira_pressure_class_translate[aclass];
462 	      dec_register_pressure (pclass, 1);
463 	      make_hard_regno_dead (regno);
464 	    }
465 	  regno++;
466 	}
467     }
468 }
469 
470 /* Mark a pseudo, or one of its subwords, as dead.  REGNO is the pseudo's
471    register number; ORIG_REG is the access in the insn, which may be a
472    subreg.  */
473 static void
474 mark_pseudo_reg_dead (rtx orig_reg, unsigned regno)
475 {
476   if (df_read_modify_subreg_p (orig_reg))
477     {
478       mark_pseudo_regno_subword_dead (regno,
479 				      subreg_lowpart_p (orig_reg) ? 0 : 1);
480     }
481   else
482     mark_pseudo_regno_dead (regno);
483 }
484 
485 /* Mark the register referenced by definition DEF as dead, if the
486    definition is a total one.  */
487 static void
488 mark_ref_dead (df_ref def)
489 {
490   rtx reg = DF_REF_REG (def);
491   rtx orig_reg = reg;
492 
493   if (DF_REF_FLAGS_IS_SET (def, DF_REF_CONDITIONAL))
494     return;
495 
496   if (GET_CODE (reg) == SUBREG)
497     reg = SUBREG_REG (reg);
498 
499   if (DF_REF_FLAGS_IS_SET (def, DF_REF_PARTIAL)
500       && (GET_CODE (orig_reg) != SUBREG
501 	  || REGNO (reg) < FIRST_PSEUDO_REGISTER
502 	  || !df_read_modify_subreg_p (orig_reg)))
503     return;
504 
505   if (REGNO (reg) >= FIRST_PSEUDO_REGISTER)
506     mark_pseudo_reg_dead (orig_reg, REGNO (reg));
507   else
508     mark_hard_reg_dead (reg);
509 }
510 
511 /* If REG is a pseudo or a subreg of it, and the class of its allocno
512    intersects CL, make a conflict with pseudo DREG.  ORIG_DREG is the
513    rtx actually accessed, it may be indentical to DREG or a subreg of it.
514    Advance the current program point before making the conflict if
515    ADVANCE_P.  Return TRUE if we will need to advance the current
516    program point.  */
517 static bool
518 make_pseudo_conflict (rtx reg, enum reg_class cl, rtx dreg, rtx orig_dreg,
519 		      bool advance_p)
520 {
521   rtx orig_reg = reg;
522   ira_allocno_t a;
523 
524   if (GET_CODE (reg) == SUBREG)
525     reg = SUBREG_REG (reg);
526 
527   if (! REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
528     return advance_p;
529 
530   a = ira_curr_regno_allocno_map[REGNO (reg)];
531   if (! reg_classes_intersect_p (cl, ALLOCNO_CLASS (a)))
532     return advance_p;
533 
534   if (advance_p)
535     curr_point++;
536 
537   mark_pseudo_reg_live (orig_reg, REGNO (reg));
538   mark_pseudo_reg_live (orig_dreg, REGNO (dreg));
539   mark_pseudo_reg_dead (orig_reg, REGNO (reg));
540   mark_pseudo_reg_dead (orig_dreg, REGNO (dreg));
541 
542   return false;
543 }
544 
545 /* Check and make if necessary conflicts for pseudo DREG of class
546    DEF_CL of the current insn with input operand USE of class USE_CL.
547    ORIG_DREG is the rtx actually accessed, it may be indentical to
548    DREG or a subreg of it.  Advance the current program point before
549    making the conflict if ADVANCE_P.  Return TRUE if we will need to
550    advance the current program point.  */
551 static bool
552 check_and_make_def_use_conflict (rtx dreg, rtx orig_dreg,
553 				 enum reg_class def_cl, int use,
554 				 enum reg_class use_cl, bool advance_p)
555 {
556   if (! reg_classes_intersect_p (def_cl, use_cl))
557     return advance_p;
558 
559   advance_p = make_pseudo_conflict (recog_data.operand[use],
560 				    use_cl, dreg, orig_dreg, advance_p);
561 
562   /* Reload may end up swapping commutative operands, so you
563      have to take both orderings into account.  The
564      constraints for the two operands can be completely
565      different.  (Indeed, if the constraints for the two
566      operands are the same for all alternatives, there's no
567      point marking them as commutative.)  */
568   if (use < recog_data.n_operands - 1
569       && recog_data.constraints[use][0] == '%')
570     advance_p
571       = make_pseudo_conflict (recog_data.operand[use + 1],
572 			      use_cl, dreg, orig_dreg, advance_p);
573   if (use >= 1
574       && recog_data.constraints[use - 1][0] == '%')
575     advance_p
576       = make_pseudo_conflict (recog_data.operand[use - 1],
577 			      use_cl, dreg, orig_dreg, advance_p);
578   return advance_p;
579 }
580 
581 /* Check and make if necessary conflicts for definition DEF of class
582    DEF_CL of the current insn with input operands.  Process only
583    constraints of alternative ALT.  */
584 static void
585 check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
586 {
587   int use, use_match;
588   ira_allocno_t a;
589   enum reg_class use_cl, acl;
590   bool advance_p;
591   rtx dreg = recog_data.operand[def];
592   rtx orig_dreg = dreg;
593 
594   if (def_cl == NO_REGS)
595     return;
596 
597   if (GET_CODE (dreg) == SUBREG)
598     dreg = SUBREG_REG (dreg);
599 
600   if (! REG_P (dreg) || REGNO (dreg) < FIRST_PSEUDO_REGISTER)
601     return;
602 
603   a = ira_curr_regno_allocno_map[REGNO (dreg)];
604   acl = ALLOCNO_CLASS (a);
605   if (! reg_classes_intersect_p (acl, def_cl))
606     return;
607 
608   advance_p = true;
609 
610   for (use = 0; use < recog_data.n_operands; use++)
611     {
612       int alt1;
613 
614       if (use == def || recog_data.operand_type[use] == OP_OUT)
615 	continue;
616 
617       if (recog_op_alt[use][alt].anything_ok)
618 	use_cl = ALL_REGS;
619       else
620 	use_cl = recog_op_alt[use][alt].cl;
621 
622       /* If there's any alternative that allows USE to match DEF, do not
623 	 record a conflict.  If that causes us to create an invalid
624 	 instruction due to the earlyclobber, reload must fix it up.  */
625       for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++)
626 	if (recog_op_alt[use][alt1].matches == def
627 	    || (use < recog_data.n_operands - 1
628 		&& recog_data.constraints[use][0] == '%'
629 		&& recog_op_alt[use + 1][alt1].matches == def)
630 	    || (use >= 1
631 		&& recog_data.constraints[use - 1][0] == '%'
632 		&& recog_op_alt[use - 1][alt1].matches == def))
633 	  break;
634 
635       if (alt1 < recog_data.n_alternatives)
636 	continue;
637 
638       advance_p = check_and_make_def_use_conflict (dreg, orig_dreg, def_cl,
639 						   use, use_cl, advance_p);
640 
641       if ((use_match = recog_op_alt[use][alt].matches) >= 0)
642 	{
643 	  if (use_match == def)
644 	    continue;
645 
646 	  if (recog_op_alt[use_match][alt].anything_ok)
647 	    use_cl = ALL_REGS;
648 	  else
649 	    use_cl = recog_op_alt[use_match][alt].cl;
650 	  advance_p = check_and_make_def_use_conflict (dreg, orig_dreg, def_cl,
651 						       use, use_cl, advance_p);
652 	}
653     }
654 }
655 
656 /* Make conflicts of early clobber pseudo registers of the current
657    insn with its inputs.  Avoid introducing unnecessary conflicts by
658    checking classes of the constraints and pseudos because otherwise
659    significant code degradation is possible for some targets.  */
660 static void
661 make_early_clobber_and_input_conflicts (void)
662 {
663   int alt;
664   int def, def_match;
665   enum reg_class def_cl;
666 
667   for (alt = 0; alt < recog_data.n_alternatives; alt++)
668     for (def = 0; def < recog_data.n_operands; def++)
669       {
670 	def_cl = NO_REGS;
671 	if (recog_op_alt[def][alt].earlyclobber)
672 	  {
673 	    if (recog_op_alt[def][alt].anything_ok)
674 	      def_cl = ALL_REGS;
675 	    else
676 	      def_cl = recog_op_alt[def][alt].cl;
677 	    check_and_make_def_conflict (alt, def, def_cl);
678 	  }
679 	if ((def_match = recog_op_alt[def][alt].matches) >= 0
680 	    && (recog_op_alt[def_match][alt].earlyclobber
681 		|| recog_op_alt[def][alt].earlyclobber))
682 	  {
683 	    if (recog_op_alt[def_match][alt].anything_ok)
684 	      def_cl = ALL_REGS;
685 	    else
686 	      def_cl = recog_op_alt[def_match][alt].cl;
687 	    check_and_make_def_conflict (alt, def, def_cl);
688 	  }
689       }
690 }
691 
692 /* Mark early clobber hard registers of the current INSN as live (if
693    LIVE_P) or dead.  Return true if there are such registers.  */
694 static bool
695 mark_hard_reg_early_clobbers (rtx insn, bool live_p)
696 {
697   df_ref *def_rec;
698   bool set_p = false;
699 
700   for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
701     if (DF_REF_FLAGS_IS_SET (*def_rec, DF_REF_MUST_CLOBBER))
702       {
703 	rtx dreg = DF_REF_REG (*def_rec);
704 
705 	if (GET_CODE (dreg) == SUBREG)
706 	  dreg = SUBREG_REG (dreg);
707 	if (! REG_P (dreg) || REGNO (dreg) >= FIRST_PSEUDO_REGISTER)
708 	  continue;
709 
710 	/* Hard register clobbers are believed to be early clobber
711 	   because there is no way to say that non-operand hard
712 	   register clobbers are not early ones.  */
713 	if (live_p)
714 	  mark_ref_live (*def_rec);
715 	else
716 	  mark_ref_dead (*def_rec);
717 	set_p = true;
718       }
719 
720   return set_p;
721 }
722 
723 /* Checks that CONSTRAINTS permits to use only one hard register.  If
724    it is so, the function returns the class of the hard register.
725    Otherwise it returns NO_REGS.  */
726 static enum reg_class
727 single_reg_class (const char *constraints, rtx op, rtx equiv_const)
728 {
729   int curr_alt, c;
730   bool ignore_p;
731   enum reg_class cl, next_cl;
732 
733   cl = NO_REGS;
734   for (ignore_p = false, curr_alt = 0;
735        (c = *constraints);
736        constraints += CONSTRAINT_LEN (c, constraints))
737     if (c == '#' || !recog_data.alternative_enabled_p[curr_alt])
738       ignore_p = true;
739     else if (c == ',')
740       {
741 	curr_alt++;
742 	ignore_p = false;
743       }
744     else if (! ignore_p)
745       switch (c)
746 	{
747 	case ' ':
748 	case '\t':
749 	case '=':
750 	case '+':
751 	case '*':
752 	case '&':
753 	case '%':
754 	case '!':
755 	case '?':
756 	  break;
757 	case 'i':
758 	  if (CONSTANT_P (op)
759 	      || (equiv_const != NULL_RTX && CONSTANT_P (equiv_const)))
760 	    return NO_REGS;
761 	  break;
762 
763 	case 'n':
764 	  if (CONST_INT_P (op)
765 	      || (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode)
766 	      || (equiv_const != NULL_RTX
767 		  && (CONST_INT_P (equiv_const)
768 		      || (GET_CODE (equiv_const) == CONST_DOUBLE
769 			  && GET_MODE (equiv_const) == VOIDmode))))
770 	    return NO_REGS;
771 	  break;
772 
773 	case 's':
774 	  if ((CONSTANT_P (op) && !CONST_INT_P (op)
775 	       && (GET_CODE (op) != CONST_DOUBLE || GET_MODE (op) != VOIDmode))
776 	      || (equiv_const != NULL_RTX
777 		  && CONSTANT_P (equiv_const)
778 		  && !CONST_INT_P (equiv_const)
779 		  && (GET_CODE (equiv_const) != CONST_DOUBLE
780 		      || GET_MODE (equiv_const) != VOIDmode)))
781 	    return NO_REGS;
782 	  break;
783 
784 	case 'I':
785 	case 'J':
786 	case 'K':
787 	case 'L':
788 	case 'M':
789 	case 'N':
790 	case 'O':
791 	case 'P':
792 	  if ((CONST_INT_P (op)
793 	       && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, constraints))
794 	      || (equiv_const != NULL_RTX
795 		  && CONST_INT_P (equiv_const)
796 		  && CONST_OK_FOR_CONSTRAINT_P (INTVAL (equiv_const),
797 						c, constraints)))
798 	    return NO_REGS;
799 	  break;
800 
801 	case 'E':
802 	case 'F':
803 	  if (GET_CODE (op) == CONST_DOUBLE
804 	      || (GET_CODE (op) == CONST_VECTOR
805 		  && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT)
806 	      || (equiv_const != NULL_RTX
807 		  && (GET_CODE (equiv_const) == CONST_DOUBLE
808 		      || (GET_CODE (equiv_const) == CONST_VECTOR
809 			  && (GET_MODE_CLASS (GET_MODE (equiv_const))
810 			      == MODE_VECTOR_FLOAT)))))
811 	    return NO_REGS;
812 	  break;
813 
814 	case 'G':
815 	case 'H':
816 	  if ((GET_CODE (op) == CONST_DOUBLE
817 	       && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, c, constraints))
818 	      || (equiv_const != NULL_RTX
819 		  && GET_CODE (equiv_const) == CONST_DOUBLE
820 		  && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (equiv_const,
821 						       c, constraints)))
822 	    return NO_REGS;
823 	  /* ??? what about memory */
824 	case 'r':
825 	case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
826 	case 'h': case 'j': case 'k': case 'l':
827 	case 'q': case 't': case 'u':
828 	case 'v': case 'w': case 'x': case 'y': case 'z':
829 	case 'A': case 'B': case 'C': case 'D':
830 	case 'Q': case 'R': case 'S': case 'T': case 'U':
831 	case 'W': case 'Y': case 'Z':
832 	  next_cl = (c == 'r'
833 		     ? GENERAL_REGS
834 		     : REG_CLASS_FROM_CONSTRAINT (c, constraints));
835 	  if ((cl != NO_REGS && next_cl != cl)
836 	      || (ira_available_class_regs[next_cl]
837 		  > ira_reg_class_max_nregs[next_cl][GET_MODE (op)]))
838 	    return NO_REGS;
839 	  cl = next_cl;
840 	  break;
841 
842 	case '0': case '1': case '2': case '3': case '4':
843 	case '5': case '6': case '7': case '8': case '9':
844 	  next_cl
845 	    = single_reg_class (recog_data.constraints[c - '0'],
846 				recog_data.operand[c - '0'], NULL_RTX);
847 	  if ((cl != NO_REGS && next_cl != cl)
848 	      || next_cl == NO_REGS
849 	      || (ira_available_class_regs[next_cl]
850 		  > ira_reg_class_max_nregs[next_cl][GET_MODE (op)]))
851 	    return NO_REGS;
852 	  cl = next_cl;
853 	  break;
854 
855 	default:
856 	  return NO_REGS;
857 	}
858   return cl;
859 }
860 
861 /* The function checks that operand OP_NUM of the current insn can use
862    only one hard register.  If it is so, the function returns the
863    class of the hard register.  Otherwise it returns NO_REGS.  */
864 static enum reg_class
865 single_reg_operand_class (int op_num)
866 {
867   if (op_num < 0 || recog_data.n_alternatives == 0)
868     return NO_REGS;
869   return single_reg_class (recog_data.constraints[op_num],
870 			   recog_data.operand[op_num], NULL_RTX);
871 }
872 
873 /* The function sets up hard register set *SET to hard registers which
874    might be used by insn reloads because the constraints are too
875    strict.  */
876 void
877 ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set)
878 {
879   int i, curr_alt, c, regno = 0;
880   bool ignore_p;
881   enum reg_class cl;
882   rtx op;
883   enum machine_mode mode;
884 
885   CLEAR_HARD_REG_SET (*set);
886   for (i = 0; i < recog_data.n_operands; i++)
887     {
888       op = recog_data.operand[i];
889 
890       if (GET_CODE (op) == SUBREG)
891 	op = SUBREG_REG (op);
892 
893       if (GET_CODE (op) == SCRATCH
894 	  || (REG_P (op) && (regno = REGNO (op)) >= FIRST_PSEUDO_REGISTER))
895 	{
896 	  const char *p = recog_data.constraints[i];
897 
898 	  mode = (GET_CODE (op) == SCRATCH
899 		  ? GET_MODE (op) : PSEUDO_REGNO_MODE (regno));
900 	  cl = NO_REGS;
901 	  for (ignore_p = false, curr_alt = 0;
902 	       (c = *p);
903 	       p += CONSTRAINT_LEN (c, p))
904 	    if (c == '#' || !recog_data.alternative_enabled_p[curr_alt])
905 	      ignore_p = true;
906 	    else if (c == ',')
907 	      {
908 		curr_alt++;
909 		ignore_p = false;
910 	      }
911 	    else if (! ignore_p)
912 	      switch (c)
913 		{
914 		case 'r':
915 		case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
916 		case 'h': case 'j': case 'k': case 'l':
917 		case 'q': case 't': case 'u':
918 		case 'v': case 'w': case 'x': case 'y': case 'z':
919 		case 'A': case 'B': case 'C': case 'D':
920 		case 'Q': case 'R': case 'S': case 'T': case 'U':
921 		case 'W': case 'Y': case 'Z':
922 		  cl = (c == 'r'
923 			? GENERAL_REGS
924 			: REG_CLASS_FROM_CONSTRAINT (c, p));
925 		  if (cl != NO_REGS
926 		      /* There is no register pressure problem if all of the
927 			 regs in this class are fixed.  */
928 		      && ira_available_class_regs[cl] != 0
929 		      && (ira_available_class_regs[cl]
930 			  <= ira_reg_class_max_nregs[cl][mode]))
931 		    IOR_HARD_REG_SET (*set, reg_class_contents[cl]);
932 		  break;
933 		}
934 	}
935     }
936 }
937 /* Processes input operands, if IN_P, or output operands otherwise of
938    the current insn with FREQ to find allocno which can use only one
939    hard register and makes other currently living allocnos conflicting
940    with the hard register.  */
941 static void
942 process_single_reg_class_operands (bool in_p, int freq)
943 {
944   int i, regno;
945   unsigned int px;
946   enum reg_class cl;
947   rtx operand;
948   ira_allocno_t operand_a, a;
949 
950   for (i = 0; i < recog_data.n_operands; i++)
951     {
952       operand = recog_data.operand[i];
953       if (in_p && recog_data.operand_type[i] != OP_IN
954 	  && recog_data.operand_type[i] != OP_INOUT)
955 	continue;
956       if (! in_p && recog_data.operand_type[i] != OP_OUT
957 	  && recog_data.operand_type[i] != OP_INOUT)
958 	continue;
959       cl = single_reg_operand_class (i);
960       if (cl == NO_REGS)
961 	continue;
962 
963       operand_a = NULL;
964 
965       if (GET_CODE (operand) == SUBREG)
966 	operand = SUBREG_REG (operand);
967 
968       if (REG_P (operand)
969 	  && (regno = REGNO (operand)) >= FIRST_PSEUDO_REGISTER)
970 	{
971 	  enum reg_class aclass;
972 
973 	  operand_a = ira_curr_regno_allocno_map[regno];
974 	  aclass = ALLOCNO_CLASS (operand_a);
975 	  if (ira_class_subset_p[cl][aclass]
976 	      && ira_class_hard_regs_num[cl] != 0)
977 	    {
978 	      /* View the desired allocation of OPERAND as:
979 
980 		    (REG:YMODE YREGNO),
981 
982 		 a simplification of:
983 
984 		    (subreg:YMODE (reg:XMODE XREGNO) OFFSET).  */
985 	      enum machine_mode ymode, xmode;
986 	      int xregno, yregno;
987 	      HOST_WIDE_INT offset;
988 
989 	      xmode = recog_data.operand_mode[i];
990 	      xregno = ira_class_hard_regs[cl][0];
991 	      ymode = ALLOCNO_MODE (operand_a);
992 	      offset = subreg_lowpart_offset (ymode, xmode);
993 	      yregno = simplify_subreg_regno (xregno, xmode, offset, ymode);
994 	      if (yregno >= 0
995 		  && ira_class_hard_reg_index[aclass][yregno] >= 0)
996 		{
997 		  int cost;
998 
999 		  ira_allocate_and_set_costs
1000 		    (&ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a),
1001 		     aclass, 0);
1002 		  ira_init_register_move_cost_if_necessary (xmode);
1003 		  cost = freq * (in_p
1004 				 ? ira_register_move_cost[xmode][aclass][cl]
1005 				 : ira_register_move_cost[xmode][cl][aclass]);
1006 		  ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a)
1007 		    [ira_class_hard_reg_index[aclass][yregno]] -= cost;
1008 		}
1009 	    }
1010 	}
1011 
1012       EXECUTE_IF_SET_IN_SPARSESET (objects_live, px)
1013         {
1014 	  ira_object_t obj = ira_object_id_map[px];
1015 	  a = OBJECT_ALLOCNO (obj);
1016 	  if (a != operand_a)
1017 	    {
1018 	      /* We could increase costs of A instead of making it
1019 		 conflicting with the hard register.  But it works worse
1020 		 because it will be spilled in reload in anyway.  */
1021 	      IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
1022 				reg_class_contents[cl]);
1023 	      IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
1024 				reg_class_contents[cl]);
1025 	    }
1026 	}
1027     }
1028 }
1029 
1030 /* Return true when one of the predecessor edges of BB is marked with
1031    EDGE_ABNORMAL_CALL or EDGE_EH.  */
1032 static bool
1033 bb_has_abnormal_call_pred (basic_block bb)
1034 {
1035   edge e;
1036   edge_iterator ei;
1037 
1038   FOR_EACH_EDGE (e, ei, bb->preds)
1039     {
1040       if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1041 	return true;
1042     }
1043   return false;
1044 }
1045 
1046 /* Process insns of the basic block given by its LOOP_TREE_NODE to
1047    update allocno live ranges, allocno hard register conflicts,
1048    intersected calls, and register pressure info for allocnos for the
1049    basic block for and regions containing the basic block.  */
1050 static void
1051 process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
1052 {
1053   int i, freq;
1054   unsigned int j;
1055   basic_block bb;
1056   rtx insn;
1057   bitmap_iterator bi;
1058   bitmap reg_live_out;
1059   unsigned int px;
1060   bool set_p;
1061 
1062   bb = loop_tree_node->bb;
1063   if (bb != NULL)
1064     {
1065       for (i = 0; i < ira_pressure_classes_num; i++)
1066 	{
1067 	  curr_reg_pressure[ira_pressure_classes[i]] = 0;
1068 	  high_pressure_start_point[ira_pressure_classes[i]] = -1;
1069 	}
1070       curr_bb_node = loop_tree_node;
1071       reg_live_out = DF_LR_OUT (bb);
1072       sparseset_clear (objects_live);
1073       REG_SET_TO_HARD_REG_SET (hard_regs_live, reg_live_out);
1074       AND_COMPL_HARD_REG_SET (hard_regs_live, eliminable_regset);
1075       AND_COMPL_HARD_REG_SET (hard_regs_live, ira_no_alloc_regs);
1076       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1077 	if (TEST_HARD_REG_BIT (hard_regs_live, i))
1078 	  {
1079 	    enum reg_class aclass, pclass, cl;
1080 
1081 	    aclass = ira_allocno_class_translate[REGNO_REG_CLASS (i)];
1082 	    pclass = ira_pressure_class_translate[aclass];
1083 	    for (j = 0;
1084 		 (cl = ira_reg_class_super_classes[pclass][j])
1085 		   != LIM_REG_CLASSES;
1086 		 j++)
1087 	      {
1088 		if (! ira_reg_pressure_class_p[cl])
1089 		  continue;
1090 		curr_reg_pressure[cl]++;
1091 		if (curr_bb_node->reg_pressure[cl] < curr_reg_pressure[cl])
1092 		  curr_bb_node->reg_pressure[cl] = curr_reg_pressure[cl];
1093 		ira_assert (curr_reg_pressure[cl]
1094 			    <= ira_available_class_regs[cl]);
1095 	      }
1096 	  }
1097       EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi)
1098 	mark_pseudo_regno_live (j);
1099 
1100       freq = REG_FREQ_FROM_BB (bb);
1101       if (freq == 0)
1102 	freq = 1;
1103 
1104       /* Invalidate all allocno_saved_at_call entries.  */
1105       last_call_num++;
1106 
1107       /* Scan the code of this basic block, noting which allocnos and
1108 	 hard regs are born or die.
1109 
1110 	 Note that this loop treats uninitialized values as live until
1111 	 the beginning of the block.  For example, if an instruction
1112 	 uses (reg:DI foo), and only (subreg:SI (reg:DI foo) 0) is ever
1113 	 set, FOO will remain live until the beginning of the block.
1114 	 Likewise if FOO is not set at all.  This is unnecessarily
1115 	 pessimistic, but it probably doesn't matter much in practice.  */
1116       FOR_BB_INSNS_REVERSE (bb, insn)
1117 	{
1118 	  df_ref *def_rec, *use_rec;
1119 	  bool call_p;
1120 
1121 	  if (!NONDEBUG_INSN_P (insn))
1122 	    continue;
1123 
1124 	  if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1125 	    fprintf (ira_dump_file, "   Insn %u(l%d): point = %d\n",
1126 		     INSN_UID (insn), loop_tree_node->parent->loop_num,
1127 		     curr_point);
1128 
1129 	  /* Mark each defined value as live.  We need to do this for
1130 	     unused values because they still conflict with quantities
1131 	     that are live at the time of the definition.
1132 
1133 	     Ignore DF_REF_MAY_CLOBBERs on a call instruction.  Such
1134 	     references represent the effect of the called function
1135 	     on a call-clobbered register.  Marking the register as
1136 	     live would stop us from allocating it to a call-crossing
1137 	     allocno.  */
1138 	  call_p = CALL_P (insn);
1139 	  for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
1140 	    if (!call_p || !DF_REF_FLAGS_IS_SET (*def_rec, DF_REF_MAY_CLOBBER))
1141 	      mark_ref_live (*def_rec);
1142 
1143 	  /* If INSN has multiple outputs, then any value used in one
1144 	     of the outputs conflicts with the other outputs.  Model this
1145 	     by making the used value live during the output phase.
1146 
1147 	     It is unsafe to use !single_set here since it will ignore
1148 	     an unused output.  Just because an output is unused does
1149 	     not mean the compiler can assume the side effect will not
1150 	     occur.  Consider if ALLOCNO appears in the address of an
1151 	     output and we reload the output.  If we allocate ALLOCNO
1152 	     to the same hard register as an unused output we could
1153 	     set the hard register before the output reload insn.  */
1154 	  if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
1155 	    for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1156 	      {
1157 		int i;
1158 		rtx reg;
1159 
1160 		reg = DF_REF_REG (*use_rec);
1161 		for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1162 		  {
1163 		    rtx set;
1164 
1165 		    set = XVECEXP (PATTERN (insn), 0, i);
1166 		    if (GET_CODE (set) == SET
1167 			&& reg_overlap_mentioned_p (reg, SET_DEST (set)))
1168 		      {
1169 			/* After the previous loop, this is a no-op if
1170 			   REG is contained within SET_DEST (SET).  */
1171 			mark_ref_live (*use_rec);
1172 			break;
1173 		      }
1174 		  }
1175 	      }
1176 
1177 	  extract_insn (insn);
1178 	  preprocess_constraints ();
1179 	  process_single_reg_class_operands (false, freq);
1180 
1181 	  /* See which defined values die here.  */
1182 	  for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
1183 	    if (!call_p || !DF_REF_FLAGS_IS_SET (*def_rec, DF_REF_MAY_CLOBBER))
1184 	      mark_ref_dead (*def_rec);
1185 
1186 	  if (call_p)
1187 	    {
1188 	      last_call_num++;
1189 	      sparseset_clear (allocnos_processed);
1190 	      /* The current set of live allocnos are live across the call.  */
1191 	      EXECUTE_IF_SET_IN_SPARSESET (objects_live, i)
1192 	        {
1193 		  ira_object_t obj = ira_object_id_map[i];
1194 		  ira_allocno_t a = OBJECT_ALLOCNO (obj);
1195 		  int num = ALLOCNO_NUM (a);
1196 
1197 		  /* Don't allocate allocnos that cross setjmps or any
1198 		     call, if this function receives a nonlocal
1199 		     goto.  */
1200 		  if (cfun->has_nonlocal_label
1201 		      || find_reg_note (insn, REG_SETJMP,
1202 					NULL_RTX) != NULL_RTX)
1203 		    {
1204 		      SET_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj));
1205 		      SET_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
1206 		    }
1207 		  if (can_throw_internal (insn))
1208 		    {
1209 		      IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
1210 					call_used_reg_set);
1211 		      IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
1212 					call_used_reg_set);
1213 		    }
1214 
1215 		  if (sparseset_bit_p (allocnos_processed, num))
1216 		    continue;
1217 		  sparseset_set_bit (allocnos_processed, num);
1218 
1219 		  if (allocno_saved_at_call[num] != last_call_num)
1220 		    /* Here we are mimicking caller-save.c behaviour
1221 		       which does not save hard register at a call if
1222 		       it was saved on previous call in the same basic
1223 		       block and the hard register was not mentioned
1224 		       between the two calls.  */
1225 		    ALLOCNO_CALL_FREQ (a) += freq;
1226 		  /* Mark it as saved at the next call.  */
1227 		  allocno_saved_at_call[num] = last_call_num + 1;
1228 		  ALLOCNO_CALLS_CROSSED_NUM (a)++;
1229 		}
1230 	    }
1231 
1232 	  make_early_clobber_and_input_conflicts ();
1233 
1234 	  curr_point++;
1235 
1236 	  /* Mark each used value as live.  */
1237 	  for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1238 	    mark_ref_live (*use_rec);
1239 
1240 	  process_single_reg_class_operands (true, freq);
1241 
1242 	  set_p = mark_hard_reg_early_clobbers (insn, true);
1243 
1244 	  if (set_p)
1245 	    {
1246 	      mark_hard_reg_early_clobbers (insn, false);
1247 
1248 	      /* Mark each hard reg as live again.  For example, a
1249 		 hard register can be in clobber and in an insn
1250 		 input.  */
1251 	      for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1252 		{
1253 		  rtx ureg = DF_REF_REG (*use_rec);
1254 
1255 		  if (GET_CODE (ureg) == SUBREG)
1256 		    ureg = SUBREG_REG (ureg);
1257 		  if (! REG_P (ureg) || REGNO (ureg) >= FIRST_PSEUDO_REGISTER)
1258 		    continue;
1259 
1260 		  mark_ref_live (*use_rec);
1261 		}
1262 	    }
1263 
1264 	  curr_point++;
1265 	}
1266 
1267 #ifdef EH_RETURN_DATA_REGNO
1268       if (bb_has_eh_pred (bb))
1269 	for (j = 0; ; ++j)
1270 	  {
1271 	    unsigned int regno = EH_RETURN_DATA_REGNO (j);
1272 	    if (regno == INVALID_REGNUM)
1273 	      break;
1274 	    make_hard_regno_born (regno);
1275 	  }
1276 #endif
1277 
1278       /* Allocnos can't go in stack regs at the start of a basic block
1279 	 that is reached by an abnormal edge. Likewise for call
1280 	 clobbered regs, because caller-save, fixup_abnormal_edges and
1281 	 possibly the table driven EH machinery are not quite ready to
1282 	 handle such allocnos live across such edges.  */
1283       if (bb_has_abnormal_pred (bb))
1284 	{
1285 #ifdef STACK_REGS
1286 	  EXECUTE_IF_SET_IN_SPARSESET (objects_live, px)
1287 	    {
1288 	      ira_allocno_t a = OBJECT_ALLOCNO (ira_object_id_map[px]);
1289 
1290 	      ALLOCNO_NO_STACK_REG_P (a) = true;
1291 	      ALLOCNO_TOTAL_NO_STACK_REG_P (a) = true;
1292 	    }
1293 	  for (px = FIRST_STACK_REG; px <= LAST_STACK_REG; px++)
1294 	    make_hard_regno_born (px);
1295 #endif
1296 	  /* No need to record conflicts for call clobbered regs if we
1297 	     have nonlocal labels around, as we don't ever try to
1298 	     allocate such regs in this case.  */
1299 	  if (!cfun->has_nonlocal_label && bb_has_abnormal_call_pred (bb))
1300 	    for (px = 0; px < FIRST_PSEUDO_REGISTER; px++)
1301 	      if (call_used_regs[px])
1302 		make_hard_regno_born (px);
1303 	}
1304 
1305       EXECUTE_IF_SET_IN_SPARSESET (objects_live, i)
1306 	make_object_dead (ira_object_id_map[i]);
1307 
1308       curr_point++;
1309 
1310     }
1311   /* Propagate register pressure to upper loop tree nodes: */
1312   if (loop_tree_node != ira_loop_tree_root)
1313     for (i = 0; i < ira_pressure_classes_num; i++)
1314       {
1315 	enum reg_class pclass;
1316 
1317 	pclass = ira_pressure_classes[i];
1318 	if (loop_tree_node->reg_pressure[pclass]
1319 	    > loop_tree_node->parent->reg_pressure[pclass])
1320 	  loop_tree_node->parent->reg_pressure[pclass]
1321 	    = loop_tree_node->reg_pressure[pclass];
1322       }
1323 }
1324 
1325 /* Create and set up IRA_START_POINT_RANGES and
1326    IRA_FINISH_POINT_RANGES.  */
1327 static void
1328 create_start_finish_chains (void)
1329 {
1330   ira_object_t obj;
1331   ira_object_iterator oi;
1332   live_range_t r;
1333 
1334   ira_start_point_ranges
1335     = (live_range_t *) ira_allocate (ira_max_point * sizeof (live_range_t));
1336   memset (ira_start_point_ranges, 0, ira_max_point * sizeof (live_range_t));
1337   ira_finish_point_ranges
1338     = (live_range_t *) ira_allocate (ira_max_point * sizeof (live_range_t));
1339   memset (ira_finish_point_ranges, 0, ira_max_point * sizeof (live_range_t));
1340   FOR_EACH_OBJECT (obj, oi)
1341     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1342       {
1343 	r->start_next = ira_start_point_ranges[r->start];
1344 	ira_start_point_ranges[r->start] = r;
1345 	r->finish_next = ira_finish_point_ranges[r->finish];
1346  	  ira_finish_point_ranges[r->finish] = r;
1347       }
1348 }
1349 
1350 /* Rebuild IRA_START_POINT_RANGES and IRA_FINISH_POINT_RANGES after
1351    new live ranges and program points were added as a result if new
1352    insn generation.  */
1353 void
1354 ira_rebuild_start_finish_chains (void)
1355 {
1356   ira_free (ira_finish_point_ranges);
1357   ira_free (ira_start_point_ranges);
1358   create_start_finish_chains ();
1359 }
1360 
1361 /* Compress allocno live ranges by removing program points where
1362    nothing happens.  */
1363 static void
1364 remove_some_program_points_and_update_live_ranges (void)
1365 {
1366   unsigned i;
1367   int n;
1368   int *map;
1369   ira_object_t obj;
1370   ira_object_iterator oi;
1371   live_range_t r;
1372   sbitmap born_or_dead, born, dead;
1373   sbitmap_iterator sbi;
1374   bool born_p, dead_p, prev_born_p, prev_dead_p;
1375 
1376   born = sbitmap_alloc (ira_max_point);
1377   dead = sbitmap_alloc (ira_max_point);
1378   sbitmap_zero (born);
1379   sbitmap_zero (dead);
1380   FOR_EACH_OBJECT (obj, oi)
1381     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1382       {
1383 	ira_assert (r->start <= r->finish);
1384 	SET_BIT (born, r->start);
1385 	SET_BIT (dead, r->finish);
1386       }
1387 
1388   born_or_dead = sbitmap_alloc (ira_max_point);
1389   sbitmap_a_or_b (born_or_dead, born, dead);
1390   map = (int *) ira_allocate (sizeof (int) * ira_max_point);
1391   n = -1;
1392   prev_born_p = prev_dead_p = false;
1393   EXECUTE_IF_SET_IN_SBITMAP (born_or_dead, 0, i, sbi)
1394     {
1395       born_p = TEST_BIT (born, i);
1396       dead_p = TEST_BIT (dead, i);
1397       if ((prev_born_p && ! prev_dead_p && born_p && ! dead_p)
1398 	  || (prev_dead_p && ! prev_born_p && dead_p && ! born_p))
1399 	map[i] = n;
1400       else
1401 	map[i] = ++n;
1402       prev_born_p = born_p;
1403       prev_dead_p = dead_p;
1404     }
1405   sbitmap_free (born_or_dead);
1406   sbitmap_free (born);
1407   sbitmap_free (dead);
1408   n++;
1409   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
1410     fprintf (ira_dump_file, "Compressing live ranges: from %d to %d - %d%%\n",
1411 	     ira_max_point, n, 100 * n / ira_max_point);
1412   ira_max_point = n;
1413 
1414   FOR_EACH_OBJECT (obj, oi)
1415     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1416       {
1417 	r->start = map[r->start];
1418 	r->finish = map[r->finish];
1419       }
1420 
1421   ira_free (map);
1422 }
1423 
1424 /* Print live ranges R to file F.  */
1425 void
1426 ira_print_live_range_list (FILE *f, live_range_t r)
1427 {
1428   for (; r != NULL; r = r->next)
1429     fprintf (f, " [%d..%d]", r->start, r->finish);
1430   fprintf (f, "\n");
1431 }
1432 
1433 /* Print live ranges R to stderr.  */
1434 void
1435 ira_debug_live_range_list (live_range_t r)
1436 {
1437   ira_print_live_range_list (stderr, r);
1438 }
1439 
1440 /* Print live ranges of object OBJ to file F.  */
1441 static void
1442 print_object_live_ranges (FILE *f, ira_object_t obj)
1443 {
1444   ira_print_live_range_list (f, OBJECT_LIVE_RANGES (obj));
1445 }
1446 
1447 /* Print live ranges of allocno A to file F.  */
1448 static void
1449 print_allocno_live_ranges (FILE *f, ira_allocno_t a)
1450 {
1451   int n = ALLOCNO_NUM_OBJECTS (a);
1452   int i;
1453 
1454   for (i = 0; i < n; i++)
1455     {
1456       fprintf (f, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
1457       if (n > 1)
1458 	fprintf (f, " [%d]", i);
1459       fprintf (f, "):");
1460       print_object_live_ranges (f, ALLOCNO_OBJECT (a, i));
1461     }
1462 }
1463 
1464 /* Print live ranges of allocno A to stderr.  */
1465 void
1466 ira_debug_allocno_live_ranges (ira_allocno_t a)
1467 {
1468   print_allocno_live_ranges (stderr, a);
1469 }
1470 
1471 /* Print live ranges of all allocnos to file F.  */
1472 static void
1473 print_live_ranges (FILE *f)
1474 {
1475   ira_allocno_t a;
1476   ira_allocno_iterator ai;
1477 
1478   FOR_EACH_ALLOCNO (a, ai)
1479     print_allocno_live_ranges (f, a);
1480 }
1481 
1482 /* Print live ranges of all allocnos to stderr.  */
1483 void
1484 ira_debug_live_ranges (void)
1485 {
1486   print_live_ranges (stderr);
1487 }
1488 
1489 /* The main entry function creates live ranges, set up
1490    CONFLICT_HARD_REGS and TOTAL_CONFLICT_HARD_REGS for objects, and
1491    calculate register pressure info.  */
1492 void
1493 ira_create_allocno_live_ranges (void)
1494 {
1495   objects_live = sparseset_alloc (ira_objects_num);
1496   allocnos_processed = sparseset_alloc (ira_allocnos_num);
1497   curr_point = 0;
1498   last_call_num = 0;
1499   allocno_saved_at_call
1500     = (int *) ira_allocate (ira_allocnos_num * sizeof (int));
1501   memset (allocno_saved_at_call, 0, ira_allocnos_num * sizeof (int));
1502   ira_traverse_loop_tree (true, ira_loop_tree_root, NULL,
1503 			  process_bb_node_lives);
1504   ira_max_point = curr_point;
1505   create_start_finish_chains ();
1506   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1507     print_live_ranges (ira_dump_file);
1508   /* Clean up.  */
1509   ira_free (allocno_saved_at_call);
1510   sparseset_free (objects_live);
1511   sparseset_free (allocnos_processed);
1512 }
1513 
1514 /* Compress allocno live ranges.  */
1515 void
1516 ira_compress_allocno_live_ranges (void)
1517 {
1518   remove_some_program_points_and_update_live_ranges ();
1519   ira_rebuild_start_finish_chains ();
1520   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1521     {
1522       fprintf (ira_dump_file, "Ranges after the compression:\n");
1523       print_live_ranges (ira_dump_file);
1524     }
1525 }
1526 
1527 /* Free arrays IRA_START_POINT_RANGES and IRA_FINISH_POINT_RANGES.  */
1528 void
1529 ira_finish_allocno_live_ranges (void)
1530 {
1531   ira_free (ira_finish_point_ranges);
1532   ira_free (ira_start_point_ranges);
1533 }
1534