diff options
author | Teresa Johnson <tejohnson@google.com> | 2013-11-22 04:16:47 +0000 |
---|---|---|
committer | Teresa Johnson <tejohnson@gcc.gnu.org> | 2013-11-22 04:16:47 +0000 |
commit | d41d612242e589882364ba581c586094599952e3 (patch) | |
tree | 9a96a6100aed1345605dfb609da1d791d43f7d89 /gcc/cfgcleanup.c | |
parent | 5b3f0a54759dc5c1f0825739cfda1dae57d27ae0 (diff) | |
download | gcc-d41d612242e589882364ba581c586094599952e3.zip gcc-d41d612242e589882364ba581c586094599952e3.tar.gz gcc-d41d612242e589882364ba581c586094599952e3.tar.bz2 |
re PR target/59233 (C++ failures after revision 205058 on *-apple-darwin* with -m32)
2013-11-21 Teresa Johnson <tejohnson@google.com>
PR target/59233
* cfgcleanup.c (outgoing_edges_match): Walk up past note instructions
not understood by old_insns_match_p.
From-SVN: r205243
Diffstat (limited to 'gcc/cfgcleanup.c')
-rw-r--r-- | gcc/cfgcleanup.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c index dbaee96..234e5b6 100644 --- a/gcc/cfgcleanup.c +++ b/gcc/cfgcleanup.c @@ -1743,12 +1743,20 @@ outgoing_edges_match (int mode, basic_block bb1, basic_block bb2) } } + /* Find the last non-debug non-note instruction in each bb, except + stop when we see the NOTE_INSN_BASIC_BLOCK, as old_insns_match_p + handles that case specially. old_insns_match_p does not handle + other types of instruction notes. */ rtx last1 = BB_END (bb1); rtx last2 = BB_END (bb2); - if (DEBUG_INSN_P (last1)) - last1 = prev_nondebug_insn (last1); - if (DEBUG_INSN_P (last2)) - last2 = prev_nondebug_insn (last2); + while (!NOTE_INSN_BASIC_BLOCK_P (last1) && + (DEBUG_INSN_P (last1) || NOTE_P (last1))) + last1 = PREV_INSN (last1); + while (!NOTE_INSN_BASIC_BLOCK_P (last2) && + (DEBUG_INSN_P (last2) || NOTE_P (last2))) + last2 = PREV_INSN (last2); + gcc_assert (last1 && last2); + /* First ensure that the instructions match. There may be many outgoing edges so this test is generally cheaper. */ if (old_insns_match_p (mode, last1, last2) != dir_both) |