aboutsummaryrefslogtreecommitdiff
path: root/gcc/shrink-wrap.c
diff options
context:
space:
mode:
authorJiong Wang <jiong.wang@arm.com>2014-09-25 16:39:49 +0000
committerJiong Wang <jiwang@gcc.gnu.org>2014-09-25 16:39:49 +0000
commitd0d9aad78a3d64f1b0c5c7b7abcea05bc6bc82fd (patch)
tree9ae8db227930d07ecc5041cb732fb3f6785b80c2 /gcc/shrink-wrap.c
parent0e9e0a218b8986711a627c3249d9cab17b9dc429 (diff)
downloadgcc-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.c9
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;
}