re PR tree-optimization/84803 (ICE from ifcvt_memrefs_wont_trap with -O3)
authorRichard Biener <rguenther@suse.de>
Mon, 12 Mar 2018 12:32:28 +0000 (12:32 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 12 Mar 2018 12:32:28 +0000 (12:32 +0000)
2018-03-12  Richard Biener  <rguenther@suse.de>

PR tree-optimization/84803
* tree-if-conv.c (ifcvt_memrefs_wont_trap): Don't do anything
for refs DR analysis didn't process.

* gcc.dg/torture/pr84803.c: New testcase.

From-SVN: r258446

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr84803.c [new file with mode: 0644]
gcc/tree-if-conv.c

index bc08bae..548de75 100644 (file)
@@ -1,5 +1,11 @@
 2018-03-12  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/84803
+       * tree-if-conv.c (ifcvt_memrefs_wont_trap): Don't do anything
+       for refs DR analysis didn't process.
+
+2018-03-12  Richard Biener  <rguenther@suse.de>
+
        PR tree-optimization/84777
        * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): For
        force-vectorize loops ignore whether we are optimizing for size.
index 69c00d1..c13747a 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-12  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/84803
+       * gcc.dg/torture/pr84803.c: New testcase.
+
 2018-03-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/84813
diff --git a/gcc/testsuite/gcc.dg/torture/pr84803.c b/gcc/testsuite/gcc.dg/torture/pr84803.c
new file mode 100644 (file)
index 0000000..81aad62
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+
+long a;
+long *b;
+void c ();
+void d ();
+void
+e (long f)
+{
+  if (a)
+    *b = f;
+}
+void
+g ()
+{
+  c (g, e);
+}
+void
+c (int f, int h ())
+{
+  d (f, h, "");
+}
+void
+d (int f, int h (), char *i, char *k)
+{
+  int j;
+  d (f, h, i + 1, k);
+  while (--j)
+    h (*i);
+}
index c68a0c7..71dac4f 100644 (file)
@@ -864,6 +864,11 @@ base_object_writable (tree ref)
 static bool
 ifcvt_memrefs_wont_trap (gimple *stmt, vec<data_reference_p> drs)
 {
+  /* If DR didn't see a reference here we can't use it to tell
+     whether the ref traps or not.  */
+  if (gimple_uid (stmt) == 0)
+    return false;
+
   data_reference_p *master_dr, *base_master_dr;
   data_reference_p a = drs[gimple_uid (stmt) - 1];