diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-28 15:39:52 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-11-28 15:39:52 +0000 |
commit | c518137034b5e524c8ea23edb9ef3525926791ae (patch) | |
tree | 9bb745aa18a89da9fb11997ec77c59c62cb054fa /gcc/lra-lives.c | |
parent | 7ca7358e3f9042a9eb7be14bafa2e6ae3eb44f3f (diff) | |
download | gcc-c518137034b5e524c8ea23edb9ef3525926791ae.tar.gz |
2014-11-28 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/64087
* lra-lives.c (process_bb_lives): Add debug output.
(lra_create_live_ranges): Don't remove dead insn on the second
call of lra_create_live_ranges_1.
2014-11-28 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/64087
* gcc.dg/pr64087.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218162 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra-lives.c')
-rw-r--r-- | gcc/lra-lives.c | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/gcc/lra-lives.c b/gcc/lra-lives.c index df0143f893b..a593b029320 100644 --- a/gcc/lra-lives.c +++ b/gcc/lra-lives.c @@ -971,14 +971,23 @@ process_bb_lives (basic_block bb, int &curr_point, bool dead_insn_p) live_pseudos_num++; if (! sparseset_bit_p (pseudos_live, j)) { - live_change_p = TRUE; + live_change_p = true; + if (lra_dump_file != NULL) + fprintf (lra_dump_file, + " r%d is removed as live at bb%d start\n", j, bb->index); break; } } - live_change_p - = (live_change_p - || sparseset_cardinality (pseudos_live) != live_pseudos_num); - + if (! live_change_p + && sparseset_cardinality (pseudos_live) != live_pseudos_num) + { + live_change_p = true; + if (lra_dump_file != NULL) + EXECUTE_IF_SET_IN_SPARSESET (pseudos_live, j) + if (! bitmap_bit_p (df_get_live_in (bb), j)) + fprintf (lra_dump_file, + " r%d is added to live at bb%d start\n", j, bb->index); + } /* See if we'll need an increment at the end of this basic block. An increment is needed if the PSEUDOS_LIVE set is not empty, to make sure the finish points are set up correctly. */ @@ -1322,11 +1331,16 @@ lra_create_live_ranges (bool all_p, bool dead_insn_p) if (lra_dump_file != NULL) fprintf (lra_dump_file, "Live info was changed -- recalculate it\n"); /* Live info was changed on a bb border. It means that some info, - e.g. about conflict regs, calls crossed may be wrong, live - ranges. We need this info for allocation. So recalcualate it - again. */ + e.g. about conflict regs, calls crossed, and live ranges may be + wrong. We need this info for allocation. So recalculate it + again but without removing dead insns which can change live info + again. Repetitive live range calculations are expensive therefore + we stop here as we already have correct info although some + improvement in rare cases could be possible on this sub-pass if + we do dead insn elimination again (still the improvement may + happen later). */ lra_clear_live_ranges (); - bool res = lra_create_live_ranges_1 (all_p, dead_insn_p); + bool res = lra_create_live_ranges_1 (all_p, false); lra_assert (! res); } |