re PR middle-end/78540 (ICE: in df_refs_verify, at df-scan.c:4062 with -O -march...
authorJakub Jelinek <jakub@redhat.com>
Mon, 28 Nov 2016 22:51:29 +0000 (23:51 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 28 Nov 2016 22:51:29 +0000 (23:51 +0100)
PR middle-end/78540
* rtl.h (remove_reg_equal_equiv_notes): Return bool instead of void.
* rtlanal.c (remove_reg_equal_equiv_notes): Return true if any
note has been removed.
* postreload.c (reload_combine_recognize_pattern): If
remove_reg_equal_equiv_notes returns true, call df_notes_rescan.

* gcc.dg/pr78540.c: New test.

From-SVN: r242937

gcc/ChangeLog
gcc/postreload.c
gcc/rtl.h
gcc/rtlanal.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr78540.c [new file with mode: 0644]

index 12a717ea7f897bf8cbbfe19a949801a17e5cae0f..f62f7cb95cba8cdbbca6f3b83a30c55335d9c5e6 100644 (file)
@@ -1,3 +1,12 @@
+2016-11-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/78540
+       * rtl.h (remove_reg_equal_equiv_notes): Return bool instead of void.
+       * rtlanal.c (remove_reg_equal_equiv_notes): Return true if any
+       note has been removed.
+       * postreload.c (reload_combine_recognize_pattern): If
+       remove_reg_equal_equiv_notes returns true, call df_notes_rescan.
+
 2016-11-28  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/78520
index fcb6bc4bd50d10500379b728797f9f2a0172fe83..539ad33b6c3eb1b968677419a7420badc3a52f01 100644 (file)
@@ -1192,10 +1192,11 @@ reload_combine_recognize_pattern (rtx_insn *insn)
              /* Delete the reg-reg addition.  */
              delete_insn (insn);
 
-             if (reg_state[regno].offset != const0_rtx)
-               /* Previous REG_EQUIV / REG_EQUAL notes for PREV
-                  are now invalid.  */
-               remove_reg_equal_equiv_notes (prev);
+             if (reg_state[regno].offset != const0_rtx
+                 /* Previous REG_EQUIV / REG_EQUAL notes for PREV
+                    are now invalid.  */
+                 && remove_reg_equal_equiv_notes (prev))
+               df_notes_rescan (prev);
 
              reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
              return true;
index 660d381939da4cd22d06948c3b51c1993c892e73..5fde6989216bc3e2dc47412610dd6da7f18fd7d0 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -3057,7 +3057,7 @@ extern void add_int_reg_note (rtx_insn *, enum reg_note, int);
 extern void add_shallow_copy_of_reg_note (rtx_insn *, rtx);
 extern rtx duplicate_reg_note (rtx);
 extern void remove_note (rtx_insn *, const_rtx);
-extern void remove_reg_equal_equiv_notes (rtx_insn *);
+extern bool remove_reg_equal_equiv_notes (rtx_insn *);
 extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
 extern int side_effects_p (const_rtx);
 extern int volatile_refs_p (const_rtx);
index 17dbb1eaeb10809b2416052eda4ed8bd3f015455..4e4eb2ef34584856c270ac46e1da25c69094b41d 100644 (file)
@@ -2351,22 +2351,28 @@ remove_note (rtx_insn *insn, const_rtx note)
     }
 }
 
-/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.  */
+/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.
+   Return true if any note has been removed.  */
 
-void
+bool
 remove_reg_equal_equiv_notes (rtx_insn *insn)
 {
   rtx *loc;
+  bool ret = false;
 
   loc = &REG_NOTES (insn);
   while (*loc)
     {
       enum reg_note kind = REG_NOTE_KIND (*loc);
       if (kind == REG_EQUAL || kind == REG_EQUIV)
-       *loc = XEXP (*loc, 1);
+       {
+         *loc = XEXP (*loc, 1);
+         ret = true;
+       }
       else
        loc = &XEXP (*loc, 1);
     }
+  return ret;
 }
 
 /* Remove all REG_EQUAL and REG_EQUIV notes referring to REGNO.  */
index e4dff3c3e0961a6fb8382ce91c9449ae5543e95d..a63953ca89133852bf91b9c37c857816b51e1585 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/78540
+       * gcc.dg/pr78540.c: New test.
+
 2016-11-28  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/78520
diff --git a/gcc/testsuite/gcc.dg/pr78540.c b/gcc/testsuite/gcc.dg/pr78540.c
new file mode 100644 (file)
index 0000000..68bd9a4
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR middle-end/78540 */
+/* { dg-do compile { target int128 } } */
+/* { dg-options "-O2 -Wno-psabi" } */
+/* { dg-additional-options "-march=core2" { target i?86-*-* x86_64-*-* } } */
+
+typedef unsigned __int128 V __attribute__ ((vector_size (64)));
+V g;
+
+static inline V
+foo (V a)
+{
+  V b, c;
+  c[0] = 0;
+  a += 2281559097;
+  c ^= 0;
+  b[0] = 0;
+  return 1 + c + b + a;
+}
+
+V
+bar ()
+{
+  V a = g, b = g;
+  a[1] ^= 1;
+  b[foo (a)[0] & 3] |= 1;
+  return b;
+}