diff options
author | Jakub Jelinek <jakub@redhat.com> | 2011-12-13 14:59:35 +0100 |
---|---|---|
committer | Michael Matz <matz@gcc.gnu.org> | 2011-12-13 13:59:35 +0000 |
commit | ea85edfe73100acc3769d924074b42a9cf35a6d1 (patch) | |
tree | 294ef0e96dd02fad62f02e425810cacff0f728be /gcc/cfgexpand.c | |
parent | bc45e4ba5adbdf11bebdae6aff125344cb9a4f75 (diff) | |
download | gcc-ea85edfe73100acc3769d924074b42a9cf35a6d1.zip gcc-ea85edfe73100acc3769d924074b42a9cf35a6d1.tar.gz gcc-ea85edfe73100acc3769d924074b42a9cf35a6d1.tar.bz2 |
re PR tree-optimization/51117 (rev.181172 causes glibc build failure)
PR tree-optimization/51117
* tree-eh.c (sink_clobbers): New function.
(execute_lower_eh_dispatch): Call it for BBs ending with
internally throwing RESX.
* cfgexpand.c (add_scope_conflicts_1): Add all conflicts only
at the first real instruction.
Co-Authored-By: Michael Matz <matz@suse.de>
From-SVN: r182283
Diffstat (limited to 'gcc/cfgexpand.c')
-rw-r--r-- | gcc/cfgexpand.c | 50 |
1 files changed, 26 insertions, 24 deletions
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 8684721..d41497d 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -456,34 +456,14 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) FOR_EACH_EDGE (e, ei, bb->preds) bitmap_ior_into (work, (bitmap)e->src->aux); - if (for_conflict) - { - /* We need to add conflicts for everything life at the start of - this block. Unlike classical lifeness for named objects we can't - rely on seeing a def/use of the names we're interested in. - There might merely be indirect loads/stores. We'd not add any - conflicts for such partitions. */ - bitmap_iterator bi; - unsigned i; - EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi) - { - unsigned j; - bitmap_iterator bj; - EXECUTE_IF_SET_IN_BITMAP (work, i, j, bj) - add_stack_var_conflict (i, j); - } - visit = visit_conflict; - } - else - visit = visit_op; + visit = visit_op; for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple stmt = gsi_stmt (gsi); - if (!is_gimple_debug (stmt)) - walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit); + walk_stmt_load_store_addr_ops (stmt, work, NULL, NULL, visit); } - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + for (gsi = gsi_after_labels (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { gimple stmt = gsi_stmt (gsi); @@ -501,7 +481,29 @@ add_scope_conflicts_1 (basic_block bb, bitmap work, bool for_conflict) bitmap_clear_bit (work, *v); } else if (!is_gimple_debug (stmt)) - walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit); + { + if (for_conflict + && visit == visit_op) + { + /* If this is the first real instruction in this BB we need + to add conflicts for everything life at this point now. + Unlike classical lifeness for named objects we can't + rely on seeing a def/use of the names we're interested in. + There might merely be indirect loads/stores. We'd not add any + conflicts for such partitions. */ + bitmap_iterator bi; + unsigned i; + EXECUTE_IF_SET_IN_BITMAP (work, 0, i, bi) + { + unsigned j; + bitmap_iterator bj; + EXECUTE_IF_SET_IN_BITMAP (work, i + 1, j, bj) + add_stack_var_conflict (i, j); + } + visit = visit_conflict; + } + walk_stmt_load_store_addr_ops (stmt, work, visit, visit, visit); + } } } |