diff options
author | zqchen <zqchen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-26 06:11:33 +0000 |
---|---|---|
committer | zqchen <zqchen@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-05-26 06:11:33 +0000 |
commit | ceecb56c1d0e6f21fc3fd4dcbddd33f6139c0d40 (patch) | |
tree | f3d69779fbdc0c50143895e374af8c05446ae798 /gcc/shrink-wrap.c | |
parent | 19b03318b42e3c447c9c9ea17736b7ef55d9cd0b (diff) | |
download | gcc-ceecb56c1d0e6f21fc3fd4dcbddd33f6139c0d40.tar.gz |
ChangeLog:
2014-05-26 Zhenqiang Chen <zhenqiang.chen@linaro.org>
PR rtl-optimization/61220
Part of PR rtl-optimization/61225
* shrink-wrap.c (move_insn_for_shrink_wrap): Skip SP and FP adjustment
insn; skip split_edge for a block with only one successor.
testsuite/ChangeLog:
2014-05-26 Zhenqiang Chen <zhenqiang.chen@linaro.org>
* gcc.dg/pr61220.c: New test.
* gcc.dg/shrink-wrap-loop.c: Disable for x86_64 -m32 mode.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@210921 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/shrink-wrap.c')
-rw-r--r-- | gcc/shrink-wrap.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c index f09cfe7b1f9..68635025a33 100644 --- a/gcc/shrink-wrap.c +++ b/gcc/shrink-wrap.c @@ -179,7 +179,12 @@ move_insn_for_shrink_wrap (basic_block bb, rtx insn, return false; src = SET_SRC (set); dest = SET_DEST (set); - if (!REG_P (dest) || !REG_P (src)) + if (!REG_P (dest) || !REG_P (src) + /* STACK or FRAME related adjustment might be part of prologue. + So keep them in the entry block. */ + || dest == stack_pointer_rtx + || dest == frame_pointer_rtx + || dest == hard_frame_pointer_rtx) return false; /* Make sure that the source register isn't defined later in BB. */ @@ -204,6 +209,10 @@ move_insn_for_shrink_wrap (basic_block bb, rtx insn, /* Create a new basic block on the edge. */ if (EDGE_COUNT (next_block->preds) == 2) { + /* split_edge for a block with only one successor is meaningless. */ + if (EDGE_COUNT (bb->succs) == 1) + return false; + next_block = split_edge (live_edge); bitmap_copy (df_get_live_in (next_block), df_get_live_out (bb)); |