xref: /dflybsd-src/contrib/gcc-8.0/gcc/lra-lives.c (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
1*38fd1498Szrj /* Build live ranges for pseudos.
2*38fd1498Szrj    Copyright (C) 2010-2018 Free Software Foundation, Inc.
3*38fd1498Szrj    Contributed by Vladimir Makarov <vmakarov@redhat.com>.
4*38fd1498Szrj 
5*38fd1498Szrj This file is part of GCC.
6*38fd1498Szrj 
7*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
8*38fd1498Szrj the terms of the GNU General Public License as published by the Free
9*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
10*38fd1498Szrj version.
11*38fd1498Szrj 
12*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
14*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15*38fd1498Szrj for more details.
16*38fd1498Szrj 
17*38fd1498Szrj You should have received a copy of the GNU General Public License
18*38fd1498Szrj along with GCC; see the file COPYING3.	If not see
19*38fd1498Szrj <http://www.gnu.org/licenses/>.	 */
20*38fd1498Szrj 
21*38fd1498Szrj 
22*38fd1498Szrj /* This file contains code to build pseudo live-ranges (analogous
23*38fd1498Szrj    structures used in IRA, so read comments about the live-ranges
24*38fd1498Szrj    there) and other info necessary for other passes to assign
25*38fd1498Szrj    hard-registers to pseudos, coalesce the spilled pseudos, and assign
26*38fd1498Szrj    stack memory slots to spilled pseudos.  */
27*38fd1498Szrj 
28*38fd1498Szrj #include "config.h"
29*38fd1498Szrj #include "system.h"
30*38fd1498Szrj #include "coretypes.h"
31*38fd1498Szrj #include "backend.h"
32*38fd1498Szrj #include "rtl.h"
33*38fd1498Szrj #include "tree.h"
34*38fd1498Szrj #include "predict.h"
35*38fd1498Szrj #include "df.h"
36*38fd1498Szrj #include "memmodel.h"
37*38fd1498Szrj #include "tm_p.h"
38*38fd1498Szrj #include "insn-config.h"
39*38fd1498Szrj #include "regs.h"
40*38fd1498Szrj #include "ira.h"
41*38fd1498Szrj #include "recog.h"
42*38fd1498Szrj #include "cfganal.h"
43*38fd1498Szrj #include "sparseset.h"
44*38fd1498Szrj #include "lra-int.h"
45*38fd1498Szrj #include "target.h"
46*38fd1498Szrj 
47*38fd1498Szrj /* Program points are enumerated by numbers from range
48*38fd1498Szrj    0..LRA_LIVE_MAX_POINT-1.  There are approximately two times more
49*38fd1498Szrj    program points than insns.  Program points are places in the
50*38fd1498Szrj    program where liveness info can be changed.	In most general case
51*38fd1498Szrj    (there are more complicated cases too) some program points
52*38fd1498Szrj    correspond to places where input operand dies and other ones
53*38fd1498Szrj    correspond to places where output operands are born.	 */
54*38fd1498Szrj int lra_live_max_point;
55*38fd1498Szrj 
56*38fd1498Szrj /* Accumulated execution frequency of all references for each hard
57*38fd1498Szrj    register.  */
58*38fd1498Szrj int lra_hard_reg_usage[FIRST_PSEUDO_REGISTER];
59*38fd1498Szrj 
60*38fd1498Szrj /* A global flag whose true value says to build live ranges for all
61*38fd1498Szrj    pseudos, otherwise the live ranges only for pseudos got memory is
62*38fd1498Szrj    build.  True value means also building copies and setting up hard
63*38fd1498Szrj    register preferences.  The complete info is necessary only for the
64*38fd1498Szrj    assignment pass.  The complete info is not needed for the
65*38fd1498Szrj    coalescing and spill passes.	 */
66*38fd1498Szrj static bool complete_info_p;
67*38fd1498Szrj 
68*38fd1498Szrj /* Pseudos live at current point in the RTL scan.  */
69*38fd1498Szrj static sparseset pseudos_live;
70*38fd1498Szrj 
71*38fd1498Szrj /* Pseudos probably living through calls and setjumps.	As setjump is
72*38fd1498Szrj    a call too, if a bit in PSEUDOS_LIVE_THROUGH_SETJUMPS is set up
73*38fd1498Szrj    then the corresponding bit in PSEUDOS_LIVE_THROUGH_CALLS is set up
74*38fd1498Szrj    too.	 These data are necessary for cases when only one subreg of a
75*38fd1498Szrj    multi-reg pseudo is set up after a call.  So we decide it is
76*38fd1498Szrj    probably live when traversing bb backward.  We are sure about
77*38fd1498Szrj    living when we see its usage or definition of the pseudo.  */
78*38fd1498Szrj static sparseset pseudos_live_through_calls;
79*38fd1498Szrj static sparseset pseudos_live_through_setjumps;
80*38fd1498Szrj 
81*38fd1498Szrj /* Set of hard regs (except eliminable ones) currently live.  */
82*38fd1498Szrj static HARD_REG_SET hard_regs_live;
83*38fd1498Szrj 
84*38fd1498Szrj /* Set of pseudos and hard registers start living/dying in the current
85*38fd1498Szrj    insn.  These sets are used to update REG_DEAD and REG_UNUSED notes
86*38fd1498Szrj    in the insn.	 */
87*38fd1498Szrj static sparseset start_living, start_dying;
88*38fd1498Szrj 
89*38fd1498Szrj /* Set of pseudos and hard regs dead and unused in the current
90*38fd1498Szrj    insn.  */
91*38fd1498Szrj static sparseset unused_set, dead_set;
92*38fd1498Szrj 
93*38fd1498Szrj /* Bitmap used for holding intermediate bitmap operation results.  */
94*38fd1498Szrj static bitmap_head temp_bitmap;
95*38fd1498Szrj 
96*38fd1498Szrj /* Pool for pseudo live ranges.	 */
97*38fd1498Szrj static object_allocator<lra_live_range> lra_live_range_pool ("live ranges");
98*38fd1498Szrj 
99*38fd1498Szrj /* Free live range list LR.  */
100*38fd1498Szrj static void
free_live_range_list(lra_live_range_t lr)101*38fd1498Szrj free_live_range_list (lra_live_range_t lr)
102*38fd1498Szrj {
103*38fd1498Szrj   lra_live_range_t next;
104*38fd1498Szrj 
105*38fd1498Szrj   while (lr != NULL)
106*38fd1498Szrj     {
107*38fd1498Szrj       next = lr->next;
108*38fd1498Szrj       lra_live_range_pool.remove (lr);
109*38fd1498Szrj       lr = next;
110*38fd1498Szrj     }
111*38fd1498Szrj }
112*38fd1498Szrj 
113*38fd1498Szrj /* Create and return pseudo live range with given attributes.  */
114*38fd1498Szrj static lra_live_range_t
create_live_range(int regno,int start,int finish,lra_live_range_t next)115*38fd1498Szrj create_live_range (int regno, int start, int finish, lra_live_range_t next)
116*38fd1498Szrj {
117*38fd1498Szrj   lra_live_range_t p = lra_live_range_pool.allocate ();
118*38fd1498Szrj   p->regno = regno;
119*38fd1498Szrj   p->start = start;
120*38fd1498Szrj   p->finish = finish;
121*38fd1498Szrj   p->next = next;
122*38fd1498Szrj   return p;
123*38fd1498Szrj }
124*38fd1498Szrj 
125*38fd1498Szrj /* Copy live range R and return the result.  */
126*38fd1498Szrj static lra_live_range_t
copy_live_range(lra_live_range_t r)127*38fd1498Szrj copy_live_range (lra_live_range_t r)
128*38fd1498Szrj {
129*38fd1498Szrj   return new (lra_live_range_pool) lra_live_range (*r);
130*38fd1498Szrj }
131*38fd1498Szrj 
132*38fd1498Szrj /* Copy live range list given by its head R and return the result.  */
133*38fd1498Szrj lra_live_range_t
lra_copy_live_range_list(lra_live_range_t r)134*38fd1498Szrj lra_copy_live_range_list (lra_live_range_t r)
135*38fd1498Szrj {
136*38fd1498Szrj   lra_live_range_t p, first, *chain;
137*38fd1498Szrj 
138*38fd1498Szrj   first = NULL;
139*38fd1498Szrj   for (chain = &first; r != NULL; r = r->next)
140*38fd1498Szrj     {
141*38fd1498Szrj       p = copy_live_range (r);
142*38fd1498Szrj       *chain = p;
143*38fd1498Szrj       chain = &p->next;
144*38fd1498Szrj     }
145*38fd1498Szrj   return first;
146*38fd1498Szrj }
147*38fd1498Szrj 
148*38fd1498Szrj /* Merge *non-intersected* ranges R1 and R2 and returns the result.
149*38fd1498Szrj    The function maintains the order of ranges and tries to minimize
150*38fd1498Szrj    size of the result range list.  Ranges R1 and R2 may not be used
151*38fd1498Szrj    after the call.  */
152*38fd1498Szrj lra_live_range_t
lra_merge_live_ranges(lra_live_range_t r1,lra_live_range_t r2)153*38fd1498Szrj lra_merge_live_ranges (lra_live_range_t r1, lra_live_range_t r2)
154*38fd1498Szrj {
155*38fd1498Szrj   lra_live_range_t first, last;
156*38fd1498Szrj 
157*38fd1498Szrj   if (r1 == NULL)
158*38fd1498Szrj     return r2;
159*38fd1498Szrj   if (r2 == NULL)
160*38fd1498Szrj     return r1;
161*38fd1498Szrj   for (first = last = NULL; r1 != NULL && r2 != NULL;)
162*38fd1498Szrj     {
163*38fd1498Szrj       if (r1->start < r2->start)
164*38fd1498Szrj 	std::swap (r1, r2);
165*38fd1498Szrj 
166*38fd1498Szrj       if (r1->start == r2->finish + 1)
167*38fd1498Szrj 	{
168*38fd1498Szrj 	  /* Joint ranges: merge r1 and r2 into r1.  */
169*38fd1498Szrj 	  r1->start = r2->start;
170*38fd1498Szrj 	  lra_live_range_t temp = r2;
171*38fd1498Szrj 	  r2 = r2->next;
172*38fd1498Szrj 	  lra_live_range_pool.remove (temp);
173*38fd1498Szrj 	}
174*38fd1498Szrj       else
175*38fd1498Szrj 	{
176*38fd1498Szrj 	  gcc_assert (r2->finish + 1 < r1->start);
177*38fd1498Szrj 	  /* Add r1 to the result.  */
178*38fd1498Szrj 	  if (first == NULL)
179*38fd1498Szrj 	    first = last = r1;
180*38fd1498Szrj 	  else
181*38fd1498Szrj 	    {
182*38fd1498Szrj 	      last->next = r1;
183*38fd1498Szrj 	      last = r1;
184*38fd1498Szrj 	    }
185*38fd1498Szrj 	  r1 = r1->next;
186*38fd1498Szrj 	}
187*38fd1498Szrj     }
188*38fd1498Szrj   if (r1 != NULL)
189*38fd1498Szrj     {
190*38fd1498Szrj       if (first == NULL)
191*38fd1498Szrj 	first = r1;
192*38fd1498Szrj       else
193*38fd1498Szrj 	last->next = r1;
194*38fd1498Szrj     }
195*38fd1498Szrj   else
196*38fd1498Szrj     {
197*38fd1498Szrj       lra_assert (r2 != NULL);
198*38fd1498Szrj       if (first == NULL)
199*38fd1498Szrj 	first = r2;
200*38fd1498Szrj       else
201*38fd1498Szrj 	last->next = r2;
202*38fd1498Szrj     }
203*38fd1498Szrj   return first;
204*38fd1498Szrj }
205*38fd1498Szrj 
206*38fd1498Szrj /* Return TRUE if live ranges R1 and R2 intersect.  */
207*38fd1498Szrj bool
lra_intersected_live_ranges_p(lra_live_range_t r1,lra_live_range_t r2)208*38fd1498Szrj lra_intersected_live_ranges_p (lra_live_range_t r1, lra_live_range_t r2)
209*38fd1498Szrj {
210*38fd1498Szrj   /* Remember the live ranges are always kept ordered.	*/
211*38fd1498Szrj   while (r1 != NULL && r2 != NULL)
212*38fd1498Szrj     {
213*38fd1498Szrj       if (r1->start > r2->finish)
214*38fd1498Szrj 	r1 = r1->next;
215*38fd1498Szrj       else if (r2->start > r1->finish)
216*38fd1498Szrj 	r2 = r2->next;
217*38fd1498Szrj       else
218*38fd1498Szrj 	return true;
219*38fd1498Szrj     }
220*38fd1498Szrj   return false;
221*38fd1498Szrj }
222*38fd1498Szrj 
223*38fd1498Szrj /* The corresponding bitmaps of BB currently being processed.  */
224*38fd1498Szrj static bitmap bb_killed_pseudos, bb_gen_pseudos;
225*38fd1498Szrj 
226*38fd1498Szrj /* The function processing birth of hard register REGNO.  It updates
227*38fd1498Szrj    living hard regs, START_LIVING, and conflict hard regs for living
228*38fd1498Szrj    pseudos.  Conflict hard regs for the pic pseudo is not updated if
229*38fd1498Szrj    REGNO is REAL_PIC_OFFSET_TABLE_REGNUM and CHECK_PIC_PSEUDO_P is
230*38fd1498Szrj    true.  */
231*38fd1498Szrj static void
make_hard_regno_born(int regno,bool check_pic_pseudo_p ATTRIBUTE_UNUSED)232*38fd1498Szrj make_hard_regno_born (int regno, bool check_pic_pseudo_p ATTRIBUTE_UNUSED)
233*38fd1498Szrj {
234*38fd1498Szrj   unsigned int i;
235*38fd1498Szrj 
236*38fd1498Szrj   lra_assert (regno < FIRST_PSEUDO_REGISTER);
237*38fd1498Szrj   if (TEST_HARD_REG_BIT (hard_regs_live, regno))
238*38fd1498Szrj     return;
239*38fd1498Szrj   SET_HARD_REG_BIT (hard_regs_live, regno);
240*38fd1498Szrj   sparseset_set_bit (start_living, regno);
241*38fd1498Szrj   EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i)
242*38fd1498Szrj #ifdef REAL_PIC_OFFSET_TABLE_REGNUM
243*38fd1498Szrj     if (! check_pic_pseudo_p
244*38fd1498Szrj 	|| regno != REAL_PIC_OFFSET_TABLE_REGNUM
245*38fd1498Szrj 	|| pic_offset_table_rtx == NULL
246*38fd1498Szrj 	|| i != REGNO (pic_offset_table_rtx))
247*38fd1498Szrj #endif
248*38fd1498Szrj       SET_HARD_REG_BIT (lra_reg_info[i].conflict_hard_regs, regno);
249*38fd1498Szrj   if (fixed_regs[regno] || TEST_HARD_REG_BIT (hard_regs_spilled_into, regno))
250*38fd1498Szrj     bitmap_set_bit (bb_gen_pseudos, regno);
251*38fd1498Szrj }
252*38fd1498Szrj 
253*38fd1498Szrj /* Process the death of hard register REGNO.  This updates
254*38fd1498Szrj    hard_regs_live and START_DYING.  */
255*38fd1498Szrj static void
make_hard_regno_dead(int regno)256*38fd1498Szrj make_hard_regno_dead (int regno)
257*38fd1498Szrj {
258*38fd1498Szrj   lra_assert (regno < FIRST_PSEUDO_REGISTER);
259*38fd1498Szrj   if (! TEST_HARD_REG_BIT (hard_regs_live, regno))
260*38fd1498Szrj     return;
261*38fd1498Szrj   sparseset_set_bit (start_dying, regno);
262*38fd1498Szrj   CLEAR_HARD_REG_BIT (hard_regs_live, regno);
263*38fd1498Szrj   if (fixed_regs[regno] || TEST_HARD_REG_BIT (hard_regs_spilled_into, regno))
264*38fd1498Szrj     {
265*38fd1498Szrj       bitmap_clear_bit (bb_gen_pseudos, regno);
266*38fd1498Szrj       bitmap_set_bit (bb_killed_pseudos, regno);
267*38fd1498Szrj     }
268*38fd1498Szrj }
269*38fd1498Szrj 
270*38fd1498Szrj /* Mark pseudo REGNO as living at program point POINT, update conflicting
271*38fd1498Szrj    hard registers of the pseudo and START_LIVING, and start a new live
272*38fd1498Szrj    range for the pseudo corresponding to REGNO if it is necessary.  */
273*38fd1498Szrj static void
mark_pseudo_live(int regno,int point)274*38fd1498Szrj mark_pseudo_live (int regno, int point)
275*38fd1498Szrj {
276*38fd1498Szrj   lra_live_range_t p;
277*38fd1498Szrj 
278*38fd1498Szrj   lra_assert (regno >= FIRST_PSEUDO_REGISTER);
279*38fd1498Szrj   lra_assert (! sparseset_bit_p (pseudos_live, regno));
280*38fd1498Szrj   sparseset_set_bit (pseudos_live, regno);
281*38fd1498Szrj   IOR_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs, hard_regs_live);
282*38fd1498Szrj 
283*38fd1498Szrj   if ((complete_info_p || lra_get_regno_hard_regno (regno) < 0)
284*38fd1498Szrj       && ((p = lra_reg_info[regno].live_ranges) == NULL
285*38fd1498Szrj 	  || (p->finish != point && p->finish + 1 != point)))
286*38fd1498Szrj      lra_reg_info[regno].live_ranges
287*38fd1498Szrj        = create_live_range (regno, point, -1, p);
288*38fd1498Szrj   sparseset_set_bit (start_living, regno);
289*38fd1498Szrj }
290*38fd1498Szrj 
291*38fd1498Szrj /* Mark pseudo REGNO as not living at program point POINT and update
292*38fd1498Szrj    START_DYING.
293*38fd1498Szrj    This finishes the current live range for the pseudo corresponding
294*38fd1498Szrj    to REGNO.  */
295*38fd1498Szrj static void
mark_pseudo_dead(int regno,int point)296*38fd1498Szrj mark_pseudo_dead (int regno, int point)
297*38fd1498Szrj {
298*38fd1498Szrj   lra_live_range_t p;
299*38fd1498Szrj 
300*38fd1498Szrj   lra_assert (regno >= FIRST_PSEUDO_REGISTER);
301*38fd1498Szrj   lra_assert (sparseset_bit_p (pseudos_live, regno));
302*38fd1498Szrj   sparseset_clear_bit (pseudos_live, regno);
303*38fd1498Szrj   sparseset_set_bit (start_dying, regno);
304*38fd1498Szrj   if (complete_info_p || lra_get_regno_hard_regno (regno) < 0)
305*38fd1498Szrj     {
306*38fd1498Szrj       p = lra_reg_info[regno].live_ranges;
307*38fd1498Szrj       lra_assert (p != NULL);
308*38fd1498Szrj       p->finish = point;
309*38fd1498Szrj     }
310*38fd1498Szrj }
311*38fd1498Szrj 
312*38fd1498Szrj /* Mark register REGNO (pseudo or hard register) in MODE as live at
313*38fd1498Szrj    program point POINT.  Update BB_GEN_PSEUDOS.
314*38fd1498Szrj    Return TRUE if the liveness tracking sets were modified, or FALSE
315*38fd1498Szrj    if nothing changed.  */
316*38fd1498Szrj static bool
mark_regno_live(int regno,machine_mode mode,int point)317*38fd1498Szrj mark_regno_live (int regno, machine_mode mode, int point)
318*38fd1498Szrj {
319*38fd1498Szrj   int last;
320*38fd1498Szrj   bool changed = false;
321*38fd1498Szrj 
322*38fd1498Szrj   if (regno < FIRST_PSEUDO_REGISTER)
323*38fd1498Szrj     {
324*38fd1498Szrj       for (last = end_hard_regno (mode, regno); regno < last; regno++)
325*38fd1498Szrj 	make_hard_regno_born (regno, false);
326*38fd1498Szrj     }
327*38fd1498Szrj   else
328*38fd1498Szrj     {
329*38fd1498Szrj       if (! sparseset_bit_p (pseudos_live, regno))
330*38fd1498Szrj 	{
331*38fd1498Szrj 	  mark_pseudo_live (regno, point);
332*38fd1498Szrj 	  changed = true;
333*38fd1498Szrj 	}
334*38fd1498Szrj       bitmap_set_bit (bb_gen_pseudos, regno);
335*38fd1498Szrj     }
336*38fd1498Szrj   return changed;
337*38fd1498Szrj }
338*38fd1498Szrj 
339*38fd1498Szrj 
340*38fd1498Szrj /* Mark register REGNO in MODE as dead at program point POINT.  Update
341*38fd1498Szrj    BB_GEN_PSEUDOS and BB_KILLED_PSEUDOS.  Return TRUE if the liveness
342*38fd1498Szrj    tracking sets were modified, or FALSE if nothing changed.  */
343*38fd1498Szrj static bool
mark_regno_dead(int regno,machine_mode mode,int point)344*38fd1498Szrj mark_regno_dead (int regno, machine_mode mode, int point)
345*38fd1498Szrj {
346*38fd1498Szrj   int last;
347*38fd1498Szrj   bool changed = false;
348*38fd1498Szrj 
349*38fd1498Szrj   if (regno < FIRST_PSEUDO_REGISTER)
350*38fd1498Szrj     {
351*38fd1498Szrj       for (last = end_hard_regno (mode, regno); regno < last; regno++)
352*38fd1498Szrj 	make_hard_regno_dead (regno);
353*38fd1498Szrj     }
354*38fd1498Szrj   else
355*38fd1498Szrj     {
356*38fd1498Szrj       if (sparseset_bit_p (pseudos_live, regno))
357*38fd1498Szrj 	{
358*38fd1498Szrj 	  mark_pseudo_dead (regno, point);
359*38fd1498Szrj 	  changed = true;
360*38fd1498Szrj 	}
361*38fd1498Szrj       bitmap_clear_bit (bb_gen_pseudos, regno);
362*38fd1498Szrj       bitmap_set_bit (bb_killed_pseudos, regno);
363*38fd1498Szrj     }
364*38fd1498Szrj   return changed;
365*38fd1498Szrj }
366*38fd1498Szrj 
367*38fd1498Szrj 
368*38fd1498Szrj 
369*38fd1498Szrj /* This page contains code for making global live analysis of pseudos.
370*38fd1498Szrj    The code works only when pseudo live info is changed on a BB
371*38fd1498Szrj    border.  That might be a consequence of some global transformations
372*38fd1498Szrj    in LRA, e.g. PIC pseudo reuse or rematerialization.  */
373*38fd1498Szrj 
374*38fd1498Szrj /* Structure describing local BB data used for pseudo
375*38fd1498Szrj    live-analysis.  */
376*38fd1498Szrj struct bb_data_pseudos
377*38fd1498Szrj {
378*38fd1498Szrj   /* Basic block about which the below data are.  */
379*38fd1498Szrj   basic_block bb;
380*38fd1498Szrj   bitmap_head killed_pseudos; /* pseudos killed in the BB.  */
381*38fd1498Szrj   bitmap_head gen_pseudos; /* pseudos generated in the BB.  */
382*38fd1498Szrj };
383*38fd1498Szrj 
384*38fd1498Szrj /* Array for all BB data.  Indexed by the corresponding BB index.  */
385*38fd1498Szrj typedef struct bb_data_pseudos *bb_data_t;
386*38fd1498Szrj 
387*38fd1498Szrj /* All basic block data are referred through the following array.  */
388*38fd1498Szrj static bb_data_t bb_data;
389*38fd1498Szrj 
390*38fd1498Szrj /* Two small functions for access to the bb data.  */
391*38fd1498Szrj static inline bb_data_t
get_bb_data(basic_block bb)392*38fd1498Szrj get_bb_data (basic_block bb)
393*38fd1498Szrj {
394*38fd1498Szrj   return &bb_data[(bb)->index];
395*38fd1498Szrj }
396*38fd1498Szrj 
397*38fd1498Szrj static inline bb_data_t
get_bb_data_by_index(int index)398*38fd1498Szrj get_bb_data_by_index (int index)
399*38fd1498Szrj {
400*38fd1498Szrj   return &bb_data[index];
401*38fd1498Szrj }
402*38fd1498Szrj 
403*38fd1498Szrj /* Bitmap with all hard regs.  */
404*38fd1498Szrj static bitmap_head all_hard_regs_bitmap;
405*38fd1498Szrj 
406*38fd1498Szrj /* The transfer function used by the DF equation solver to propagate
407*38fd1498Szrj    live info through block with BB_INDEX according to the following
408*38fd1498Szrj    equation:
409*38fd1498Szrj 
410*38fd1498Szrj      bb.livein = (bb.liveout - bb.kill) OR bb.gen
411*38fd1498Szrj */
412*38fd1498Szrj static bool
live_trans_fun(int bb_index)413*38fd1498Szrj live_trans_fun (int bb_index)
414*38fd1498Szrj {
415*38fd1498Szrj   basic_block bb = get_bb_data_by_index (bb_index)->bb;
416*38fd1498Szrj   bitmap bb_liveout = df_get_live_out (bb);
417*38fd1498Szrj   bitmap bb_livein = df_get_live_in (bb);
418*38fd1498Szrj   bb_data_t bb_info = get_bb_data (bb);
419*38fd1498Szrj 
420*38fd1498Szrj   bitmap_and_compl (&temp_bitmap, bb_liveout, &all_hard_regs_bitmap);
421*38fd1498Szrj   return bitmap_ior_and_compl (bb_livein, &bb_info->gen_pseudos,
422*38fd1498Szrj 			       &temp_bitmap, &bb_info->killed_pseudos);
423*38fd1498Szrj }
424*38fd1498Szrj 
425*38fd1498Szrj /* The confluence function used by the DF equation solver to set up
426*38fd1498Szrj    live info for a block BB without predecessor.  */
427*38fd1498Szrj static void
live_con_fun_0(basic_block bb)428*38fd1498Szrj live_con_fun_0 (basic_block bb)
429*38fd1498Szrj {
430*38fd1498Szrj   bitmap_and_into (df_get_live_out (bb), &all_hard_regs_bitmap);
431*38fd1498Szrj }
432*38fd1498Szrj 
433*38fd1498Szrj /* The confluence function used by the DF equation solver to propagate
434*38fd1498Szrj    live info from successor to predecessor on edge E according to the
435*38fd1498Szrj    following equation:
436*38fd1498Szrj 
437*38fd1498Szrj       bb.liveout = 0 for entry block | OR (livein of successors)
438*38fd1498Szrj  */
439*38fd1498Szrj static bool
live_con_fun_n(edge e)440*38fd1498Szrj live_con_fun_n (edge e)
441*38fd1498Szrj {
442*38fd1498Szrj   basic_block bb = e->src;
443*38fd1498Szrj   basic_block dest = e->dest;
444*38fd1498Szrj   bitmap bb_liveout = df_get_live_out (bb);
445*38fd1498Szrj   bitmap dest_livein = df_get_live_in (dest);
446*38fd1498Szrj 
447*38fd1498Szrj   return bitmap_ior_and_compl_into (bb_liveout,
448*38fd1498Szrj 				    dest_livein, &all_hard_regs_bitmap);
449*38fd1498Szrj }
450*38fd1498Szrj 
451*38fd1498Szrj /* Indexes of all function blocks.  */
452*38fd1498Szrj static bitmap_head all_blocks;
453*38fd1498Szrj 
454*38fd1498Szrj /* Allocate and initialize data needed for global pseudo live
455*38fd1498Szrj    analysis.  */
456*38fd1498Szrj static void
initiate_live_solver(void)457*38fd1498Szrj initiate_live_solver (void)
458*38fd1498Szrj {
459*38fd1498Szrj   bitmap_initialize (&all_hard_regs_bitmap, &reg_obstack);
460*38fd1498Szrj   bitmap_set_range (&all_hard_regs_bitmap, 0, FIRST_PSEUDO_REGISTER);
461*38fd1498Szrj   bb_data = XNEWVEC (struct bb_data_pseudos, last_basic_block_for_fn (cfun));
462*38fd1498Szrj   bitmap_initialize (&all_blocks, &reg_obstack);
463*38fd1498Szrj 
464*38fd1498Szrj   basic_block bb;
465*38fd1498Szrj   FOR_ALL_BB_FN (bb, cfun)
466*38fd1498Szrj     {
467*38fd1498Szrj       bb_data_t bb_info = get_bb_data (bb);
468*38fd1498Szrj       bb_info->bb = bb;
469*38fd1498Szrj       bitmap_initialize (&bb_info->killed_pseudos, &reg_obstack);
470*38fd1498Szrj       bitmap_initialize (&bb_info->gen_pseudos, &reg_obstack);
471*38fd1498Szrj       bitmap_set_bit (&all_blocks, bb->index);
472*38fd1498Szrj     }
473*38fd1498Szrj }
474*38fd1498Szrj 
475*38fd1498Szrj /* Free all data needed for global pseudo live analysis.  */
476*38fd1498Szrj static void
finish_live_solver(void)477*38fd1498Szrj finish_live_solver (void)
478*38fd1498Szrj {
479*38fd1498Szrj   basic_block bb;
480*38fd1498Szrj 
481*38fd1498Szrj   bitmap_clear (&all_blocks);
482*38fd1498Szrj   FOR_ALL_BB_FN (bb, cfun)
483*38fd1498Szrj     {
484*38fd1498Szrj       bb_data_t bb_info = get_bb_data (bb);
485*38fd1498Szrj       bitmap_clear (&bb_info->killed_pseudos);
486*38fd1498Szrj       bitmap_clear (&bb_info->gen_pseudos);
487*38fd1498Szrj     }
488*38fd1498Szrj   free (bb_data);
489*38fd1498Szrj   bitmap_clear (&all_hard_regs_bitmap);
490*38fd1498Szrj }
491*38fd1498Szrj 
492*38fd1498Szrj 
493*38fd1498Szrj 
494*38fd1498Szrj /* Insn currently scanned.  */
495*38fd1498Szrj static rtx_insn *curr_insn;
496*38fd1498Szrj /* The insn data.  */
497*38fd1498Szrj static lra_insn_recog_data_t curr_id;
498*38fd1498Szrj /* The insn static data.  */
499*38fd1498Szrj static struct lra_static_insn_data *curr_static_id;
500*38fd1498Szrj 
501*38fd1498Szrj /* Vec containing execution frequencies of program points.  */
502*38fd1498Szrj static vec<int> point_freq_vec;
503*38fd1498Szrj 
504*38fd1498Szrj /* The start of the above vector elements.  */
505*38fd1498Szrj int *lra_point_freq;
506*38fd1498Szrj 
507*38fd1498Szrj /* Increment the current program point POINT to the next point which has
508*38fd1498Szrj    execution frequency FREQ.  */
509*38fd1498Szrj static void
next_program_point(int & point,int freq)510*38fd1498Szrj next_program_point (int &point, int freq)
511*38fd1498Szrj {
512*38fd1498Szrj   point_freq_vec.safe_push (freq);
513*38fd1498Szrj   lra_point_freq = point_freq_vec.address ();
514*38fd1498Szrj   point++;
515*38fd1498Szrj }
516*38fd1498Szrj 
517*38fd1498Szrj /* Update the preference of HARD_REGNO for pseudo REGNO by PROFIT.  */
518*38fd1498Szrj void
lra_setup_reload_pseudo_preferenced_hard_reg(int regno,int hard_regno,int profit)519*38fd1498Szrj lra_setup_reload_pseudo_preferenced_hard_reg (int regno,
520*38fd1498Szrj 					      int hard_regno, int profit)
521*38fd1498Szrj {
522*38fd1498Szrj   lra_assert (regno >= lra_constraint_new_regno_start);
523*38fd1498Szrj   if (lra_reg_info[regno].preferred_hard_regno1 == hard_regno)
524*38fd1498Szrj     lra_reg_info[regno].preferred_hard_regno_profit1 += profit;
525*38fd1498Szrj   else if (lra_reg_info[regno].preferred_hard_regno2 == hard_regno)
526*38fd1498Szrj     lra_reg_info[regno].preferred_hard_regno_profit2 += profit;
527*38fd1498Szrj   else if (lra_reg_info[regno].preferred_hard_regno1 < 0)
528*38fd1498Szrj     {
529*38fd1498Szrj       lra_reg_info[regno].preferred_hard_regno1 = hard_regno;
530*38fd1498Szrj       lra_reg_info[regno].preferred_hard_regno_profit1 = profit;
531*38fd1498Szrj     }
532*38fd1498Szrj   else if (lra_reg_info[regno].preferred_hard_regno2 < 0
533*38fd1498Szrj 	   || profit > lra_reg_info[regno].preferred_hard_regno_profit2)
534*38fd1498Szrj     {
535*38fd1498Szrj       lra_reg_info[regno].preferred_hard_regno2 = hard_regno;
536*38fd1498Szrj       lra_reg_info[regno].preferred_hard_regno_profit2 = profit;
537*38fd1498Szrj     }
538*38fd1498Szrj   else
539*38fd1498Szrj     return;
540*38fd1498Szrj   /* Keep the 1st hard regno as more profitable.  */
541*38fd1498Szrj   if (lra_reg_info[regno].preferred_hard_regno1 >= 0
542*38fd1498Szrj       && lra_reg_info[regno].preferred_hard_regno2 >= 0
543*38fd1498Szrj       && (lra_reg_info[regno].preferred_hard_regno_profit2
544*38fd1498Szrj 	  > lra_reg_info[regno].preferred_hard_regno_profit1))
545*38fd1498Szrj     {
546*38fd1498Szrj       std::swap (lra_reg_info[regno].preferred_hard_regno1,
547*38fd1498Szrj 		 lra_reg_info[regno].preferred_hard_regno2);
548*38fd1498Szrj       std::swap (lra_reg_info[regno].preferred_hard_regno_profit1,
549*38fd1498Szrj 		 lra_reg_info[regno].preferred_hard_regno_profit2);
550*38fd1498Szrj     }
551*38fd1498Szrj   if (lra_dump_file != NULL)
552*38fd1498Szrj     {
553*38fd1498Szrj       if ((hard_regno = lra_reg_info[regno].preferred_hard_regno1) >= 0)
554*38fd1498Szrj 	fprintf (lra_dump_file,
555*38fd1498Szrj 		 "	Hard reg %d is preferable by r%d with profit %d\n",
556*38fd1498Szrj 		 hard_regno, regno,
557*38fd1498Szrj 		 lra_reg_info[regno].preferred_hard_regno_profit1);
558*38fd1498Szrj       if ((hard_regno = lra_reg_info[regno].preferred_hard_regno2) >= 0)
559*38fd1498Szrj 	fprintf (lra_dump_file,
560*38fd1498Szrj 		 "	Hard reg %d is preferable by r%d with profit %d\n",
561*38fd1498Szrj 		 hard_regno, regno,
562*38fd1498Szrj 		 lra_reg_info[regno].preferred_hard_regno_profit2);
563*38fd1498Szrj     }
564*38fd1498Szrj }
565*38fd1498Szrj 
566*38fd1498Szrj /* Check that REGNO living through calls and setjumps, set up conflict
567*38fd1498Szrj    regs using LAST_CALL_USED_REG_SET, and clear corresponding bits in
568*38fd1498Szrj    PSEUDOS_LIVE_THROUGH_CALLS and PSEUDOS_LIVE_THROUGH_SETJUMPS.  */
569*38fd1498Szrj static inline void
check_pseudos_live_through_calls(int regno,HARD_REG_SET last_call_used_reg_set)570*38fd1498Szrj check_pseudos_live_through_calls (int regno,
571*38fd1498Szrj 				  HARD_REG_SET last_call_used_reg_set)
572*38fd1498Szrj {
573*38fd1498Szrj   int hr;
574*38fd1498Szrj 
575*38fd1498Szrj   if (! sparseset_bit_p (pseudos_live_through_calls, regno))
576*38fd1498Szrj     return;
577*38fd1498Szrj   sparseset_clear_bit (pseudos_live_through_calls, regno);
578*38fd1498Szrj   IOR_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs,
579*38fd1498Szrj 		    last_call_used_reg_set);
580*38fd1498Szrj 
581*38fd1498Szrj   for (hr = 0; hr < FIRST_PSEUDO_REGISTER; hr++)
582*38fd1498Szrj     if (targetm.hard_regno_call_part_clobbered (hr,
583*38fd1498Szrj 						PSEUDO_REGNO_MODE (regno)))
584*38fd1498Szrj       SET_HARD_REG_BIT (lra_reg_info[regno].conflict_hard_regs, hr);
585*38fd1498Szrj   lra_reg_info[regno].call_p = true;
586*38fd1498Szrj   if (! sparseset_bit_p (pseudos_live_through_setjumps, regno))
587*38fd1498Szrj     return;
588*38fd1498Szrj   sparseset_clear_bit (pseudos_live_through_setjumps, regno);
589*38fd1498Szrj   /* Don't allocate pseudos that cross setjmps or any call, if this
590*38fd1498Szrj      function receives a nonlocal goto.	 */
591*38fd1498Szrj   SET_HARD_REG_SET (lra_reg_info[regno].conflict_hard_regs);
592*38fd1498Szrj }
593*38fd1498Szrj 
594*38fd1498Szrj /* Return true if insn REG is an early clobber operand in alternative
595*38fd1498Szrj    NALT.  Negative NALT means that we don't know the current insn
596*38fd1498Szrj    alternative.  So assume the worst.  */
597*38fd1498Szrj static inline bool
reg_early_clobber_p(const struct lra_insn_reg * reg,int n_alt)598*38fd1498Szrj reg_early_clobber_p (const struct lra_insn_reg *reg, int n_alt)
599*38fd1498Szrj {
600*38fd1498Szrj   return (reg->early_clobber
601*38fd1498Szrj 	  && (n_alt == LRA_UNKNOWN_ALT
602*38fd1498Szrj 	      || (n_alt != LRA_NON_CLOBBERED_ALT
603*38fd1498Szrj 		  && TEST_BIT (reg->early_clobber_alts, n_alt))));
604*38fd1498Szrj }
605*38fd1498Szrj 
606*38fd1498Szrj /* Process insns of the basic block BB to update pseudo live ranges,
607*38fd1498Szrj    pseudo hard register conflicts, and insn notes.  We do it on
608*38fd1498Szrj    backward scan of BB insns.  CURR_POINT is the program point where
609*38fd1498Szrj    BB ends.  The function updates this counter and returns in
610*38fd1498Szrj    CURR_POINT the program point where BB starts.  The function also
611*38fd1498Szrj    does local live info updates and can delete the dead insns if
612*38fd1498Szrj    DEAD_INSN_P.  It returns true if pseudo live info was
613*38fd1498Szrj    changed at the BB start.  */
614*38fd1498Szrj static bool
process_bb_lives(basic_block bb,int & curr_point,bool dead_insn_p)615*38fd1498Szrj process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p)
616*38fd1498Szrj {
617*38fd1498Szrj   int i, regno, freq;
618*38fd1498Szrj   unsigned int j;
619*38fd1498Szrj   bitmap_iterator bi;
620*38fd1498Szrj   bitmap reg_live_out;
621*38fd1498Szrj   unsigned int px;
622*38fd1498Szrj   rtx_insn *next;
623*38fd1498Szrj   rtx link, *link_loc;
624*38fd1498Szrj   bool need_curr_point_incr;
625*38fd1498Szrj   HARD_REG_SET last_call_used_reg_set;
626*38fd1498Szrj 
627*38fd1498Szrj   reg_live_out = df_get_live_out (bb);
628*38fd1498Szrj   sparseset_clear (pseudos_live);
629*38fd1498Szrj   sparseset_clear (pseudos_live_through_calls);
630*38fd1498Szrj   sparseset_clear (pseudos_live_through_setjumps);
631*38fd1498Szrj   CLEAR_HARD_REG_SET (last_call_used_reg_set);
632*38fd1498Szrj   REG_SET_TO_HARD_REG_SET (hard_regs_live, reg_live_out);
633*38fd1498Szrj   AND_COMPL_HARD_REG_SET (hard_regs_live, eliminable_regset);
634*38fd1498Szrj   EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi)
635*38fd1498Szrj     mark_pseudo_live (j, curr_point);
636*38fd1498Szrj 
637*38fd1498Szrj   bb_gen_pseudos = &get_bb_data (bb)->gen_pseudos;
638*38fd1498Szrj   bb_killed_pseudos = &get_bb_data (bb)->killed_pseudos;
639*38fd1498Szrj   bitmap_clear (bb_gen_pseudos);
640*38fd1498Szrj   bitmap_clear (bb_killed_pseudos);
641*38fd1498Szrj   freq = REG_FREQ_FROM_BB (bb);
642*38fd1498Szrj 
643*38fd1498Szrj   if (lra_dump_file != NULL)
644*38fd1498Szrj     fprintf (lra_dump_file, "  BB %d\n", bb->index);
645*38fd1498Szrj 
646*38fd1498Szrj   /* Scan the code of this basic block, noting which pseudos and hard
647*38fd1498Szrj      regs are born or die.
648*38fd1498Szrj 
649*38fd1498Szrj      Note that this loop treats uninitialized values as live until the
650*38fd1498Szrj      beginning of the block.  For example, if an instruction uses
651*38fd1498Szrj      (reg:DI foo), and only (subreg:SI (reg:DI foo) 0) is ever set,
652*38fd1498Szrj      FOO will remain live until the beginning of the block.  Likewise
653*38fd1498Szrj      if FOO is not set at all.	This is unnecessarily pessimistic, but
654*38fd1498Szrj      it probably doesn't matter much in practice.  */
655*38fd1498Szrj   FOR_BB_INSNS_REVERSE_SAFE (bb, curr_insn, next)
656*38fd1498Szrj     {
657*38fd1498Szrj       bool call_p;
658*38fd1498Szrj       int n_alt, dst_regno, src_regno;
659*38fd1498Szrj       rtx set;
660*38fd1498Szrj       struct lra_insn_reg *reg;
661*38fd1498Szrj 
662*38fd1498Szrj       if (!NONDEBUG_INSN_P (curr_insn))
663*38fd1498Szrj 	continue;
664*38fd1498Szrj 
665*38fd1498Szrj       curr_id = lra_get_insn_recog_data (curr_insn);
666*38fd1498Szrj       curr_static_id = curr_id->insn_static_data;
667*38fd1498Szrj       n_alt = curr_id->used_insn_alternative;
668*38fd1498Szrj       if (lra_dump_file != NULL)
669*38fd1498Szrj 	fprintf (lra_dump_file, "   Insn %u: point = %d, n_alt = %d\n",
670*38fd1498Szrj 		 INSN_UID (curr_insn), curr_point, n_alt);
671*38fd1498Szrj 
672*38fd1498Szrj       set = single_set (curr_insn);
673*38fd1498Szrj 
674*38fd1498Szrj       if (dead_insn_p && set != NULL_RTX
675*38fd1498Szrj 	  && REG_P (SET_DEST (set)) && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
676*38fd1498Szrj 	  && find_reg_note (curr_insn, REG_EH_REGION, NULL_RTX) == NULL_RTX
677*38fd1498Szrj 	  && ! may_trap_p (PATTERN (curr_insn))
678*38fd1498Szrj 	  /* Don't do premature remove of pic offset pseudo as we can
679*38fd1498Szrj 	     start to use it after some reload generation.  */
680*38fd1498Szrj 	  && (pic_offset_table_rtx == NULL_RTX
681*38fd1498Szrj 	      || pic_offset_table_rtx != SET_DEST (set)))
682*38fd1498Szrj 	{
683*38fd1498Szrj 	  bool remove_p = true;
684*38fd1498Szrj 
685*38fd1498Szrj 	  for (reg = curr_id->regs; reg != NULL; reg = reg->next)
686*38fd1498Szrj 	    if (reg->type != OP_IN && sparseset_bit_p (pseudos_live, reg->regno))
687*38fd1498Szrj 	      {
688*38fd1498Szrj 		remove_p = false;
689*38fd1498Szrj 		break;
690*38fd1498Szrj 	      }
691*38fd1498Szrj 	  for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
692*38fd1498Szrj 	    if (reg->type != OP_IN)
693*38fd1498Szrj 	      {
694*38fd1498Szrj 		remove_p = false;
695*38fd1498Szrj 		break;
696*38fd1498Szrj 	      }
697*38fd1498Szrj 	  if (remove_p && ! volatile_refs_p (PATTERN (curr_insn)))
698*38fd1498Szrj 	    {
699*38fd1498Szrj 	      dst_regno = REGNO (SET_DEST (set));
700*38fd1498Szrj 	      if (lra_dump_file != NULL)
701*38fd1498Szrj 		fprintf (lra_dump_file, "   Deleting dead insn %u\n",
702*38fd1498Szrj 			 INSN_UID (curr_insn));
703*38fd1498Szrj 	      lra_set_insn_deleted (curr_insn);
704*38fd1498Szrj 	      if (lra_reg_info[dst_regno].nrefs == 0)
705*38fd1498Szrj 		{
706*38fd1498Szrj 		  /* There might be some debug insns with the pseudo.  */
707*38fd1498Szrj 		  unsigned int uid;
708*38fd1498Szrj 		  rtx_insn *insn;
709*38fd1498Szrj 
710*38fd1498Szrj 		  bitmap_copy (&temp_bitmap, &lra_reg_info[dst_regno].insn_bitmap);
711*38fd1498Szrj 		  EXECUTE_IF_SET_IN_BITMAP (&temp_bitmap, 0, uid, bi)
712*38fd1498Szrj 		    {
713*38fd1498Szrj 		      insn = lra_insn_recog_data[uid]->insn;
714*38fd1498Szrj 		      lra_substitute_pseudo_within_insn (insn, dst_regno,
715*38fd1498Szrj 							 SET_SRC (set), true);
716*38fd1498Szrj 		      lra_update_insn_regno_info (insn);
717*38fd1498Szrj 		    }
718*38fd1498Szrj 		}
719*38fd1498Szrj 	      continue;
720*38fd1498Szrj 	    }
721*38fd1498Szrj 	}
722*38fd1498Szrj 
723*38fd1498Szrj       /* Update max ref width and hard reg usage.  */
724*38fd1498Szrj       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
725*38fd1498Szrj 	{
726*38fd1498Szrj 	  int i, regno = reg->regno;
727*38fd1498Szrj 
728*38fd1498Szrj 	  if (partial_subreg_p (lra_reg_info[regno].biggest_mode,
729*38fd1498Szrj 				reg->biggest_mode))
730*38fd1498Szrj 	    lra_reg_info[regno].biggest_mode = reg->biggest_mode;
731*38fd1498Szrj 	  if (regno < FIRST_PSEUDO_REGISTER)
732*38fd1498Szrj 	    {
733*38fd1498Szrj 	      lra_hard_reg_usage[regno] += freq;
734*38fd1498Szrj 	      /* A hard register explicitly can be used in small mode,
735*38fd1498Szrj 		 but implicitly it can be used in natural mode as a
736*38fd1498Szrj 		 part of multi-register group.  Process this case
737*38fd1498Szrj 		 here.  */
738*38fd1498Szrj 	      for (i = 1; i < hard_regno_nregs (regno, reg->biggest_mode); i++)
739*38fd1498Szrj 		if (partial_subreg_p (lra_reg_info[regno + i].biggest_mode,
740*38fd1498Szrj 				      GET_MODE (regno_reg_rtx[regno + i])))
741*38fd1498Szrj 		  lra_reg_info[regno + i].biggest_mode
742*38fd1498Szrj 		    = GET_MODE (regno_reg_rtx[regno + i]);
743*38fd1498Szrj 	    }
744*38fd1498Szrj 	}
745*38fd1498Szrj 
746*38fd1498Szrj       call_p = CALL_P (curr_insn);
747*38fd1498Szrj       src_regno = (set != NULL_RTX && REG_P (SET_SRC (set))
748*38fd1498Szrj 		   ? REGNO (SET_SRC (set)) : -1);
749*38fd1498Szrj       dst_regno = (set != NULL_RTX && REG_P (SET_DEST (set))
750*38fd1498Szrj 		   ? REGNO (SET_DEST (set)) : -1);
751*38fd1498Szrj       if (complete_info_p
752*38fd1498Szrj 	  && src_regno >= 0 && dst_regno >= 0
753*38fd1498Szrj 	  /* Check that source regno does not conflict with
754*38fd1498Szrj 	     destination regno to exclude most impossible
755*38fd1498Szrj 	     preferences.  */
756*38fd1498Szrj 	  && (((src_regno >= FIRST_PSEUDO_REGISTER
757*38fd1498Szrj 		&& (! sparseset_bit_p (pseudos_live, src_regno)
758*38fd1498Szrj 		    || (dst_regno >= FIRST_PSEUDO_REGISTER
759*38fd1498Szrj 			&& lra_reg_val_equal_p (src_regno,
760*38fd1498Szrj 						lra_reg_info[dst_regno].val,
761*38fd1498Szrj 						lra_reg_info[dst_regno].offset))))
762*38fd1498Szrj 	       || (src_regno < FIRST_PSEUDO_REGISTER
763*38fd1498Szrj 		   && ! TEST_HARD_REG_BIT (hard_regs_live, src_regno)))
764*38fd1498Szrj 	      /* It might be 'inheritance pseudo <- reload pseudo'.  */
765*38fd1498Szrj 	      || (src_regno >= lra_constraint_new_regno_start
766*38fd1498Szrj 		  && dst_regno >= lra_constraint_new_regno_start
767*38fd1498Szrj 		  /* Remember to skip special cases where src/dest regnos are
768*38fd1498Szrj 		     the same, e.g. insn SET pattern has matching constraints
769*38fd1498Szrj 		     like =r,0.  */
770*38fd1498Szrj 		  && src_regno != dst_regno)))
771*38fd1498Szrj 	{
772*38fd1498Szrj 	  int hard_regno = -1, regno = -1;
773*38fd1498Szrj 
774*38fd1498Szrj 	  if (dst_regno >= lra_constraint_new_regno_start
775*38fd1498Szrj 	      && src_regno >= lra_constraint_new_regno_start)
776*38fd1498Szrj 	    {
777*38fd1498Szrj 	      /* It might be still an original (non-reload) insn with
778*38fd1498Szrj 		 one unused output and a constraint requiring to use
779*38fd1498Szrj 		 the same reg for input/output operands. In this case
780*38fd1498Szrj 		 dst_regno and src_regno have the same value, we don't
781*38fd1498Szrj 		 need a misleading copy for this case.  */
782*38fd1498Szrj 	      if (dst_regno != src_regno)
783*38fd1498Szrj 		lra_create_copy (dst_regno, src_regno, freq);
784*38fd1498Szrj 	    }
785*38fd1498Szrj 	  else if (dst_regno >= lra_constraint_new_regno_start)
786*38fd1498Szrj 	    {
787*38fd1498Szrj 	      if ((hard_regno = src_regno) >= FIRST_PSEUDO_REGISTER)
788*38fd1498Szrj 		hard_regno = reg_renumber[src_regno];
789*38fd1498Szrj 	      regno = dst_regno;
790*38fd1498Szrj 	    }
791*38fd1498Szrj 	  else if (src_regno >= lra_constraint_new_regno_start)
792*38fd1498Szrj 	    {
793*38fd1498Szrj 	      if ((hard_regno = dst_regno) >= FIRST_PSEUDO_REGISTER)
794*38fd1498Szrj 		hard_regno = reg_renumber[dst_regno];
795*38fd1498Szrj 	      regno = src_regno;
796*38fd1498Szrj 	    }
797*38fd1498Szrj 	  if (regno >= 0 && hard_regno >= 0)
798*38fd1498Szrj 	    lra_setup_reload_pseudo_preferenced_hard_reg
799*38fd1498Szrj 	      (regno, hard_regno, freq);
800*38fd1498Szrj 	}
801*38fd1498Szrj 
802*38fd1498Szrj       sparseset_clear (start_living);
803*38fd1498Szrj 
804*38fd1498Szrj       /* Try to avoid unnecessary program point increments, this saves
805*38fd1498Szrj 	 a lot of time in remove_some_program_points_and_update_live_ranges.
806*38fd1498Szrj 	 We only need an increment if something becomes live or dies at this
807*38fd1498Szrj 	 program point.  */
808*38fd1498Szrj       need_curr_point_incr = false;
809*38fd1498Szrj 
810*38fd1498Szrj       /* Mark each defined value as live.  We need to do this for
811*38fd1498Szrj 	 unused values because they still conflict with quantities
812*38fd1498Szrj 	 that are live at the time of the definition.  */
813*38fd1498Szrj       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
814*38fd1498Szrj 	if (reg->type != OP_IN)
815*38fd1498Szrj 	  {
816*38fd1498Szrj 	    need_curr_point_incr
817*38fd1498Szrj 	      |= mark_regno_live (reg->regno, reg->biggest_mode,
818*38fd1498Szrj 				  curr_point);
819*38fd1498Szrj 	    check_pseudos_live_through_calls (reg->regno,
820*38fd1498Szrj 					      last_call_used_reg_set);
821*38fd1498Szrj 	  }
822*38fd1498Szrj 
823*38fd1498Szrj       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
824*38fd1498Szrj 	if (reg->type != OP_IN)
825*38fd1498Szrj 	  make_hard_regno_born (reg->regno, false);
826*38fd1498Szrj 
827*38fd1498Szrj       if (curr_id->arg_hard_regs != NULL)
828*38fd1498Szrj 	for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
829*38fd1498Szrj 	  if (regno >= FIRST_PSEUDO_REGISTER)
830*38fd1498Szrj 	    /* It is a clobber.  */
831*38fd1498Szrj 	    make_hard_regno_born (regno - FIRST_PSEUDO_REGISTER, false);
832*38fd1498Szrj 
833*38fd1498Szrj       sparseset_copy (unused_set, start_living);
834*38fd1498Szrj 
835*38fd1498Szrj       sparseset_clear (start_dying);
836*38fd1498Szrj 
837*38fd1498Szrj       /* See which defined values die here.  */
838*38fd1498Szrj       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
839*38fd1498Szrj 	if (reg->type == OP_OUT
840*38fd1498Szrj 	    && ! reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
841*38fd1498Szrj 	  need_curr_point_incr
842*38fd1498Szrj 	    |= mark_regno_dead (reg->regno, reg->biggest_mode,
843*38fd1498Szrj 				curr_point);
844*38fd1498Szrj 
845*38fd1498Szrj       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
846*38fd1498Szrj 	if (reg->type == OP_OUT
847*38fd1498Szrj 	    && ! reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
848*38fd1498Szrj 	  make_hard_regno_dead (reg->regno);
849*38fd1498Szrj 
850*38fd1498Szrj       if (curr_id->arg_hard_regs != NULL)
851*38fd1498Szrj 	for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
852*38fd1498Szrj 	  if (regno >= FIRST_PSEUDO_REGISTER)
853*38fd1498Szrj 	    /* It is a clobber.  */
854*38fd1498Szrj 	    make_hard_regno_dead (regno - FIRST_PSEUDO_REGISTER);
855*38fd1498Szrj 
856*38fd1498Szrj       if (call_p)
857*38fd1498Szrj 	{
858*38fd1498Szrj 	  if (! flag_ipa_ra)
859*38fd1498Szrj 	    COPY_HARD_REG_SET(last_call_used_reg_set, call_used_reg_set);
860*38fd1498Szrj 	  else
861*38fd1498Szrj 	    {
862*38fd1498Szrj 	      HARD_REG_SET this_call_used_reg_set;
863*38fd1498Szrj 	      get_call_reg_set_usage (curr_insn, &this_call_used_reg_set,
864*38fd1498Szrj 				      call_used_reg_set);
865*38fd1498Szrj 
866*38fd1498Szrj 	      bool flush = (! hard_reg_set_empty_p (last_call_used_reg_set)
867*38fd1498Szrj 			    && ! hard_reg_set_equal_p (last_call_used_reg_set,
868*38fd1498Szrj 						       this_call_used_reg_set));
869*38fd1498Szrj 
870*38fd1498Szrj 	      EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
871*38fd1498Szrj 		{
872*38fd1498Szrj 		  IOR_HARD_REG_SET (lra_reg_info[j].actual_call_used_reg_set,
873*38fd1498Szrj 				    this_call_used_reg_set);
874*38fd1498Szrj 		  if (flush)
875*38fd1498Szrj 		    check_pseudos_live_through_calls
876*38fd1498Szrj 		      (j, last_call_used_reg_set);
877*38fd1498Szrj 		}
878*38fd1498Szrj 	      COPY_HARD_REG_SET(last_call_used_reg_set, this_call_used_reg_set);
879*38fd1498Szrj 	    }
880*38fd1498Szrj 
881*38fd1498Szrj 	  sparseset_ior (pseudos_live_through_calls,
882*38fd1498Szrj 			 pseudos_live_through_calls, pseudos_live);
883*38fd1498Szrj 	  if (cfun->has_nonlocal_label
884*38fd1498Szrj 	      || find_reg_note (curr_insn, REG_SETJMP,
885*38fd1498Szrj 				NULL_RTX) != NULL_RTX)
886*38fd1498Szrj 	    sparseset_ior (pseudos_live_through_setjumps,
887*38fd1498Szrj 			   pseudos_live_through_setjumps, pseudos_live);
888*38fd1498Szrj 	}
889*38fd1498Szrj 
890*38fd1498Szrj       /* Increment the current program point if we must.  */
891*38fd1498Szrj       if (need_curr_point_incr)
892*38fd1498Szrj 	next_program_point (curr_point, freq);
893*38fd1498Szrj 
894*38fd1498Szrj       sparseset_clear (start_living);
895*38fd1498Szrj 
896*38fd1498Szrj       need_curr_point_incr = false;
897*38fd1498Szrj 
898*38fd1498Szrj       /* Mark each used value as live.	*/
899*38fd1498Szrj       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
900*38fd1498Szrj 	if (reg->type == OP_IN)
901*38fd1498Szrj 	  {
902*38fd1498Szrj 	    need_curr_point_incr
903*38fd1498Szrj 	      |= mark_regno_live (reg->regno, reg->biggest_mode,
904*38fd1498Szrj 				  curr_point);
905*38fd1498Szrj 	    check_pseudos_live_through_calls (reg->regno,
906*38fd1498Szrj 					      last_call_used_reg_set);
907*38fd1498Szrj 	  }
908*38fd1498Szrj 
909*38fd1498Szrj       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
910*38fd1498Szrj 	if (reg->type == OP_IN)
911*38fd1498Szrj 	  make_hard_regno_born (reg->regno, false);
912*38fd1498Szrj 
913*38fd1498Szrj       if (curr_id->arg_hard_regs != NULL)
914*38fd1498Szrj 	/* Make argument hard registers live.  Don't create conflict
915*38fd1498Szrj 	   of used REAL_PIC_OFFSET_TABLE_REGNUM and the pic pseudo.  */
916*38fd1498Szrj 	for (i = 0; (regno = curr_id->arg_hard_regs[i]) >= 0; i++)
917*38fd1498Szrj 	  if (regno < FIRST_PSEUDO_REGISTER)
918*38fd1498Szrj 	    make_hard_regno_born (regno, true);
919*38fd1498Szrj 
920*38fd1498Szrj       sparseset_and_compl (dead_set, start_living, start_dying);
921*38fd1498Szrj 
922*38fd1498Szrj       /* Mark early clobber outputs dead.  */
923*38fd1498Szrj       for (reg = curr_id->regs; reg != NULL; reg = reg->next)
924*38fd1498Szrj 	if (reg->type == OP_OUT
925*38fd1498Szrj 	    && reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
926*38fd1498Szrj 	  need_curr_point_incr
927*38fd1498Szrj 	    |= mark_regno_dead (reg->regno, reg->biggest_mode,
928*38fd1498Szrj 				curr_point);
929*38fd1498Szrj 
930*38fd1498Szrj       for (reg = curr_static_id->hard_regs; reg != NULL; reg = reg->next)
931*38fd1498Szrj 	if (reg->type == OP_OUT
932*38fd1498Szrj 	    && reg_early_clobber_p (reg, n_alt) && ! reg->subreg_p)
933*38fd1498Szrj 	  {
934*38fd1498Szrj 	    struct lra_insn_reg *reg2;
935*38fd1498Szrj 
936*38fd1498Szrj 	    /* We can have early clobbered non-operand hard reg and
937*38fd1498Szrj 	       the same hard reg as an insn input.  Don't make hard
938*38fd1498Szrj 	       reg dead before the insns.  */
939*38fd1498Szrj 	    for (reg2 = curr_id->regs; reg2 != NULL; reg2 = reg2->next)
940*38fd1498Szrj 	      if (reg2->type != OP_OUT && reg2->regno == reg->regno)
941*38fd1498Szrj 		break;
942*38fd1498Szrj 	    if (reg2 == NULL)
943*38fd1498Szrj 	      make_hard_regno_dead (reg->regno);
944*38fd1498Szrj 	  }
945*38fd1498Szrj 
946*38fd1498Szrj       if (need_curr_point_incr)
947*38fd1498Szrj 	next_program_point (curr_point, freq);
948*38fd1498Szrj 
949*38fd1498Szrj       /* Update notes.	*/
950*38fd1498Szrj       for (link_loc = &REG_NOTES (curr_insn); (link = *link_loc) != NULL_RTX;)
951*38fd1498Szrj 	{
952*38fd1498Szrj 	  if (REG_NOTE_KIND (link) != REG_DEAD
953*38fd1498Szrj 	      && REG_NOTE_KIND (link) != REG_UNUSED)
954*38fd1498Szrj 	    ;
955*38fd1498Szrj 	  else if (REG_P (XEXP (link, 0)))
956*38fd1498Szrj 	    {
957*38fd1498Szrj 	      regno = REGNO (XEXP (link, 0));
958*38fd1498Szrj 	      if ((REG_NOTE_KIND (link) == REG_DEAD
959*38fd1498Szrj 		   && ! sparseset_bit_p (dead_set, regno))
960*38fd1498Szrj 		  || (REG_NOTE_KIND (link) == REG_UNUSED
961*38fd1498Szrj 		      && ! sparseset_bit_p (unused_set, regno)))
962*38fd1498Szrj 		{
963*38fd1498Szrj 		  *link_loc = XEXP (link, 1);
964*38fd1498Szrj 		  continue;
965*38fd1498Szrj 		}
966*38fd1498Szrj 	      if (REG_NOTE_KIND (link) == REG_DEAD)
967*38fd1498Szrj 		sparseset_clear_bit (dead_set, regno);
968*38fd1498Szrj 	      else if (REG_NOTE_KIND (link) == REG_UNUSED)
969*38fd1498Szrj 		sparseset_clear_bit (unused_set, regno);
970*38fd1498Szrj 	    }
971*38fd1498Szrj 	  link_loc = &XEXP (link, 1);
972*38fd1498Szrj 	}
973*38fd1498Szrj       EXECUTE_IF_SET_IN_SPARSESET (dead_set, j)
974*38fd1498Szrj 	add_reg_note (curr_insn, REG_DEAD, regno_reg_rtx[j]);
975*38fd1498Szrj       EXECUTE_IF_SET_IN_SPARSESET (unused_set, j)
976*38fd1498Szrj 	add_reg_note (curr_insn, REG_UNUSED, regno_reg_rtx[j]);
977*38fd1498Szrj     }
978*38fd1498Szrj 
979*38fd1498Szrj   if (bb_has_eh_pred (bb))
980*38fd1498Szrj     for (j = 0; ; ++j)
981*38fd1498Szrj       {
982*38fd1498Szrj 	unsigned int regno = EH_RETURN_DATA_REGNO (j);
983*38fd1498Szrj 
984*38fd1498Szrj 	if (regno == INVALID_REGNUM)
985*38fd1498Szrj 	  break;
986*38fd1498Szrj 	make_hard_regno_born (regno, false);
987*38fd1498Szrj       }
988*38fd1498Szrj 
989*38fd1498Szrj   /* Pseudos can't go in stack regs at the start of a basic block that
990*38fd1498Szrj      is reached by an abnormal edge. Likewise for call clobbered regs,
991*38fd1498Szrj      because caller-save, fixup_abnormal_edges and possibly the table
992*38fd1498Szrj      driven EH machinery are not quite ready to handle such pseudos
993*38fd1498Szrj      live across such edges.  */
994*38fd1498Szrj   if (bb_has_abnormal_pred (bb))
995*38fd1498Szrj     {
996*38fd1498Szrj #ifdef STACK_REGS
997*38fd1498Szrj       EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, px)
998*38fd1498Szrj 	lra_reg_info[px].no_stack_p = true;
999*38fd1498Szrj       for (px = FIRST_STACK_REG; px <= LAST_STACK_REG; px++)
1000*38fd1498Szrj 	make_hard_regno_born (px, false);
1001*38fd1498Szrj #endif
1002*38fd1498Szrj       /* No need to record conflicts for call clobbered regs if we
1003*38fd1498Szrj 	 have nonlocal labels around, as we don't ever try to
1004*38fd1498Szrj 	 allocate such regs in this case.  */
1005*38fd1498Szrj       if (!cfun->has_nonlocal_label
1006*38fd1498Szrj 	  && has_abnormal_call_or_eh_pred_edge_p (bb))
1007*38fd1498Szrj 	for (px = 0; px < FIRST_PSEUDO_REGISTER; px++)
1008*38fd1498Szrj 	  if (call_used_regs[px]
1009*38fd1498Szrj #ifdef REAL_PIC_OFFSET_TABLE_REGNUM
1010*38fd1498Szrj 	      /* We should create a conflict of PIC pseudo with PIC
1011*38fd1498Szrj 		 hard reg as PIC hard reg can have a wrong value after
1012*38fd1498Szrj 		 jump described by the abnormal edge.  In this case we
1013*38fd1498Szrj 		 can not allocate PIC hard reg to PIC pseudo as PIC
1014*38fd1498Szrj 		 pseudo will also have a wrong value.  */
1015*38fd1498Szrj 	      || (px == REAL_PIC_OFFSET_TABLE_REGNUM
1016*38fd1498Szrj 		  && pic_offset_table_rtx != NULL_RTX
1017*38fd1498Szrj 		  && REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
1018*38fd1498Szrj #endif
1019*38fd1498Szrj 	      )
1020*38fd1498Szrj 	    make_hard_regno_born (px, false);
1021*38fd1498Szrj     }
1022*38fd1498Szrj 
1023*38fd1498Szrj   bool live_change_p = false;
1024*38fd1498Szrj   /* Check if bb border live info was changed.  */
1025*38fd1498Szrj   unsigned int live_pseudos_num = 0;
1026*38fd1498Szrj   EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb),
1027*38fd1498Szrj 			    FIRST_PSEUDO_REGISTER, j, bi)
1028*38fd1498Szrj     {
1029*38fd1498Szrj       live_pseudos_num++;
1030*38fd1498Szrj       if (! sparseset_bit_p (pseudos_live, j))
1031*38fd1498Szrj 	{
1032*38fd1498Szrj 	  live_change_p = true;
1033*38fd1498Szrj 	  if (lra_dump_file != NULL)
1034*38fd1498Szrj 	    fprintf (lra_dump_file,
1035*38fd1498Szrj 		     "  r%d is removed as live at bb%d start\n", j, bb->index);
1036*38fd1498Szrj 	  break;
1037*38fd1498Szrj 	}
1038*38fd1498Szrj     }
1039*38fd1498Szrj   if (! live_change_p
1040*38fd1498Szrj       && sparseset_cardinality (pseudos_live) != live_pseudos_num)
1041*38fd1498Szrj     {
1042*38fd1498Szrj       live_change_p = true;
1043*38fd1498Szrj       if (lra_dump_file != NULL)
1044*38fd1498Szrj 	EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j)
1045*38fd1498Szrj 	  if (! bitmap_bit_p (df_get_live_in (bb), j))
1046*38fd1498Szrj 	    fprintf (lra_dump_file,
1047*38fd1498Szrj 		     "  r%d is added to live at bb%d start\n", j, bb->index);
1048*38fd1498Szrj     }
1049*38fd1498Szrj   /* See if we'll need an increment at the end of this basic block.
1050*38fd1498Szrj      An increment is needed if the PSEUDOS_LIVE set is not empty,
1051*38fd1498Szrj      to make sure the finish points are set up correctly.  */
1052*38fd1498Szrj   need_curr_point_incr = (sparseset_cardinality (pseudos_live) > 0);
1053*38fd1498Szrj 
1054*38fd1498Szrj   EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, i)
1055*38fd1498Szrj     mark_pseudo_dead (i, curr_point);
1056*38fd1498Szrj 
1057*38fd1498Szrj   EXECUTE_IF_SET_IN_BITMAP (df_get_live_in (bb), FIRST_PSEUDO_REGISTER, j, bi)
1058*38fd1498Szrj     {
1059*38fd1498Szrj       if (sparseset_cardinality (pseudos_live_through_calls) == 0)
1060*38fd1498Szrj 	break;
1061*38fd1498Szrj       if (sparseset_bit_p (pseudos_live_through_calls, j))
1062*38fd1498Szrj 	check_pseudos_live_through_calls (j, last_call_used_reg_set);
1063*38fd1498Szrj     }
1064*38fd1498Szrj 
1065*38fd1498Szrj   for (i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1066*38fd1498Szrj     {
1067*38fd1498Szrj       if (!TEST_HARD_REG_BIT (hard_regs_live, i))
1068*38fd1498Szrj 	continue;
1069*38fd1498Szrj 
1070*38fd1498Szrj       if (!TEST_HARD_REG_BIT (hard_regs_spilled_into, i))
1071*38fd1498Szrj 	continue;
1072*38fd1498Szrj 
1073*38fd1498Szrj       if (bitmap_bit_p (df_get_live_in (bb), i))
1074*38fd1498Szrj 	continue;
1075*38fd1498Szrj 
1076*38fd1498Szrj       live_change_p = true;
1077*38fd1498Szrj       if (lra_dump_file)
1078*38fd1498Szrj 	fprintf (lra_dump_file,
1079*38fd1498Szrj 		 "  hard reg r%d is added to live at bb%d start\n", i,
1080*38fd1498Szrj 		 bb->index);
1081*38fd1498Szrj       bitmap_set_bit (df_get_live_in (bb), i);
1082*38fd1498Szrj     }
1083*38fd1498Szrj 
1084*38fd1498Szrj   if (need_curr_point_incr)
1085*38fd1498Szrj     next_program_point (curr_point, freq);
1086*38fd1498Szrj 
1087*38fd1498Szrj   return live_change_p;
1088*38fd1498Szrj }
1089*38fd1498Szrj 
1090*38fd1498Szrj /* Compress pseudo live ranges by removing program points where
1091*38fd1498Szrj    nothing happens.  Complexity of many algorithms in LRA is linear
1092*38fd1498Szrj    function of program points number.  To speed up the code we try to
1093*38fd1498Szrj    minimize the number of the program points here.  */
1094*38fd1498Szrj static void
remove_some_program_points_and_update_live_ranges(void)1095*38fd1498Szrj remove_some_program_points_and_update_live_ranges (void)
1096*38fd1498Szrj {
1097*38fd1498Szrj   unsigned i;
1098*38fd1498Szrj   int n, max_regno;
1099*38fd1498Szrj   int *map;
1100*38fd1498Szrj   lra_live_range_t r, prev_r, next_r;
1101*38fd1498Szrj   sbitmap_iterator sbi;
1102*38fd1498Szrj   bool born_p, dead_p, prev_born_p, prev_dead_p;
1103*38fd1498Szrj 
1104*38fd1498Szrj   auto_sbitmap born (lra_live_max_point);
1105*38fd1498Szrj   auto_sbitmap dead (lra_live_max_point);
1106*38fd1498Szrj   bitmap_clear (born);
1107*38fd1498Szrj   bitmap_clear (dead);
1108*38fd1498Szrj   max_regno = max_reg_num ();
1109*38fd1498Szrj   for (i = FIRST_PSEUDO_REGISTER; i < (unsigned) max_regno; i++)
1110*38fd1498Szrj     {
1111*38fd1498Szrj       for (r = lra_reg_info[i].live_ranges; r != NULL; r = r->next)
1112*38fd1498Szrj 	{
1113*38fd1498Szrj 	  lra_assert (r->start <= r->finish);
1114*38fd1498Szrj 	  bitmap_set_bit (born, r->start);
1115*38fd1498Szrj 	  bitmap_set_bit (dead, r->finish);
1116*38fd1498Szrj 	}
1117*38fd1498Szrj     }
1118*38fd1498Szrj   auto_sbitmap born_or_dead (lra_live_max_point);
1119*38fd1498Szrj   bitmap_ior (born_or_dead, born, dead);
1120*38fd1498Szrj   map = XCNEWVEC (int, lra_live_max_point);
1121*38fd1498Szrj   n = -1;
1122*38fd1498Szrj   prev_born_p = prev_dead_p = false;
1123*38fd1498Szrj   EXECUTE_IF_SET_IN_BITMAP (born_or_dead, 0, i, sbi)
1124*38fd1498Szrj     {
1125*38fd1498Szrj       born_p = bitmap_bit_p (born, i);
1126*38fd1498Szrj       dead_p = bitmap_bit_p (dead, i);
1127*38fd1498Szrj       if ((prev_born_p && ! prev_dead_p && born_p && ! dead_p)
1128*38fd1498Szrj 	  || (prev_dead_p && ! prev_born_p && dead_p && ! born_p))
1129*38fd1498Szrj 	{
1130*38fd1498Szrj 	  map[i] = n;
1131*38fd1498Szrj 	  lra_point_freq[n] = MAX (lra_point_freq[n], lra_point_freq[i]);
1132*38fd1498Szrj 	}
1133*38fd1498Szrj       else
1134*38fd1498Szrj 	{
1135*38fd1498Szrj 	  map[i] = ++n;
1136*38fd1498Szrj 	  lra_point_freq[n] = lra_point_freq[i];
1137*38fd1498Szrj 	}
1138*38fd1498Szrj       prev_born_p = born_p;
1139*38fd1498Szrj       prev_dead_p = dead_p;
1140*38fd1498Szrj     }
1141*38fd1498Szrj   n++;
1142*38fd1498Szrj   if (lra_dump_file != NULL)
1143*38fd1498Szrj     fprintf (lra_dump_file, "Compressing live ranges: from %d to %d - %d%%\n",
1144*38fd1498Szrj 	     lra_live_max_point, n, 100 * n / lra_live_max_point);
1145*38fd1498Szrj   if (n < lra_live_max_point)
1146*38fd1498Szrj     {
1147*38fd1498Szrj       lra_live_max_point = n;
1148*38fd1498Szrj       for (i = FIRST_PSEUDO_REGISTER; i < (unsigned) max_regno; i++)
1149*38fd1498Szrj 	{
1150*38fd1498Szrj 	  for (prev_r = NULL, r = lra_reg_info[i].live_ranges;
1151*38fd1498Szrj 	       r != NULL;
1152*38fd1498Szrj 	       r = next_r)
1153*38fd1498Szrj 	    {
1154*38fd1498Szrj 	      next_r = r->next;
1155*38fd1498Szrj 	      r->start = map[r->start];
1156*38fd1498Szrj 	      r->finish = map[r->finish];
1157*38fd1498Szrj 	      if (prev_r == NULL || prev_r->start > r->finish + 1)
1158*38fd1498Szrj 		{
1159*38fd1498Szrj 		  prev_r = r;
1160*38fd1498Szrj 		  continue;
1161*38fd1498Szrj 		}
1162*38fd1498Szrj 	      prev_r->start = r->start;
1163*38fd1498Szrj 	      prev_r->next = next_r;
1164*38fd1498Szrj 	      lra_live_range_pool.remove (r);
1165*38fd1498Szrj 	    }
1166*38fd1498Szrj 	}
1167*38fd1498Szrj     }
1168*38fd1498Szrj   free (map);
1169*38fd1498Szrj }
1170*38fd1498Szrj 
1171*38fd1498Szrj /* Print live ranges R to file F.  */
1172*38fd1498Szrj void
lra_print_live_range_list(FILE * f,lra_live_range_t r)1173*38fd1498Szrj lra_print_live_range_list (FILE *f, lra_live_range_t r)
1174*38fd1498Szrj {
1175*38fd1498Szrj   for (; r != NULL; r = r->next)
1176*38fd1498Szrj     fprintf (f, " [%d..%d]", r->start, r->finish);
1177*38fd1498Szrj   fprintf (f, "\n");
1178*38fd1498Szrj }
1179*38fd1498Szrj 
1180*38fd1498Szrj DEBUG_FUNCTION void
debug(lra_live_range & ref)1181*38fd1498Szrj debug (lra_live_range &ref)
1182*38fd1498Szrj {
1183*38fd1498Szrj   lra_print_live_range_list (stderr, &ref);
1184*38fd1498Szrj }
1185*38fd1498Szrj 
1186*38fd1498Szrj DEBUG_FUNCTION void
debug(lra_live_range * ptr)1187*38fd1498Szrj debug (lra_live_range *ptr)
1188*38fd1498Szrj {
1189*38fd1498Szrj   if (ptr)
1190*38fd1498Szrj     debug (*ptr);
1191*38fd1498Szrj   else
1192*38fd1498Szrj     fprintf (stderr, "<nil>\n");
1193*38fd1498Szrj }
1194*38fd1498Szrj 
1195*38fd1498Szrj /* Print live ranges R to stderr.  */
1196*38fd1498Szrj void
lra_debug_live_range_list(lra_live_range_t r)1197*38fd1498Szrj lra_debug_live_range_list (lra_live_range_t r)
1198*38fd1498Szrj {
1199*38fd1498Szrj   lra_print_live_range_list (stderr, r);
1200*38fd1498Szrj }
1201*38fd1498Szrj 
1202*38fd1498Szrj /* Print live ranges of pseudo REGNO to file F.	 */
1203*38fd1498Szrj static void
print_pseudo_live_ranges(FILE * f,int regno)1204*38fd1498Szrj print_pseudo_live_ranges (FILE *f, int regno)
1205*38fd1498Szrj {
1206*38fd1498Szrj   if (lra_reg_info[regno].live_ranges == NULL)
1207*38fd1498Szrj     return;
1208*38fd1498Szrj   fprintf (f, " r%d:", regno);
1209*38fd1498Szrj   lra_print_live_range_list (f, lra_reg_info[regno].live_ranges);
1210*38fd1498Szrj }
1211*38fd1498Szrj 
1212*38fd1498Szrj /* Print live ranges of pseudo REGNO to stderr.	 */
1213*38fd1498Szrj void
lra_debug_pseudo_live_ranges(int regno)1214*38fd1498Szrj lra_debug_pseudo_live_ranges (int regno)
1215*38fd1498Szrj {
1216*38fd1498Szrj   print_pseudo_live_ranges (stderr, regno);
1217*38fd1498Szrj }
1218*38fd1498Szrj 
1219*38fd1498Szrj /* Print live ranges of all pseudos to file F.	*/
1220*38fd1498Szrj static void
print_live_ranges(FILE * f)1221*38fd1498Szrj print_live_ranges (FILE *f)
1222*38fd1498Szrj {
1223*38fd1498Szrj   int i, max_regno;
1224*38fd1498Szrj 
1225*38fd1498Szrj   max_regno = max_reg_num ();
1226*38fd1498Szrj   for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
1227*38fd1498Szrj     print_pseudo_live_ranges (f, i);
1228*38fd1498Szrj }
1229*38fd1498Szrj 
1230*38fd1498Szrj /* Print live ranges of all pseudos to stderr.	*/
1231*38fd1498Szrj void
lra_debug_live_ranges(void)1232*38fd1498Szrj lra_debug_live_ranges (void)
1233*38fd1498Szrj {
1234*38fd1498Szrj   print_live_ranges (stderr);
1235*38fd1498Szrj }
1236*38fd1498Szrj 
1237*38fd1498Szrj /* Compress pseudo live ranges.	 */
1238*38fd1498Szrj static void
compress_live_ranges(void)1239*38fd1498Szrj compress_live_ranges (void)
1240*38fd1498Szrj {
1241*38fd1498Szrj   remove_some_program_points_and_update_live_ranges ();
1242*38fd1498Szrj   if (lra_dump_file != NULL)
1243*38fd1498Szrj     {
1244*38fd1498Szrj       fprintf (lra_dump_file, "Ranges after the compression:\n");
1245*38fd1498Szrj       print_live_ranges (lra_dump_file);
1246*38fd1498Szrj     }
1247*38fd1498Szrj }
1248*38fd1498Szrj 
1249*38fd1498Szrj 
1250*38fd1498Szrj 
1251*38fd1498Szrj /* The number of the current live range pass.  */
1252*38fd1498Szrj int lra_live_range_iter;
1253*38fd1498Szrj 
1254*38fd1498Szrj /* The function creates live ranges only for memory pseudos (or for
1255*38fd1498Szrj    all ones if ALL_P), set up CONFLICT_HARD_REGS for the pseudos.  It
1256*38fd1498Szrj    also does dead insn elimination if DEAD_INSN_P and global live
1257*38fd1498Szrj    analysis only for pseudos and only if the pseudo live info was
1258*38fd1498Szrj    changed on a BB border.  Return TRUE if the live info was
1259*38fd1498Szrj    changed.  */
1260*38fd1498Szrj static bool
lra_create_live_ranges_1(bool all_p,bool dead_insn_p)1261*38fd1498Szrj lra_create_live_ranges_1 (bool all_p, bool dead_insn_p)
1262*38fd1498Szrj {
1263*38fd1498Szrj   basic_block bb;
1264*38fd1498Szrj   int i, hard_regno, max_regno = max_reg_num ();
1265*38fd1498Szrj   int curr_point;
1266*38fd1498Szrj   bool bb_live_change_p, have_referenced_pseudos = false;
1267*38fd1498Szrj 
1268*38fd1498Szrj   timevar_push (TV_LRA_CREATE_LIVE_RANGES);
1269*38fd1498Szrj 
1270*38fd1498Szrj   complete_info_p = all_p;
1271*38fd1498Szrj   if (lra_dump_file != NULL)
1272*38fd1498Szrj     fprintf (lra_dump_file,
1273*38fd1498Szrj 	     "\n********** Pseudo live ranges #%d: **********\n\n",
1274*38fd1498Szrj 	     ++lra_live_range_iter);
1275*38fd1498Szrj   memset (lra_hard_reg_usage, 0, sizeof (lra_hard_reg_usage));
1276*38fd1498Szrj   for (i = 0; i < max_regno; i++)
1277*38fd1498Szrj     {
1278*38fd1498Szrj       lra_reg_info[i].live_ranges = NULL;
1279*38fd1498Szrj       CLEAR_HARD_REG_SET (lra_reg_info[i].conflict_hard_regs);
1280*38fd1498Szrj       lra_reg_info[i].preferred_hard_regno1 = -1;
1281*38fd1498Szrj       lra_reg_info[i].preferred_hard_regno2 = -1;
1282*38fd1498Szrj       lra_reg_info[i].preferred_hard_regno_profit1 = 0;
1283*38fd1498Szrj       lra_reg_info[i].preferred_hard_regno_profit2 = 0;
1284*38fd1498Szrj #ifdef STACK_REGS
1285*38fd1498Szrj       lra_reg_info[i].no_stack_p = false;
1286*38fd1498Szrj #endif
1287*38fd1498Szrj       /* The biggest mode is already set but its value might be to
1288*38fd1498Szrj 	 conservative because of recent transformation.  Here in this
1289*38fd1498Szrj 	 file we recalculate it again as it costs practically
1290*38fd1498Szrj 	 nothing.  */
1291*38fd1498Szrj       if (i >= FIRST_PSEUDO_REGISTER && regno_reg_rtx[i] != NULL_RTX)
1292*38fd1498Szrj 	lra_reg_info[i].biggest_mode = GET_MODE (regno_reg_rtx[i]);
1293*38fd1498Szrj       else
1294*38fd1498Szrj 	lra_reg_info[i].biggest_mode = VOIDmode;
1295*38fd1498Szrj       lra_reg_info[i].call_p = false;
1296*38fd1498Szrj       if (i >= FIRST_PSEUDO_REGISTER
1297*38fd1498Szrj 	  && lra_reg_info[i].nrefs != 0)
1298*38fd1498Szrj 	{
1299*38fd1498Szrj 	  if ((hard_regno = reg_renumber[i]) >= 0)
1300*38fd1498Szrj 	    lra_hard_reg_usage[hard_regno] += lra_reg_info[i].freq;
1301*38fd1498Szrj 	  have_referenced_pseudos = true;
1302*38fd1498Szrj 	}
1303*38fd1498Szrj     }
1304*38fd1498Szrj   lra_free_copies ();
1305*38fd1498Szrj 
1306*38fd1498Szrj   /* Under some circumstances, we can have functions without pseudo
1307*38fd1498Szrj      registers.  For such functions, lra_live_max_point will be 0,
1308*38fd1498Szrj      see e.g. PR55604, and there's nothing more to do for us here.  */
1309*38fd1498Szrj   if (! have_referenced_pseudos)
1310*38fd1498Szrj     {
1311*38fd1498Szrj       timevar_pop (TV_LRA_CREATE_LIVE_RANGES);
1312*38fd1498Szrj       return false;
1313*38fd1498Szrj     }
1314*38fd1498Szrj 
1315*38fd1498Szrj   pseudos_live = sparseset_alloc (max_regno);
1316*38fd1498Szrj   pseudos_live_through_calls = sparseset_alloc (max_regno);
1317*38fd1498Szrj   pseudos_live_through_setjumps = sparseset_alloc (max_regno);
1318*38fd1498Szrj   start_living = sparseset_alloc (max_regno);
1319*38fd1498Szrj   start_dying = sparseset_alloc (max_regno);
1320*38fd1498Szrj   dead_set = sparseset_alloc (max_regno);
1321*38fd1498Szrj   unused_set = sparseset_alloc (max_regno);
1322*38fd1498Szrj   curr_point = 0;
1323*38fd1498Szrj   unsigned new_length = get_max_uid () * 2;
1324*38fd1498Szrj   point_freq_vec.truncate (0);
1325*38fd1498Szrj   point_freq_vec.reserve_exact (new_length);
1326*38fd1498Szrj   lra_point_freq = point_freq_vec.address ();
1327*38fd1498Szrj   auto_vec<int, 20> post_order_rev_cfg;
1328*38fd1498Szrj   inverted_post_order_compute (&post_order_rev_cfg);
1329*38fd1498Szrj   lra_assert (post_order_rev_cfg.length () == (unsigned) n_basic_blocks_for_fn (cfun));
1330*38fd1498Szrj   bb_live_change_p = false;
1331*38fd1498Szrj   for (i = post_order_rev_cfg.length () - 1; i >= 0; --i)
1332*38fd1498Szrj     {
1333*38fd1498Szrj       bb = BASIC_BLOCK_FOR_FN (cfun, post_order_rev_cfg[i]);
1334*38fd1498Szrj       if (bb == EXIT_BLOCK_PTR_FOR_FN (cfun) || bb
1335*38fd1498Szrj 	  == ENTRY_BLOCK_PTR_FOR_FN (cfun))
1336*38fd1498Szrj 	continue;
1337*38fd1498Szrj       if (process_bb_lives (bb, curr_point, dead_insn_p))
1338*38fd1498Szrj 	bb_live_change_p = true;
1339*38fd1498Szrj     }
1340*38fd1498Szrj   if (bb_live_change_p)
1341*38fd1498Szrj     {
1342*38fd1498Szrj       /* We need to clear pseudo live info as some pseudos can
1343*38fd1498Szrj 	 disappear, e.g. pseudos with used equivalences.  */
1344*38fd1498Szrj       FOR_EACH_BB_FN (bb, cfun)
1345*38fd1498Szrj 	{
1346*38fd1498Szrj 	  bitmap_clear_range (df_get_live_in (bb), FIRST_PSEUDO_REGISTER,
1347*38fd1498Szrj 			      max_regno - FIRST_PSEUDO_REGISTER);
1348*38fd1498Szrj 	  bitmap_clear_range (df_get_live_out (bb), FIRST_PSEUDO_REGISTER,
1349*38fd1498Szrj 			      max_regno - FIRST_PSEUDO_REGISTER);
1350*38fd1498Szrj 	}
1351*38fd1498Szrj       /* As we did not change CFG since LRA start we can use
1352*38fd1498Szrj 	 DF-infrastructure solver to solve live data flow problem.  */
1353*38fd1498Szrj       for (int i = 0; i < FIRST_PSEUDO_REGISTER; ++i)
1354*38fd1498Szrj 	{
1355*38fd1498Szrj 	  if (TEST_HARD_REG_BIT (hard_regs_spilled_into, i))
1356*38fd1498Szrj 	    bitmap_clear_bit (&all_hard_regs_bitmap, i);
1357*38fd1498Szrj 	}
1358*38fd1498Szrj       df_simple_dataflow
1359*38fd1498Szrj 	(DF_BACKWARD, NULL, live_con_fun_0, live_con_fun_n,
1360*38fd1498Szrj 	 live_trans_fun, &all_blocks,
1361*38fd1498Szrj 	 df_get_postorder (DF_BACKWARD), df_get_n_blocks (DF_BACKWARD));
1362*38fd1498Szrj       if (lra_dump_file != NULL)
1363*38fd1498Szrj 	{
1364*38fd1498Szrj 	  fprintf (lra_dump_file,
1365*38fd1498Szrj 		   "Global pseudo live data have been updated:\n");
1366*38fd1498Szrj 	  basic_block bb;
1367*38fd1498Szrj 	  FOR_EACH_BB_FN (bb, cfun)
1368*38fd1498Szrj 	    {
1369*38fd1498Szrj 	      bb_data_t bb_info = get_bb_data (bb);
1370*38fd1498Szrj 	      bitmap bb_livein = df_get_live_in (bb);
1371*38fd1498Szrj 	      bitmap bb_liveout = df_get_live_out (bb);
1372*38fd1498Szrj 
1373*38fd1498Szrj 	      fprintf (lra_dump_file, "\nBB %d:\n", bb->index);
1374*38fd1498Szrj 	      lra_dump_bitmap_with_title ("  gen:",
1375*38fd1498Szrj 					  &bb_info->gen_pseudos, bb->index);
1376*38fd1498Szrj 	      lra_dump_bitmap_with_title ("  killed:",
1377*38fd1498Szrj 					  &bb_info->killed_pseudos, bb->index);
1378*38fd1498Szrj 	      lra_dump_bitmap_with_title ("  livein:", bb_livein, bb->index);
1379*38fd1498Szrj 	      lra_dump_bitmap_with_title ("  liveout:", bb_liveout, bb->index);
1380*38fd1498Szrj 	    }
1381*38fd1498Szrj 	}
1382*38fd1498Szrj     }
1383*38fd1498Szrj   lra_live_max_point = curr_point;
1384*38fd1498Szrj   if (lra_dump_file != NULL)
1385*38fd1498Szrj     print_live_ranges (lra_dump_file);
1386*38fd1498Szrj   /* Clean up.	*/
1387*38fd1498Szrj   sparseset_free (unused_set);
1388*38fd1498Szrj   sparseset_free (dead_set);
1389*38fd1498Szrj   sparseset_free (start_dying);
1390*38fd1498Szrj   sparseset_free (start_living);
1391*38fd1498Szrj   sparseset_free (pseudos_live_through_calls);
1392*38fd1498Szrj   sparseset_free (pseudos_live_through_setjumps);
1393*38fd1498Szrj   sparseset_free (pseudos_live);
1394*38fd1498Szrj   compress_live_ranges ();
1395*38fd1498Szrj   timevar_pop (TV_LRA_CREATE_LIVE_RANGES);
1396*38fd1498Szrj   return bb_live_change_p;
1397*38fd1498Szrj }
1398*38fd1498Szrj 
1399*38fd1498Szrj /* The main entry function creates live-ranges and other live info
1400*38fd1498Szrj    necessary for the assignment sub-pass.  It uses
1401*38fd1498Szrj    lra_creates_live_ranges_1 -- so read comments for the
1402*38fd1498Szrj    function.  */
1403*38fd1498Szrj void
lra_create_live_ranges(bool all_p,bool dead_insn_p)1404*38fd1498Szrj lra_create_live_ranges (bool all_p, bool dead_insn_p)
1405*38fd1498Szrj {
1406*38fd1498Szrj   if (! lra_create_live_ranges_1 (all_p, dead_insn_p))
1407*38fd1498Szrj     return;
1408*38fd1498Szrj   if (lra_dump_file != NULL)
1409*38fd1498Szrj     fprintf (lra_dump_file, "Live info was changed -- recalculate it\n");
1410*38fd1498Szrj   /* Live info was changed on a bb border.  It means that some info,
1411*38fd1498Szrj      e.g. about conflict regs, calls crossed, and live ranges may be
1412*38fd1498Szrj      wrong.  We need this info for allocation.  So recalculate it
1413*38fd1498Szrj      again but without removing dead insns which can change live info
1414*38fd1498Szrj      again.  Repetitive live range calculations are expensive therefore
1415*38fd1498Szrj      we stop here as we already have correct info although some
1416*38fd1498Szrj      improvement in rare cases could be possible on this sub-pass if
1417*38fd1498Szrj      we do dead insn elimination again (still the improvement may
1418*38fd1498Szrj      happen later).  */
1419*38fd1498Szrj   lra_clear_live_ranges ();
1420*38fd1498Szrj   bool res = lra_create_live_ranges_1 (all_p, false);
1421*38fd1498Szrj   lra_assert (! res);
1422*38fd1498Szrj }
1423*38fd1498Szrj 
1424*38fd1498Szrj /* Finish all live ranges.  */
1425*38fd1498Szrj void
lra_clear_live_ranges(void)1426*38fd1498Szrj lra_clear_live_ranges (void)
1427*38fd1498Szrj {
1428*38fd1498Szrj   int i;
1429*38fd1498Szrj 
1430*38fd1498Szrj   for (i = 0; i < max_reg_num (); i++)
1431*38fd1498Szrj     free_live_range_list (lra_reg_info[i].live_ranges);
1432*38fd1498Szrj   point_freq_vec.release ();
1433*38fd1498Szrj }
1434*38fd1498Szrj 
1435*38fd1498Szrj /* Initialize live ranges data once per function.  */
1436*38fd1498Szrj void
lra_live_ranges_init(void)1437*38fd1498Szrj lra_live_ranges_init (void)
1438*38fd1498Szrj {
1439*38fd1498Szrj   bitmap_initialize (&temp_bitmap, &reg_obstack);
1440*38fd1498Szrj   initiate_live_solver ();
1441*38fd1498Szrj }
1442*38fd1498Szrj 
1443*38fd1498Szrj /* Finish live ranges data once per function.  */
1444*38fd1498Szrj void
lra_live_ranges_finish(void)1445*38fd1498Szrj lra_live_ranges_finish (void)
1446*38fd1498Szrj {
1447*38fd1498Szrj   finish_live_solver ();
1448*38fd1498Szrj   bitmap_clear (&temp_bitmap);
1449*38fd1498Szrj   lra_live_range_pool.release ();
1450*38fd1498Szrj }
1451