re PR tree-optimization/87967 (ICE in slpeel_duplicate_current_defs_from_edges)
authorRichard Biener <rguenther@suse.de>
Tue, 13 Nov 2018 13:50:18 +0000 (13:50 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 13 Nov 2018 13:50:18 +0000 (13:50 +0000)
2018-11-13  Richard Biener  <rguenther@suse.de>

PR tree-optimization/87967
* tree-vect-loop.c (vect_transform_loop): Also copy PHIs
for constants for the scalar loop.

* g++.dg/opt/pr87967.C: New testcase.

From-SVN: r266070

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/opt/pr87967.C [new file with mode: 0644]
gcc/tree-vect-loop.c

index 369ef54fb0d74bff1ce41c7c23f7c719f6e65f39..19ccd9cbf1d019948f542a41feac979e9372150d 100644 (file)
@@ -1,3 +1,9 @@
+2018-11-13  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87967
+       * tree-vect-loop.c (vect_transform_loop): Also copy PHIs
+       for constants for the scalar loop.
+
 2018-11-13  Alan Modra  <amodra@gmail.com>
 
        * config/rs6000/linux64.h (ASM_OUTPUT_SPECIAL_POOL_ENTRY_P): Exclude
index 43f542d47c77e7cc9d0ecbbc191158478208d626..41ffd8b310087464f42be78b34a38027cf88835f 100644 (file)
@@ -1,3 +1,8 @@
+2018-11-13  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/87967
+       * g++.dg/opt/pr87967.C: New testcase.
+
 2018-11-13  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * gcc.target/arc/builtin_eh.c: New test.
diff --git a/gcc/testsuite/g++.dg/opt/pr87967.C b/gcc/testsuite/g++.dg/opt/pr87967.C
new file mode 100644 (file)
index 0000000..aa28dfc
--- /dev/null
@@ -0,0 +1,50 @@
+// { dg-do compile { target c++11 } }
+// { dg-options "-O3" }
+
+void h();
+template <typename b> struct k { using d = b; };
+template <typename b, template <typename> class> using e = k<b>;
+template <typename b, template <typename> class f>
+using g = typename e<b, f>::d;
+struct l {
+  template <typename i> using ab = typename i::j;
+};
+struct n : l {
+  using j = g<char *, ab>;
+};
+class o {
+public:
+  long r();
+};
+char m;
+char s() {
+  if (m)
+    return '0';
+  return 'A';
+}
+class t {
+public:
+  typedef char *ad;
+  ad m_fn2();
+};
+void fn3() {
+  char *a;
+  t b;
+  bool p = false;
+  while (*a) {
+    h();
+    o c;
+    if (*a)
+      a++;
+    if (c.r()) {
+      n::j q;
+      for (t::ad d = b.m_fn2(), e; d != e; d++) {
+        char f = *q;
+        *d = f + s();
+      }
+      p = true;
+    }
+  }
+  if (p)
+    throw;
+}
index 0dc84f1f9e56871bf00d6e11ea2a97e78e3ed5b8..c4886ec76e66880f0efcb44956ad25248aecfdc7 100644 (file)
@@ -8264,7 +8264,7 @@ vect_transform_loop (loop_vec_info loop_vinfo)
       e = single_exit (LOOP_VINFO_SCALAR_LOOP (loop_vinfo));
       if (! single_pred_p (e->dest))
        {
-         split_loop_exit_edge (e);
+         split_loop_exit_edge (e, true);
          if (dump_enabled_p ())
            dump_printf (MSG_NOTE, "split exit edge of scalar loop\n");
        }