re PR tree-optimization/92803 (error: type mismatch in 'vec_perm_expr' since r278764)
2019-12-05 Richard Biener <rguenther@suse.de> PR tree-optimization/92803 * tree-ssa-forwprop.c (simplify_vector_constructor): Fix invariant vector construction. * gcc.target/i386/pr92803.c: New testcase. From-SVN: r278991
This commit is contained in:
parent
42870a8682
commit
a3408fa3fb
4 changed files with 60 additions and 7 deletions
|
@ -1,3 +1,9 @@
|
|||
2019-12-05 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/92803
|
||||
* tree-ssa-forwprop.c (simplify_vector_constructor): Fix
|
||||
invariant vector construction.
|
||||
|
||||
2019-12-05 Martin Liska <mliska@suse.cz>
|
||||
|
||||
PR gcov-profile/91971
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2019-12-05 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/92803
|
||||
* gcc.target/i386/pr92803.c: New testcase.
|
||||
|
||||
2019-12-05 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR fortran/92781
|
||||
|
|
38
gcc/testsuite/gcc.target/i386/pr92803.c
Normal file
38
gcc/testsuite/gcc.target/i386/pr92803.c
Normal file
|
@ -0,0 +1,38 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -Wno-psabi -mavx2 -fdump-tree-forwprop1" } */
|
||||
|
||||
typedef double v4df __attribute__((vector_size (32)));
|
||||
typedef float v8sf __attribute__((vector_size (32)));
|
||||
typedef float v4sf __attribute__((vector_size (16)));
|
||||
typedef int v4si __attribute__((vector_size (16)));
|
||||
typedef double v2df __attribute__((vector_size (16)));
|
||||
|
||||
v2df
|
||||
foo (v4df x, double *p, v2df y)
|
||||
{
|
||||
return (v2df) { x[3], *p };
|
||||
}
|
||||
|
||||
v4sf
|
||||
bar (v4si x, float *p)
|
||||
{
|
||||
return (v4sf) { x[0], x[1], x[2], *p };
|
||||
}
|
||||
|
||||
v4sf
|
||||
baz (v4si x)
|
||||
{
|
||||
return (v4sf) { x[0], x[1], 3.0f, 1.0f };
|
||||
}
|
||||
|
||||
v4sf
|
||||
barf (v8sf x)
|
||||
{
|
||||
return (v4sf) { x[4], x[5], 1.0f, 2.0f };
|
||||
}
|
||||
|
||||
/* We expect all CTORs to turn into permutes, the FP converting ones
|
||||
to two each with the one with constants possibly elided in the future
|
||||
by converting 3.0f and 1.0f "back" to integers. */
|
||||
/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 6 "forwprop1" } } */
|
||||
/* { dg-final { scan-tree-dump-times "VEC_PERM_EXPR" 5 "forwprop1" { xfail *-*-* } } } */
|
|
@ -2286,24 +2286,28 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
|
|||
else if (orig[1] == error_mark_node
|
||||
&& one_nonconstant)
|
||||
{
|
||||
orig[1] = gimple_build_vector_from_val (&stmts, UNKNOWN_LOCATION,
|
||||
type, one_nonconstant);
|
||||
/* ??? We can see if we can safely convert to the original
|
||||
element type. */
|
||||
converted_orig1 = conv_code != ERROR_MARK;
|
||||
orig[1] = gimple_build_vector_from_val (&stmts, UNKNOWN_LOCATION,
|
||||
converted_orig1
|
||||
? type : perm_type,
|
||||
one_nonconstant);
|
||||
}
|
||||
else if (orig[1] == error_mark_node)
|
||||
{
|
||||
tree_vector_builder vec (type, nelts, 1);
|
||||
for (unsigned i = 0; i < nelts; ++i)
|
||||
if (constants[i])
|
||||
/* ??? See if we can convert the vector to the original type. */
|
||||
converted_orig1 = conv_code != ERROR_MARK;
|
||||
unsigned n = converted_orig1 ? nelts : refnelts;
|
||||
tree_vector_builder vec (converted_orig1
|
||||
? type : perm_type, n, 1);
|
||||
for (unsigned i = 0; i < n; ++i)
|
||||
if (i < nelts && constants[i])
|
||||
vec.quick_push (constants[i]);
|
||||
else
|
||||
/* ??? Push a don't-care value. */
|
||||
vec.quick_push (one_constant);
|
||||
orig[1] = vec.build ();
|
||||
/* ??? See if we can convert the vector to the original type. */
|
||||
converted_orig1 = conv_code != ERROR_MARK;
|
||||
}
|
||||
tree blend_op2 = NULL_TREE;
|
||||
if (converted_orig1)
|
||||
|
|
Loading…
Add table
Reference in a new issue