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