diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2014-11-14 20:06:11 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2014-11-14 20:06:11 +0000 |
commit | 4ab74a01477d4089a3474d52479ed372c9b5ae29 (patch) | |
tree | bca0d7e49464e99d894d55c93bb521b4d91d4e18 /gcc/lra.c | |
parent | 44210a9672aed3212c0e289dddc5bd38c314290b (diff) | |
download | gcc-4ab74a01477d4089a3474d52479ed372c9b5ae29.zip gcc-4ab74a01477d4089a3474d52479ed372c9b5ae29.tar.gz gcc-4ab74a01477d4089a3474d52479ed372c9b5ae29.tar.bz2 |
lra-int.h (lra_create_live_ranges): Add parameter.
2014-11-14 Vladimir Makarov <vmakarov@redhat.com>
* lra-int.h (lra_create_live_ranges): Add parameter.
* lra-lives.c (temp_bitmap): Move higher.
(initiate_live_solver): Move temp_bitmap initialization into
lra_live_ranges_init.
(finish_live_solver): Move temp_bitmap clearing into
live_ranges_finish.
(process_bb_lives): Add parameter. Use it to control live info
update and dead insn elimination. Pass it to mark_regno_live and
mark_regno_dead.
(lra_create_live_ranges): Add parameter. Pass it to
process_bb_lives.
(lra_live_ranges_init, lra_live_ranges_finish): See changes in
initiate_live_solver and finish_live_solver.
* lra-remat.c (do_remat): Process insn non-operand hard regs too.
Use temp_bitmap to update avail_cands.
* lra.c (lra): Pass new parameter to lra_create_live_ranges. Move
check with lra_need_for_spill_p after live range pass. Switch on
rematerialization pass.
From-SVN: r217588
Diffstat (limited to 'gcc/lra.c')
-rw-r--r-- | gcc/lra.c | 23 |
1 files changed, 14 insertions, 9 deletions
@@ -2296,14 +2296,17 @@ lra (FILE *f) /* As a side-effect of lra_create_live_ranges, we calculate actual_call_used_reg_set, which is needed during lra_inheritance. */ - lra_create_live_ranges (true); + lra_create_live_ranges (true, true); } lra_inheritance (); } if (live_p) lra_clear_live_ranges (); - /* We need live ranges for lra_assign -- so build them. */ - lra_create_live_ranges (true); + /* We need live ranges for lra_assign -- so build them. But + don't remove dead insns or change global live info as we + can undo inheritance transformations after inheritance + pseudo assigning. */ + lra_create_live_ranges (true, false); live_p = true; /* If we don't spill non-reload and non-inheritance pseudos, there is no sense to run memory-memory move coalescing. @@ -2322,7 +2325,7 @@ lra (FILE *f) { if (! live_p) { - lra_create_live_ranges (true); + lra_create_live_ranges (true, true); live_p = true; } if (lra_coalesce ()) @@ -2338,21 +2341,23 @@ lra (FILE *f) bitmap_clear (&lra_subreg_reload_pseudos); bitmap_clear (&lra_inheritance_pseudos); bitmap_clear (&lra_split_regs); - if (! lra_need_for_spills_p ()) - break; if (! live_p) { /* We need full live info for spilling pseudos into registers instead of memory. */ - lra_create_live_ranges (lra_reg_spill_p); + lra_create_live_ranges (lra_reg_spill_p, true); live_p = true; } + /* We should check necessity for spilling here as the above live + range pass can remove spilled pseudos. */ + if (! lra_need_for_spills_p ()) + break; /* Now we know what pseudos should be spilled. Try to rematerialize them first. */ - if (0 && lra_remat ()) + if (lra_remat ()) { /* We need full live info -- see the comment above. */ - lra_create_live_ranges (lra_reg_spill_p); + lra_create_live_ranges (lra_reg_spill_p, true); live_p = true; if (! lra_need_for_spills_p ()) break; |