diff options
author | Jakub Jelinek <jakub@redhat.com> | 2015-12-16 09:04:31 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2015-12-16 09:04:31 +0100 |
commit | 8ec0963c81b2023596d1c9913571c2c462f06796 (patch) | |
tree | 648a9056f458a6ed079dbf829e143f96eb75dfb8 | |
parent | 3fddb2efc21a7724a7de2cca9bc277bb2bff473e (diff) | |
download | gcc-8ec0963c81b2023596d1c9913571c2c462f06796.zip gcc-8ec0963c81b2023596d1c9913571c2c462f06796.tar.gz gcc-8ec0963c81b2023596d1c9913571c2c462f06796.tar.bz2 |
re PR rtl-optimization/65980 (-fcompare-debug failure building Linux kernel)
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.
From-SVN: r231672
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/jump.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr65980.c | 30 |
4 files changed, 52 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ad50192..c68fd13 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): @@ -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 7e45765..a0b8fda 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 0000000..5139ae3 --- /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; +} |