diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-02 09:43:14 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-08-02 09:43:14 +0000 |
commit | ff11bbd5a35a59f4bc4f9828079295bc3b45f87f (patch) | |
tree | 6eb8077b726a7da082b816374813da18c0ff6f41 /gcc/tree-ssa-tail-merge.c | |
parent | ea996e9954b687cd0f1c6354b64be1681a0aee02 (diff) | |
download | gcc-ff11bbd5a35a59f4bc4f9828079295bc3b45f87f.tar.gz |
2012-08-02 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50672
Revert
2012-08-01 Richard Guenther <rguenther@suse.de>
* tree-ssa-tail-merge.c (release_last_vdef): Remove.
(replace_block_by): Adjust.
* g++.dg/torture/pr50672.C: New testcase.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@190070 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-tail-merge.c')
-rw-r--r-- | gcc/tree-ssa-tail-merge.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c index ab37336d0c4..a2d4633e993 100644 --- a/gcc/tree-ssa-tail-merge.c +++ b/gcc/tree-ssa-tail-merge.c @@ -812,6 +812,37 @@ same_succ_flush_bbs (bitmap bbs) same_succ_flush_bb (BASIC_BLOCK (i)); } +/* Release the last vdef in BB, either normal or phi result. */ + +static void +release_last_vdef (basic_block bb) +{ + gimple_stmt_iterator i; + + for (i = gsi_last_bb (bb); !gsi_end_p (i); gsi_prev_nondebug (&i)) + { + gimple stmt = gsi_stmt (i); + if (gimple_vdef (stmt) == NULL_TREE) + continue; + + mark_virtual_operand_for_renaming (gimple_vdef (stmt)); + return; + } + + for (i = gsi_start_phis (bb); !gsi_end_p (i); gsi_next (&i)) + { + gimple phi = gsi_stmt (i); + tree res = gimple_phi_result (phi); + + if (is_gimple_reg (res)) + continue; + + mark_virtual_phi_result_for_renaming (phi); + return; + } + +} + /* For deleted_bb_preds, find bbs with same successors. */ static void @@ -1446,6 +1477,7 @@ replace_block_by (basic_block bb1, basic_block bb2) bb1->frequency = 0; /* Do updates that use bb1, before deleting bb1. */ + release_last_vdef (bb1); same_succ_flush_bb (bb1); delete_basic_block (bb1); |