diff options
author | Richard Biener <rguenther@suse.de> | 2014-01-30 15:30:30 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-01-30 15:30:30 +0000 |
commit | c972624e481f320326200ef6cfbaaf4daa66a45a (patch) | |
tree | 7a4c228e95faa539dfe8dd61453d3386242a447e | |
parent | 9ca57929d6193e7445a4ca6a5bbb44834edf84dc (diff) | |
download | gcc-c972624e481f320326200ef6cfbaaf4daa66a45a.zip gcc-c972624e481f320326200ef6cfbaaf4daa66a45a.tar.gz gcc-c972624e481f320326200ef6cfbaaf4daa66a45a.tar.bz2 |
re PR tree-optimization/59903 (ICE on valid code at -O3 on x86_64-linux-gnu (affecting trunk and 4.8.x))
2014-01-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/59903
* tree-vect-loop.c (vect_transform_loop): Guard multiple-types
check properly.
* gcc.dg/torture/pr59903.c: New testcase.
From-SVN: r207307
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr59903.c | 56 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 5 |
4 files changed, 70 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d571a8f..ca5a893 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-01-30 Richard Biener <rguenther@suse.de> + + PR tree-optimization/59903 + * tree-vect-loop.c (vect_transform_loop): Guard multiple-types + check properly. + 2014-01-30 Jason Merrill <jason@redhat.com> PR c++/59633 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 22a79d4..5b3e071 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-01-30 Richard Biener <rguenther@suse.de> + + PR tree-optimization/59903 + * gcc.dg/torture/pr59903.c: New testcase. + 2014-01-30 Paolo Carlini <paolo.carlini@oracle.com> PR c++/58843 diff --git a/gcc/testsuite/gcc.dg/torture/pr59903.c b/gcc/testsuite/gcc.dg/torture/pr59903.c new file mode 100644 index 0000000..01772df --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr59903.c @@ -0,0 +1,56 @@ +/* { dg-do compile } */ + +int a, b, c, d, e, f, g, h, i[3], l, m, n, o, p, q, r; + +struct S0 +{ + int f0; + int f1; + int f2; + int f3; +} j; + +static int +fn1 (int p1) +{ + return p1 || ((p1 > 0) > (e << 1)); +} + +static struct S0 +fn2 (struct S0 p1) +{ + char s; + struct S0 t = {0,0,0,0}; + int u = 2; + for (;;) + { + if (i[0]) + break; + for (m = 0; m < 4; m++) + for (p1.f0 = 0; p1.f0 < 3; p1.f0++) + { + j = t; + t.f3 = i[p1.f0]; + o = b || 1 >> b ? 0 : a < 0; + q = 1 % d; + if ((g < fn1 ((1 ^ (q & 1)) | n)) ^ u) + j.f3 |= p % 2; + s = j.f3 > 0 ? j.f3 : j.f3 << 1; + r = l = s && p1.f1 * c; + h = p1.f1; + } + } + return p1; +} + +int +main () +{ + for (;f;) + { + struct S0 v = {0,0,0,0}; + fn2 (v); + j.f3 = 0; + } + return 0; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 69c8d21..2bb9fbd 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -5869,8 +5869,9 @@ vect_transform_loop (loop_vec_info loop_vinfo) && !STMT_VINFO_LIVE_P (stmt_info)) continue; - if ((TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info)) - != (unsigned HOST_WIDE_INT) vectorization_factor) + if (STMT_VINFO_VECTYPE (stmt_info) + && (TYPE_VECTOR_SUBPARTS (STMT_VINFO_VECTYPE (stmt_info)) + != (unsigned HOST_WIDE_INT) vectorization_factor) && dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "multiple-types.\n"); |