summaryrefslogtreecommitdiff
path: root/gcc/lra-lives.c
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-28 15:39:52 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-28 15:39:52 +0000
commitc518137034b5e524c8ea23edb9ef3525926791ae (patch)
tree9bb745aa18a89da9fb11997ec77c59c62cb054fa /gcc/lra-lives.c
parent7ca7358e3f9042a9eb7be14bafa2e6ae3eb44f3f (diff)
downloadgcc-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.c32
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);
}