summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-16 08:04:31 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-16 08:04:31 +0000
commit4c9c653969942f507a71a13aed00831daf2a59ff (patch)
tree648a9056f458a6ed079dbf829e143f96eb75dfb8
parentc4b4be7f287f7cd86a3b36c2f25c79558ecd6180 (diff)
downloadgcc-4c9c653969942f507a71a13aed00831daf2a59ff.tar.gz
PR rtl-optimization/65980
* jump.c (rtx_renumbered_equal_p) <case LABEL_REF>: Use next_nonnote_nondebug_insn instead of next_real_insn and skip over CODE_LABELs too. * gcc.dg/pr65980.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231672 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/jump.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr65980.c30
4 files changed, 52 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad50192a923..c68fd132e34 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2015-12-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/65980
+ * jump.c (rtx_renumbered_equal_p) <case LABEL_REF>: Use
+ next_nonnote_nondebug_insn instead of next_real_insn and
+ skip over CODE_LABELs too.
+
2015-12-10 Jan Hubicka <hubicka@ucw.cz>
* symtab.c (symtab_node::fixup_same_cpp_alias_visibility):
diff --git a/gcc/jump.c b/gcc/jump.c
index c41710db73d..79188f4bc65 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -1802,8 +1802,16 @@ rtx_renumbered_equal_p (const_rtx x, const_rtx y)
/* Two label-refs are equivalent if they point at labels
in the same position in the instruction stream. */
- return (next_real_insn (LABEL_REF_LABEL (x))
- == next_real_insn (LABEL_REF_LABEL (y)));
+ else
+ {
+ rtx_insn *xi = next_nonnote_nondebug_insn (LABEL_REF_LABEL (x));
+ rtx_insn *yi = next_nonnote_nondebug_insn (LABEL_REF_LABEL (y));
+ while (xi && LABEL_P (xi))
+ xi = next_nonnote_nondebug_insn (xi);
+ while (yi && LABEL_P (yi))
+ yi = next_nonnote_nondebug_insn (yi);
+ return xi == yi;
+ }
case SYMBOL_REF:
return XSTR (x, 0) == XSTR (y, 0);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7e45765159c..a0b8fda8b3c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-16 Jakub Jelinek <jakub@redhat.com>
+
+ PR rtl-optimization/65980
+ * gcc.dg/pr65980.c: New test.
+
2015-12-15 Martin Sebor <msebor@redhat.com>
c++/42121
diff --git a/gcc/testsuite/gcc.dg/pr65980.c b/gcc/testsuite/gcc.dg/pr65980.c
new file mode 100644
index 00000000000..5139ae36145
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr65980.c
@@ -0,0 +1,30 @@
+/* PR rtl-optimization/65980 */
+/* { dg-do compile } */
+/* { dg-options "-O3 -fcompare-debug" } */
+
+typedef struct { int b; } A;
+void (*a) (int);
+int b;
+
+int
+foo (A *v)
+{
+ asm goto ("" : : "m" (v->b) : : l);
+ return 0;
+l:
+ return 1;
+}
+
+int
+bar (void)
+{
+ if (b)
+ {
+ if (foo (0) && a)
+ a (0);
+ return 0;
+ }
+ if (foo (0) && a)
+ a (0);
+ return 0;
+}