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