aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2017-12-06 20:27:41 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-12-06 20:27:41 +0100
commit06f9708454a5e644b1fb5ed17a863cd624985e17 (patch)
treee387cb5a2e1f0fcea19d32c4f7ecb352b4dcb73d /gcc
parentbf8ce85a42258d0fd7c7d20362af55c243045e45 (diff)
downloadgcc-06f9708454a5e644b1fb5ed17a863cd624985e17.zip
gcc-06f9708454a5e644b1fb5ed17a863cd624985e17.tar.gz
gcc-06f9708454a5e644b1fb5ed17a863cd624985e17.tar.bz2
re PR tree-optimization/83293 (ICE: in gsi_insert_seq_nodes_after, at gimple-iterator.c:278)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gimple-ssa-strength-reduction.c2
-rw-r--r--gcc/testsuite/ChangeLog3
-rw-r--r--gcc/testsuite/g++.dg/torture/pr83293.C39
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9cfc382..0310a52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index 42320ff..b51239b 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -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));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3ad19f0..67bdbbd 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f4556f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr83293.C
@@ -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;
+}