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