OSDN Git Service

2011-03-28 Vladimir Makarov <vmakarov@redhat.com>
[pf3gnuchains/gcc-fork.git] / gcc / ira-lives.c
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, nregs;
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   nregs = ira_reg_class_max_nregs[pclass][ALLOCNO_MODE (a)];
307   gcc_assert (nregs == n);
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, nregs);
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, nregs;
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   nregs = ira_reg_class_max_nregs[cl][ALLOCNO_MODE (a)];
434   gcc_assert (nregs == n);
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 ignore_p;
730   enum reg_class cl, next_cl;
731   int c;
732
733   cl = NO_REGS;
734   for (ignore_p = false;
735        (c = *constraints);
736        constraints += CONSTRAINT_LEN (c, constraints))
737     if (c == '#')
738       ignore_p = true;
739     else if (c == ',')
740       ignore_p = false;
741     else if (! ignore_p)
742       switch (c)
743         {
744         case ' ':
745         case '\t':
746         case '=':
747         case '+':
748         case '*':
749         case '&':
750         case '%':
751         case '!':
752         case '?':
753           break;
754         case 'i':
755           if (CONSTANT_P (op)
756               || (equiv_const != NULL_RTX && CONSTANT_P (equiv_const)))
757             return NO_REGS;
758           break;
759
760         case 'n':
761           if (CONST_INT_P (op)
762               || (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode)
763               || (equiv_const != NULL_RTX
764                   && (CONST_INT_P (equiv_const)
765                       || (GET_CODE (equiv_const) == CONST_DOUBLE
766                           && GET_MODE (equiv_const) == VOIDmode))))
767             return NO_REGS;
768           break;
769
770         case 's':
771           if ((CONSTANT_P (op) && !CONST_INT_P (op)
772                && (GET_CODE (op) != CONST_DOUBLE || GET_MODE (op) != VOIDmode))
773               || (equiv_const != NULL_RTX
774                   && CONSTANT_P (equiv_const)
775                   && !CONST_INT_P (equiv_const)
776                   && (GET_CODE (equiv_const) != CONST_DOUBLE
777                       || GET_MODE (equiv_const) != VOIDmode)))
778             return NO_REGS;
779           break;
780
781         case 'I':
782         case 'J':
783         case 'K':
784         case 'L':
785         case 'M':
786         case 'N':
787         case 'O':
788         case 'P':
789           if ((CONST_INT_P (op)
790                && CONST_OK_FOR_CONSTRAINT_P (INTVAL (op), c, constraints))
791               || (equiv_const != NULL_RTX
792                   && CONST_INT_P (equiv_const)
793                   && CONST_OK_FOR_CONSTRAINT_P (INTVAL (equiv_const),
794                                                 c, constraints)))
795             return NO_REGS;
796           break;
797
798         case 'E':
799         case 'F':
800           if (GET_CODE (op) == CONST_DOUBLE
801               || (GET_CODE (op) == CONST_VECTOR
802                   && GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_FLOAT)
803               || (equiv_const != NULL_RTX
804                   && (GET_CODE (equiv_const) == CONST_DOUBLE
805                       || (GET_CODE (equiv_const) == CONST_VECTOR
806                           && (GET_MODE_CLASS (GET_MODE (equiv_const))
807                               == MODE_VECTOR_FLOAT)))))
808             return NO_REGS;
809           break;
810
811         case 'G':
812         case 'H':
813           if ((GET_CODE (op) == CONST_DOUBLE
814                && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (op, c, constraints))
815               || (equiv_const != NULL_RTX
816                   && GET_CODE (equiv_const) == CONST_DOUBLE
817                   && CONST_DOUBLE_OK_FOR_CONSTRAINT_P (equiv_const,
818                                                        c, constraints)))
819             return NO_REGS;
820           /* ??? what about memory */
821         case 'r':
822         case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
823         case 'h': case 'j': case 'k': case 'l':
824         case 'q': case 't': case 'u':
825         case 'v': case 'w': case 'x': case 'y': case 'z':
826         case 'A': case 'B': case 'C': case 'D':
827         case 'Q': case 'R': case 'S': case 'T': case 'U':
828         case 'W': case 'Y': case 'Z':
829           next_cl = (c == 'r'
830                      ? GENERAL_REGS
831                      : REG_CLASS_FROM_CONSTRAINT (c, constraints));
832           if ((cl != NO_REGS && next_cl != cl)
833               || (ira_available_class_regs[next_cl]
834                   > ira_reg_class_max_nregs[next_cl][GET_MODE (op)]))
835             return NO_REGS;
836           cl = next_cl;
837           break;
838
839         case '0': case '1': case '2': case '3': case '4':
840         case '5': case '6': case '7': case '8': case '9':
841           next_cl
842             = single_reg_class (recog_data.constraints[c - '0'],
843                                 recog_data.operand[c - '0'], NULL_RTX);
844           if ((cl != NO_REGS && next_cl != cl)
845               || next_cl == NO_REGS
846               || (ira_available_class_regs[next_cl]
847                   > ira_reg_class_max_nregs[next_cl][GET_MODE (op)]))
848             return NO_REGS;
849           cl = next_cl;
850           break;
851
852         default:
853           return NO_REGS;
854         }
855   return cl;
856 }
857
858 /* The function checks that operand OP_NUM of the current insn can use
859    only one hard register.  If it is so, the function returns the
860    class of the hard register.  Otherwise it returns NO_REGS.  */
861 static enum reg_class
862 single_reg_operand_class (int op_num)
863 {
864   if (op_num < 0 || recog_data.n_alternatives == 0)
865     return NO_REGS;
866   return single_reg_class (recog_data.constraints[op_num],
867                            recog_data.operand[op_num], NULL_RTX);
868 }
869
870 /* The function sets up hard register set *SET to hard registers which
871    might be used by insn reloads because the constraints are too
872    strict.  */
873 void
874 ira_implicitly_set_insn_hard_regs (HARD_REG_SET *set)
875 {
876   int i, c, regno = 0;
877   bool ignore_p;
878   enum reg_class cl;
879   rtx op;
880   enum machine_mode mode;
881
882   CLEAR_HARD_REG_SET (*set);
883   for (i = 0; i < recog_data.n_operands; i++)
884     {
885       op = recog_data.operand[i];
886
887       if (GET_CODE (op) == SUBREG)
888         op = SUBREG_REG (op);
889
890       if (GET_CODE (op) == SCRATCH
891           || (REG_P (op) && (regno = REGNO (op)) >= FIRST_PSEUDO_REGISTER))
892         {
893           const char *p = recog_data.constraints[i];
894
895           mode = (GET_CODE (op) == SCRATCH
896                   ? GET_MODE (op) : PSEUDO_REGNO_MODE (regno));
897           cl = NO_REGS;
898           for (ignore_p = false; (c = *p); p += CONSTRAINT_LEN (c, p))
899             if (c == '#')
900               ignore_p = true;
901             else if (c == ',')
902               ignore_p = false;
903             else if (! ignore_p)
904               switch (c)
905                 {
906                 case 'r':
907                 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
908                 case 'h': case 'j': case 'k': case 'l':
909                 case 'q': case 't': case 'u':
910                 case 'v': case 'w': case 'x': case 'y': case 'z':
911                 case 'A': case 'B': case 'C': case 'D':
912                 case 'Q': case 'R': case 'S': case 'T': case 'U':
913                 case 'W': case 'Y': case 'Z':
914                   cl = (c == 'r'
915                         ? GENERAL_REGS
916                         : REG_CLASS_FROM_CONSTRAINT (c, p));
917                   if (cl != NO_REGS
918                       /* There is no register pressure problem if all of the
919                          regs in this class are fixed.  */
920                       && ira_available_class_regs[cl] != 0
921                       && (ira_available_class_regs[cl]
922                           <= ira_reg_class_max_nregs[cl][mode]))
923                     IOR_HARD_REG_SET (*set, reg_class_contents[cl]);
924                   break;
925                 }
926         }
927     }
928 }
929 /* Processes input operands, if IN_P, or output operands otherwise of
930    the current insn with FREQ to find allocno which can use only one
931    hard register and makes other currently living allocnos conflicting
932    with the hard register.  */
933 static void
934 process_single_reg_class_operands (bool in_p, int freq)
935 {
936   int i, regno;
937   unsigned int px;
938   enum reg_class cl;
939   rtx operand;
940   ira_allocno_t operand_a, a;
941
942   for (i = 0; i < recog_data.n_operands; i++)
943     {
944       operand = recog_data.operand[i];
945       if (in_p && recog_data.operand_type[i] != OP_IN
946           && recog_data.operand_type[i] != OP_INOUT)
947         continue;
948       if (! in_p && recog_data.operand_type[i] != OP_OUT
949           && recog_data.operand_type[i] != OP_INOUT)
950         continue;
951       cl = single_reg_operand_class (i);
952       if (cl == NO_REGS)
953         continue;
954
955       operand_a = NULL;
956
957       if (GET_CODE (operand) == SUBREG)
958         operand = SUBREG_REG (operand);
959
960       if (REG_P (operand)
961           && (regno = REGNO (operand)) >= FIRST_PSEUDO_REGISTER)
962         {
963           enum reg_class aclass;
964
965           operand_a = ira_curr_regno_allocno_map[regno];
966           aclass = ALLOCNO_CLASS (operand_a);
967           if (ira_class_subset_p[cl][aclass]
968               && ira_class_hard_regs_num[cl] != 0)
969             {
970               /* View the desired allocation of OPERAND as:
971
972                     (REG:YMODE YREGNO),
973
974                  a simplification of:
975
976                     (subreg:YMODE (reg:XMODE XREGNO) OFFSET).  */
977               enum machine_mode ymode, xmode;
978               int xregno, yregno;
979               HOST_WIDE_INT offset;
980
981               xmode = recog_data.operand_mode[i];
982               xregno = ira_class_hard_regs[cl][0];
983               ymode = ALLOCNO_MODE (operand_a);
984               offset = subreg_lowpart_offset (ymode, xmode);
985               yregno = simplify_subreg_regno (xregno, xmode, offset, ymode);
986               if (yregno >= 0
987                   && ira_class_hard_reg_index[aclass][yregno] >= 0)
988                 {
989                   int cost;
990
991                   ira_allocate_and_set_costs
992                     (&ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a),
993                      aclass, 0);
994                   ira_init_register_move_cost_if_necessary (xmode);
995                   cost = freq * (in_p
996                                  ? ira_register_move_cost[xmode][aclass][cl]
997                                  : ira_register_move_cost[xmode][cl][aclass]);
998                   ALLOCNO_CONFLICT_HARD_REG_COSTS (operand_a)
999                     [ira_class_hard_reg_index[aclass][yregno]] -= cost;
1000                 }
1001             }
1002         }
1003
1004       EXECUTE_IF_SET_IN_SPARSESET (objects_live, px)
1005         {
1006           ira_object_t obj = ira_object_id_map[px];
1007           a = OBJECT_ALLOCNO (obj);
1008           if (a != operand_a)
1009             {
1010               /* We could increase costs of A instead of making it
1011                  conflicting with the hard register.  But it works worse
1012                  because it will be spilled in reload in anyway.  */
1013               IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
1014                                 reg_class_contents[cl]);
1015               IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
1016                                 reg_class_contents[cl]);
1017             }
1018         }
1019     }
1020 }
1021
1022 /* Return true when one of the predecessor edges of BB is marked with
1023    EDGE_ABNORMAL_CALL or EDGE_EH.  */
1024 static bool
1025 bb_has_abnormal_call_pred (basic_block bb)
1026 {
1027   edge e;
1028   edge_iterator ei;
1029
1030   FOR_EACH_EDGE (e, ei, bb->preds)
1031     {
1032       if (e->flags & (EDGE_ABNORMAL_CALL | EDGE_EH))
1033         return true;
1034     }
1035   return false;
1036 }
1037
1038 /* Process insns of the basic block given by its LOOP_TREE_NODE to
1039    update allocno live ranges, allocno hard register conflicts,
1040    intersected calls, and register pressure info for allocnos for the
1041    basic block for and regions containing the basic block.  */
1042 static void
1043 process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
1044 {
1045   int i, freq;
1046   unsigned int j;
1047   basic_block bb;
1048   rtx insn;
1049   bitmap_iterator bi;
1050   bitmap reg_live_out;
1051   unsigned int px;
1052   bool set_p;
1053
1054   bb = loop_tree_node->bb;
1055   if (bb != NULL)
1056     {
1057       for (i = 0; i < ira_pressure_classes_num; i++)
1058         {
1059           curr_reg_pressure[ira_pressure_classes[i]] = 0;
1060           high_pressure_start_point[ira_pressure_classes[i]] = -1;
1061         }
1062       curr_bb_node = loop_tree_node;
1063       reg_live_out = DF_LR_OUT (bb);
1064       sparseset_clear (objects_live);
1065       REG_SET_TO_HARD_REG_SET (hard_regs_live, reg_live_out);
1066       AND_COMPL_HARD_REG_SET (hard_regs_live, eliminable_regset);
1067       AND_COMPL_HARD_REG_SET (hard_regs_live, ira_no_alloc_regs);
1068       for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
1069         if (TEST_HARD_REG_BIT (hard_regs_live, i))
1070           {
1071             enum reg_class aclass, pclass, cl;
1072
1073             aclass = ira_allocno_class_translate[REGNO_REG_CLASS (i)];
1074             pclass = ira_pressure_class_translate[aclass];
1075             for (j = 0;
1076                  (cl = ira_reg_class_super_classes[pclass][j])
1077                    != LIM_REG_CLASSES;
1078                  j++)
1079               {
1080                 if (! ira_reg_pressure_class_p[cl])
1081                   continue;
1082                 curr_reg_pressure[cl]++;
1083                 if (curr_bb_node->reg_pressure[cl] < curr_reg_pressure[cl])
1084                   curr_bb_node->reg_pressure[cl] = curr_reg_pressure[cl];
1085                 ira_assert (curr_reg_pressure[cl]
1086                             <= ira_available_class_regs[cl]);
1087               }
1088           }
1089       EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi)
1090         mark_pseudo_regno_live (j);
1091
1092       freq = REG_FREQ_FROM_BB (bb);
1093       if (freq == 0)
1094         freq = 1;
1095
1096       /* Invalidate all allocno_saved_at_call entries.  */
1097       last_call_num++;
1098
1099       /* Scan the code of this basic block, noting which allocnos and
1100          hard regs are born or die.
1101
1102          Note that this loop treats uninitialized values as live until
1103          the beginning of the block.  For example, if an instruction
1104          uses (reg:DI foo), and only (subreg:SI (reg:DI foo) 0) is ever
1105          set, FOO will remain live until the beginning of the block.
1106          Likewise if FOO is not set at all.  This is unnecessarily
1107          pessimistic, but it probably doesn't matter much in practice.  */
1108       FOR_BB_INSNS_REVERSE (bb, insn)
1109         {
1110           df_ref *def_rec, *use_rec;
1111           bool call_p;
1112
1113           if (!NONDEBUG_INSN_P (insn))
1114             continue;
1115
1116           if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1117             fprintf (ira_dump_file, "   Insn %u(l%d): point = %d\n",
1118                      INSN_UID (insn), loop_tree_node->parent->loop->num,
1119                      curr_point);
1120
1121           /* Mark each defined value as live.  We need to do this for
1122              unused values because they still conflict with quantities
1123              that are live at the time of the definition.
1124
1125              Ignore DF_REF_MAY_CLOBBERs on a call instruction.  Such
1126              references represent the effect of the called function
1127              on a call-clobbered register.  Marking the register as
1128              live would stop us from allocating it to a call-crossing
1129              allocno.  */
1130           call_p = CALL_P (insn);
1131           for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
1132             if (!call_p || !DF_REF_FLAGS_IS_SET (*def_rec, DF_REF_MAY_CLOBBER))
1133               mark_ref_live (*def_rec);
1134
1135           /* If INSN has multiple outputs, then any value used in one
1136              of the outputs conflicts with the other outputs.  Model this
1137              by making the used value live during the output phase.
1138
1139              It is unsafe to use !single_set here since it will ignore
1140              an unused output.  Just because an output is unused does
1141              not mean the compiler can assume the side effect will not
1142              occur.  Consider if ALLOCNO appears in the address of an
1143              output and we reload the output.  If we allocate ALLOCNO
1144              to the same hard register as an unused output we could
1145              set the hard register before the output reload insn.  */
1146           if (GET_CODE (PATTERN (insn)) == PARALLEL && multiple_sets (insn))
1147             for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1148               {
1149                 int i;
1150                 rtx reg;
1151
1152                 reg = DF_REF_REG (*use_rec);
1153                 for (i = XVECLEN (PATTERN (insn), 0) - 1; i >= 0; i--)
1154                   {
1155                     rtx set;
1156
1157                     set = XVECEXP (PATTERN (insn), 0, i);
1158                     if (GET_CODE (set) == SET
1159                         && reg_overlap_mentioned_p (reg, SET_DEST (set)))
1160                       {
1161                         /* After the previous loop, this is a no-op if
1162                            REG is contained within SET_DEST (SET).  */
1163                         mark_ref_live (*use_rec);
1164                         break;
1165                       }
1166                   }
1167               }
1168
1169           extract_insn (insn);
1170           preprocess_constraints ();
1171           process_single_reg_class_operands (false, freq);
1172
1173           /* See which defined values die here.  */
1174           for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++)
1175             if (!call_p || !DF_REF_FLAGS_IS_SET (*def_rec, DF_REF_MAY_CLOBBER))
1176               mark_ref_dead (*def_rec);
1177
1178           if (call_p)
1179             {
1180               last_call_num++;
1181               sparseset_clear (allocnos_processed);
1182               /* The current set of live allocnos are live across the call.  */
1183               EXECUTE_IF_SET_IN_SPARSESET (objects_live, i)
1184                 {
1185                   ira_object_t obj = ira_object_id_map[i];
1186                   ira_allocno_t a = OBJECT_ALLOCNO (obj);
1187                   int num = ALLOCNO_NUM (a);
1188
1189                   /* Don't allocate allocnos that cross setjmps or any
1190                      call, if this function receives a nonlocal
1191                      goto.  */
1192                   if (cfun->has_nonlocal_label
1193                       || find_reg_note (insn, REG_SETJMP,
1194                                         NULL_RTX) != NULL_RTX)
1195                     {
1196                       SET_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj));
1197                       SET_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
1198                     }
1199                   if (can_throw_internal (insn))
1200                     {
1201                       IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
1202                                         call_used_reg_set);
1203                       IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
1204                                         call_used_reg_set);
1205                     }
1206
1207                   if (sparseset_bit_p (allocnos_processed, num))
1208                     continue;
1209                   sparseset_set_bit (allocnos_processed, num);
1210
1211                   if (allocno_saved_at_call[num] != last_call_num)
1212                     /* Here we are mimicking caller-save.c behaviour
1213                        which does not save hard register at a call if
1214                        it was saved on previous call in the same basic
1215                        block and the hard register was not mentioned
1216                        between the two calls.  */
1217                     ALLOCNO_CALL_FREQ (a) += freq;
1218                   /* Mark it as saved at the next call.  */
1219                   allocno_saved_at_call[num] = last_call_num + 1;
1220                   ALLOCNO_CALLS_CROSSED_NUM (a)++;
1221                 }
1222             }
1223
1224           make_early_clobber_and_input_conflicts ();
1225
1226           curr_point++;
1227
1228           /* Mark each used value as live.  */
1229           for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1230             mark_ref_live (*use_rec);
1231
1232           process_single_reg_class_operands (true, freq);
1233
1234           set_p = mark_hard_reg_early_clobbers (insn, true);
1235
1236           if (set_p)
1237             {
1238               mark_hard_reg_early_clobbers (insn, false);
1239
1240               /* Mark each hard reg as live again.  For example, a
1241                  hard register can be in clobber and in an insn
1242                  input.  */
1243               for (use_rec = DF_INSN_USES (insn); *use_rec; use_rec++)
1244                 {
1245                   rtx ureg = DF_REF_REG (*use_rec);
1246
1247                   if (GET_CODE (ureg) == SUBREG)
1248                     ureg = SUBREG_REG (ureg);
1249                   if (! REG_P (ureg) || REGNO (ureg) >= FIRST_PSEUDO_REGISTER)
1250                     continue;
1251
1252                   mark_ref_live (*use_rec);
1253                 }
1254             }
1255
1256           curr_point++;
1257         }
1258
1259 #ifdef EH_RETURN_DATA_REGNO
1260       if (bb_has_eh_pred (bb))
1261         for (j = 0; ; ++j)
1262           {
1263             unsigned int regno = EH_RETURN_DATA_REGNO (j);
1264             if (regno == INVALID_REGNUM)
1265               break;
1266             make_hard_regno_born (regno);
1267           }
1268 #endif
1269
1270       /* Allocnos can't go in stack regs at the start of a basic block
1271          that is reached by an abnormal edge. Likewise for call
1272          clobbered regs, because caller-save, fixup_abnormal_edges and
1273          possibly the table driven EH machinery are not quite ready to
1274          handle such allocnos live across such edges.  */
1275       if (bb_has_abnormal_pred (bb))
1276         {
1277 #ifdef STACK_REGS
1278           EXECUTE_IF_SET_IN_SPARSESET (objects_live, px)
1279             {
1280               ira_allocno_t a = OBJECT_ALLOCNO (ira_object_id_map[px]);
1281
1282               ALLOCNO_NO_STACK_REG_P (a) = true;
1283               ALLOCNO_TOTAL_NO_STACK_REG_P (a) = true;
1284             }
1285           for (px = FIRST_STACK_REG; px <= LAST_STACK_REG; px++)
1286             make_hard_regno_born (px);
1287 #endif
1288           /* No need to record conflicts for call clobbered regs if we
1289              have nonlocal labels around, as we don't ever try to
1290              allocate such regs in this case.  */
1291           if (!cfun->has_nonlocal_label && bb_has_abnormal_call_pred (bb))
1292             for (px = 0; px < FIRST_PSEUDO_REGISTER; px++)
1293               if (call_used_regs[px])
1294                 make_hard_regno_born (px);
1295         }
1296
1297       EXECUTE_IF_SET_IN_SPARSESET (objects_live, i)
1298         make_object_dead (ira_object_id_map[i]);
1299
1300       curr_point++;
1301
1302     }
1303   /* Propagate register pressure to upper loop tree nodes: */
1304   if (loop_tree_node != ira_loop_tree_root)
1305     for (i = 0; i < ira_pressure_classes_num; i++)
1306       {
1307         enum reg_class pclass;
1308
1309         pclass = ira_pressure_classes[i];
1310         if (loop_tree_node->reg_pressure[pclass]
1311             > loop_tree_node->parent->reg_pressure[pclass])
1312           loop_tree_node->parent->reg_pressure[pclass]
1313             = loop_tree_node->reg_pressure[pclass];
1314       }
1315 }
1316
1317 /* Create and set up IRA_START_POINT_RANGES and
1318    IRA_FINISH_POINT_RANGES.  */
1319 static void
1320 create_start_finish_chains (void)
1321 {
1322   ira_object_t obj;
1323   ira_object_iterator oi;
1324   live_range_t r;
1325
1326   ira_start_point_ranges
1327     = (live_range_t *) ira_allocate (ira_max_point * sizeof (live_range_t));
1328   memset (ira_start_point_ranges, 0, ira_max_point * sizeof (live_range_t));
1329   ira_finish_point_ranges
1330     = (live_range_t *) ira_allocate (ira_max_point * sizeof (live_range_t));
1331   memset (ira_finish_point_ranges, 0, ira_max_point * sizeof (live_range_t));
1332   FOR_EACH_OBJECT (obj, oi)
1333     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1334       {
1335         r->start_next = ira_start_point_ranges[r->start];
1336         ira_start_point_ranges[r->start] = r;
1337         r->finish_next = ira_finish_point_ranges[r->finish];
1338           ira_finish_point_ranges[r->finish] = r;
1339       }
1340 }
1341
1342 /* Rebuild IRA_START_POINT_RANGES and IRA_FINISH_POINT_RANGES after
1343    new live ranges and program points were added as a result if new
1344    insn generation.  */
1345 void
1346 ira_rebuild_start_finish_chains (void)
1347 {
1348   ira_free (ira_finish_point_ranges);
1349   ira_free (ira_start_point_ranges);
1350   create_start_finish_chains ();
1351 }
1352
1353 /* Compress allocno live ranges by removing program points where
1354    nothing happens.  */
1355 static void
1356 remove_some_program_points_and_update_live_ranges (void)
1357 {
1358   unsigned i;
1359   int n;
1360   int *map;
1361   ira_object_t obj;
1362   ira_object_iterator oi;
1363   live_range_t r;
1364   sbitmap born_or_dead, born, dead;
1365   sbitmap_iterator sbi;
1366   bool born_p, dead_p, prev_born_p, prev_dead_p;
1367   
1368   born = sbitmap_alloc (ira_max_point);
1369   dead = sbitmap_alloc (ira_max_point);
1370   sbitmap_zero (born);
1371   sbitmap_zero (dead);
1372   FOR_EACH_OBJECT (obj, oi)
1373     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1374       {
1375         ira_assert (r->start <= r->finish);
1376         SET_BIT (born, r->start);
1377         SET_BIT (dead, r->finish);
1378       }
1379
1380   born_or_dead = sbitmap_alloc (ira_max_point);
1381   sbitmap_a_or_b (born_or_dead, born, dead);
1382   map = (int *) ira_allocate (sizeof (int) * ira_max_point);
1383   n = -1;
1384   prev_born_p = prev_dead_p = false;
1385   EXECUTE_IF_SET_IN_SBITMAP (born_or_dead, 0, i, sbi)
1386     {
1387       born_p = TEST_BIT (born, i);
1388       dead_p = TEST_BIT (dead, i);
1389       if ((prev_born_p && ! prev_dead_p && born_p && ! dead_p)
1390           || (prev_dead_p && ! prev_born_p && dead_p && ! born_p))
1391         map[i] = n;
1392       else
1393         map[i] = ++n;
1394       prev_born_p = born_p;
1395       prev_dead_p = dead_p;
1396     }
1397   sbitmap_free (born_or_dead);
1398   sbitmap_free (born);
1399   sbitmap_free (dead);
1400   n++;
1401   if (internal_flag_ira_verbose > 1 && ira_dump_file != NULL)
1402     fprintf (ira_dump_file, "Compressing live ranges: from %d to %d - %d%%\n",
1403              ira_max_point, n, 100 * n / ira_max_point);
1404   ira_max_point = n;
1405
1406   FOR_EACH_OBJECT (obj, oi)
1407     for (r = OBJECT_LIVE_RANGES (obj); r != NULL; r = r->next)
1408       {
1409         r->start = map[r->start];
1410         r->finish = map[r->finish];
1411       }
1412
1413   ira_free (map);
1414 }
1415
1416 /* Print live ranges R to file F.  */
1417 void
1418 ira_print_live_range_list (FILE *f, live_range_t r)
1419 {
1420   for (; r != NULL; r = r->next)
1421     fprintf (f, " [%d..%d]", r->start, r->finish);
1422   fprintf (f, "\n");
1423 }
1424
1425 /* Print live ranges R to stderr.  */
1426 void
1427 ira_debug_live_range_list (live_range_t r)
1428 {
1429   ira_print_live_range_list (stderr, r);
1430 }
1431
1432 /* Print live ranges of object OBJ to file F.  */
1433 static void
1434 print_object_live_ranges (FILE *f, ira_object_t obj)
1435 {
1436   ira_print_live_range_list (f, OBJECT_LIVE_RANGES (obj));
1437 }
1438
1439 /* Print live ranges of allocno A to file F.  */
1440 static void
1441 print_allocno_live_ranges (FILE *f, ira_allocno_t a)
1442 {
1443   int n = ALLOCNO_NUM_OBJECTS (a);
1444   int i;
1445
1446   for (i = 0; i < n; i++)
1447     {
1448       fprintf (f, " a%d(r%d", ALLOCNO_NUM (a), ALLOCNO_REGNO (a));
1449       if (n > 1)
1450         fprintf (f, " [%d]", i);
1451       fprintf (f, "):");
1452       print_object_live_ranges (f, ALLOCNO_OBJECT (a, i));
1453     }
1454 }
1455
1456 /* Print live ranges of allocno A to stderr.  */
1457 void
1458 ira_debug_allocno_live_ranges (ira_allocno_t a)
1459 {
1460   print_allocno_live_ranges (stderr, a);
1461 }
1462
1463 /* Print live ranges of all allocnos to file F.  */
1464 static void
1465 print_live_ranges (FILE *f)
1466 {
1467   ira_allocno_t a;
1468   ira_allocno_iterator ai;
1469
1470   FOR_EACH_ALLOCNO (a, ai)
1471     print_allocno_live_ranges (f, a);
1472 }
1473
1474 /* Print live ranges of all allocnos to stderr.  */
1475 void
1476 ira_debug_live_ranges (void)
1477 {
1478   print_live_ranges (stderr);
1479 }
1480
1481 /* The main entry function creates live ranges, set up
1482    CONFLICT_HARD_REGS and TOTAL_CONFLICT_HARD_REGS for objects, and
1483    calculate register pressure info.  */
1484 void
1485 ira_create_allocno_live_ranges (void)
1486 {
1487   objects_live = sparseset_alloc (ira_objects_num);
1488   allocnos_processed = sparseset_alloc (ira_allocnos_num);
1489   curr_point = 0;
1490   last_call_num = 0;
1491   allocno_saved_at_call
1492     = (int *) ira_allocate (ira_allocnos_num * sizeof (int));
1493   memset (allocno_saved_at_call, 0, ira_allocnos_num * sizeof (int));
1494   ira_traverse_loop_tree (true, ira_loop_tree_root, NULL,
1495                           process_bb_node_lives);
1496   ira_max_point = curr_point;
1497   create_start_finish_chains ();
1498   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1499     print_live_ranges (ira_dump_file);
1500   /* Clean up.  */
1501   ira_free (allocno_saved_at_call);
1502   sparseset_free (objects_live);
1503   sparseset_free (allocnos_processed);
1504 }
1505
1506 /* Compress allocno live ranges.  */
1507 void
1508 ira_compress_allocno_live_ranges (void)
1509 {
1510   remove_some_program_points_and_update_live_ranges ();
1511   ira_rebuild_start_finish_chains ();
1512   if (internal_flag_ira_verbose > 2 && ira_dump_file != NULL)
1513     {
1514       fprintf (ira_dump_file, "Ranges after the compression:\n");
1515       print_live_ranges (ira_dump_file);
1516     }
1517 }
1518
1519 /* Free arrays IRA_START_POINT_RANGES and IRA_FINISH_POINT_RANGES.  */
1520 void
1521 ira_finish_allocno_live_ranges (void)
1522 {
1523   ira_free (ira_finish_point_ranges);
1524   ira_free (ira_start_point_ranges);
1525 }