re PR tree-optimization/83293 (ICE: in gsi_insert_seq_nodes_after, at gimple-iterato...
authorJakub Jelinek <jakub@redhat.com>
Wed, 6 Dec 2017 19:27:41 +0000 (20:27 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 6 Dec 2017 19:27:41 +0000 (20:27 +0100)
PR tree-optimization/83293
* gimple-ssa-strength-reduction.c (insert_initializers): Use
GSI_NEW_STMT instead of GSI_SAME_STMT in gsi_insert_after that
might insert into empty bb.

* g++.dg/torture/pr83293.C: New test.

From-SVN: r255451

gcc/ChangeLog
gcc/gimple-ssa-strength-reduction.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr83293.C [new file with mode: 0644]

index 9cfc382239bb1077c000e83cefe05caee1429f83..0310a5202d86f8693a64f6ced115f451213e4d4a 100644 (file)
@@ -1,5 +1,10 @@
 2017-12-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/83293
+       * gimple-ssa-strength-reduction.c (insert_initializers): Use
+       GSI_NEW_STMT instead of GSI_SAME_STMT in gsi_insert_after that
+       might insert into empty bb.
+
        PR sanitizer/81281
        * match.pd ((T)(P + A) - (T)P -> (T) A): Split into separate
        simplify for plus with :c added, and pointer_plus without that.
index 42320ff66823f102b833d2bbad9ee6d0db517916..b51239b94d02943e84fdc3a46272218a03f2229a 100644 (file)
@@ -3418,7 +3418,7 @@ insert_initializers (slsr_cand_t c)
                  gsi_insert_after (&gsi, cast_stmt, GSI_NEW_STMT);
                  gimple_set_location (cast_stmt, loc);
                }
-             gsi_insert_after (&gsi, init_stmt, GSI_SAME_STMT);
+             gsi_insert_after (&gsi, init_stmt, GSI_NEW_STMT);
            }
 
          gimple_set_location (init_stmt, gimple_location (basis_stmt));
index 3ad19f056ec93b4279e001b50371b30c8fa14903..67bdbbd5b331424f088229304cc728f5b9944a01 100644 (file)
@@ -1,5 +1,8 @@
 2017-12-06  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/83293
+       * g++.dg/torture/pr83293.C: New test.
+
        PR sanitizer/81281
        * gcc.c-torture/execute/pr81281.c: New test.
        * gcc.dg/pr81281-1.c: New test.
diff --git a/gcc/testsuite/g++.dg/torture/pr83293.C b/gcc/testsuite/g++.dg/torture/pr83293.C
new file mode 100644 (file)
index 0000000..f4556f3
--- /dev/null
@@ -0,0 +1,39 @@
+// PR tree-optimization/83293
+
+typedef __SIZE_TYPE__ size_t;
+template <typename T, typename> struct A {
+  T a;
+  A (T x) : a(x) {}
+  T foo () { return a; }
+};
+
+template <typename T, typename U, typename V>
+int
+operator==(A<T, V> x, A<U, V> p2)
+{
+  return x.foo () == p2.foo ();
+}
+
+struct B { struct { int *b, *c; } d; };
+struct C : B {
+  A<int *, int> bar () { return d.b; }
+  A<int *, int> baz () { return d.c; }
+  size_t boo () { return d.c - d.b; }
+  int zoo () { return bar () == baz (); }
+};
+struct D { C e; } a;
+size_t b;
+
+size_t
+test (int x)
+{
+  size_t c (x * b);
+  if (!a.e.zoo ())
+    {
+      x += 2;
+      for (size_t d = 0, e = a.e.boo (); d < e; ++d)
+       c += test (0);
+    }
+  c += (x - 1) * b;
+  return c;
+}