OSDN Git Service

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