OSDN Git Service

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