aboutsummaryrefslogtreecommitdiff
path: root/gcc/cfgcleanup.c
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2013-11-22 04:16:47 +0000
committerTeresa Johnson <tejohnson@gcc.gnu.org>2013-11-22 04:16:47 +0000
commitd41d612242e589882364ba581c586094599952e3 (patch)
tree9a96a6100aed1345605dfb609da1d791d43f7d89 /gcc/cfgcleanup.c
parent5b3f0a54759dc5c1f0825739cfda1dae57d27ae0 (diff)
downloadgcc-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.c16
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)