Commit a3408fa3 by Richard Biener Committed by Richard Biener

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
parent 42870a86
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
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
......
/* { 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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment