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> 2019-12-05 Martin Liska <mliska@suse.cz>
PR gcov-profile/91971 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> 2019-12-05 Jakub Jelinek <jakub@redhat.com>
PR fortran/92781 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) ...@@ -2286,24 +2286,28 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
else if (orig[1] == error_mark_node else if (orig[1] == error_mark_node
&& one_nonconstant) && 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 /* ??? We can see if we can safely convert to the original
element type. */ element type. */
converted_orig1 = conv_code != ERROR_MARK; 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) else if (orig[1] == error_mark_node)
{ {
tree_vector_builder vec (type, nelts, 1); /* ??? See if we can convert the vector to the original type. */
for (unsigned i = 0; i < nelts; ++i) converted_orig1 = conv_code != ERROR_MARK;
if (constants[i]) 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]); vec.quick_push (constants[i]);
else else
/* ??? Push a don't-care value. */ /* ??? Push a don't-care value. */
vec.quick_push (one_constant); vec.quick_push (one_constant);
orig[1] = vec.build (); 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; tree blend_op2 = NULL_TREE;
if (converted_orig1) 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