diff options
author | Richard Biener <rguenther@suse.de> | 2019-06-24 17:21:40 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2019-06-24 17:21:40 +0000 |
commit | d611cec3de1e54091843019a0d02c23493d288ce (patch) | |
tree | c0b15c47569f9be00c072bf6bd8cf84491b489a7 /gcc | |
parent | bab9de71b45df56e3ad90aa817d7e23ea79d726d (diff) | |
download | gcc-d611cec3de1e54091843019a0d02c23493d288ce.zip gcc-d611cec3de1e54091843019a0d02c23493d288ce.tar.gz gcc-d611cec3de1e54091843019a0d02c23493d288ce.tar.bz2 |
re PR target/90972 (ICE in fold_convert_loc, at fold-const.c:2429)
2019-06-24 Richard Biener <rguenther@suse.de>
PR tree-optimization/90972
* tree-vect-stmts.c (vect_init_vector): Handle CONSTANT_CLASS_P
in common code, dealing with STRING_CST properly.
* gcc.dg/torture/pr90972.c: New testcase.
From-SVN: r272623
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr90972.c | 24 | ||||
-rw-r--r-- | gcc/tree-vect-stmts.c | 19 |
4 files changed, 44 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b56cc77..ad978fd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2019-06-24 Richard Biener <rguenther@suse.de> + PR tree-optimization/90972 + * tree-vect-stmts.c (vect_init_vector): Handle CONSTANT_CLASS_P + in common code, dealing with STRING_CST properly. + +2019-06-24 Richard Biener <rguenther@suse.de> + PR tree-optimization/90930 PR tree-optimization/90316 * tree-ssa-alias.c (walk_non_aliased_vuses): Add missing diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 041a81a..8a58f48 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-06-24 Richard Biener <rguenther@suse.de> + + PR tree-optimization/90972 + * gcc.dg/torture/pr90972.c: New testcase. + 2019-06-24 Martin Sebor <msebor@redhat.com> * gcc.dg/Wfloat-equal-1.c: Adjust text of expected diagnostic. diff --git a/gcc/testsuite/gcc.dg/torture/pr90972.c b/gcc/testsuite/gcc.dg/torture/pr90972.c new file mode 100644 index 0000000..24f99b0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr90972.c @@ -0,0 +1,24 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-mcpu=power8" { target powerpc*-*-* } } */ + +long f; +void a(); +void *g() +{ + char h[] = {}, j[] = {}, k[] = {}, l[] = {}, m[] = {}, n[] = {}, o[] = {}, + q[] = {}, r[] = {}; + static const char i[] = {6, 0}; + const char *nops[] = {h, i, j, k, l, m, n, o, q, r}; + long s = 2; + void *fill = a; + char *p = fill; + while (f) { + void *b = p; + const void *c = nops[1]; + long d = s, e = __builtin_object_size(b, 0); + __builtin___memcpy_chk(b, c, d, e); + p += s; + f -= s; + } + return fill; +} diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index 800c000..47da295 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -1481,20 +1481,19 @@ vect_init_vector (stmt_vec_info stmt_info, tree val, tree type, val = new_temp; } } - else if (CONSTANT_CLASS_P (val)) - val = fold_convert (TREE_TYPE (type), val); else { - new_temp = make_ssa_name (TREE_TYPE (type)); + gimple_seq stmts = NULL; if (! INTEGRAL_TYPE_P (TREE_TYPE (val))) - init_stmt = gimple_build_assign (new_temp, - fold_build1 (VIEW_CONVERT_EXPR, - TREE_TYPE (type), - val)); + val = gimple_build (&stmts, VIEW_CONVERT_EXPR, + TREE_TYPE (type), val); else - init_stmt = gimple_build_assign (new_temp, NOP_EXPR, val); - vect_init_vector_1 (stmt_info, init_stmt, gsi); - val = new_temp; + /* ??? Condition vectorization expects us to do + promotion of invariant/external defs. */ + val = gimple_convert (&stmts, TREE_TYPE (type), val); + for (gimple_stmt_iterator gsi2 = gsi_start (stmts); + !gsi_end_p (gsi2); gsi_next (&gsi2)) + vect_init_vector_1 (stmt_info, gsi_stmt (gsi2), gsi); } } val = build_vector_from_val (type, val); |