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