diff options
author | Jiong Wang <jiong.wang@arm.com> | 2014-09-25 16:39:49 +0000 |
---|---|---|
committer | Jiong Wang <jiwang@gcc.gnu.org> | 2014-09-25 16:39:49 +0000 |
commit | d0d9aad78a3d64f1b0c5c7b7abcea05bc6bc82fd (patch) | |
tree | 9ae8db227930d07ecc5041cb732fb3f6785b80c2 /gcc/shrink-wrap.c | |
parent | 0e9e0a218b8986711a627c3249d9cab17b9dc429 (diff) | |
download | gcc-d0d9aad78a3d64f1b0c5c7b7abcea05bc6bc82fd.zip gcc-d0d9aad78a3d64f1b0c5c7b7abcea05bc6bc82fd.tar.gz gcc-d0d9aad78a3d64f1b0c5c7b7abcea05bc6bc82fd.tar.bz2 |
Improve live-in calculation for splitted block
gcc/
* shrink-wrap.c (move_insn_for_shrink_wrap): Initialize the live-in of new
created BB as the intersection of live-in from "old_dest" and live-out from
"bb".
gcc/testsuite/
* gcc.target/i386/shrink_wrap_1.c: New test.
From-SVN: r215611
Diffstat (limited to 'gcc/shrink-wrap.c')
-rw-r--r-- | gcc/shrink-wrap.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c index af23f02..bd4813c 100644 --- a/gcc/shrink-wrap.c +++ b/gcc/shrink-wrap.c @@ -250,16 +250,21 @@ move_insn_for_shrink_wrap (basic_block bb, rtx_insn *insn, if (!df_live) return false; + basic_block old_dest = live_edge->dest; next_block = split_edge (live_edge); /* We create a new basic block. Call df_grow_bb_info to make sure all data structures are allocated. */ df_grow_bb_info (df_live); - bitmap_copy (df_get_live_in (next_block), df_get_live_out (bb)); + + bitmap_and (df_get_live_in (next_block), df_get_live_out (bb), + df_get_live_in (old_dest)); df_set_bb_dirty (next_block); /* We should not split more than once for a function. */ - gcc_assert (!(*split_p)); + if (*split_p) + return false; + *split_p = true; } |