* [PATCH] Prep for PR88828 fix
@ 2019-05-03 13:02 Richard Biener
2019-05-03 16:48 ` H.J. Lu
0 siblings, 1 reply; 4+ messages in thread
From: Richard Biener @ 2019-05-03 13:02 UTC (permalink / raw)
To: gcc-patches
The following refactors simplify_vector_constructor and adds
handling of constants to it in a straight-forward way.
A followup will handle the testcases posted in HJs patch.
Bootstrap / regtest running on x86_64-unknown-linux-gnu.
Richard.
2019-05-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/88828
* tree-ssa-forwprop.c (get_bit_field_ref_def): Split out from...
(simplify_vector_constructor): ...here. Handle constants in
the constructor.
* gcc.target/i386/pr88828-0.c: New testcase.
Index: gcc/tree-ssa-forwprop.c
===================================================================
--- gcc/tree-ssa-forwprop.c (revision 270847)
+++ gcc/tree-ssa-forwprop.c (working copy)
@@ -1997,6 +1997,44 @@ simplify_permutation (gimple_stmt_iterat
return 0;
}
+/* Get the BIT_FIELD_REF definition of VAL, if any, looking through
+ conversions with code CONV_CODE or update it if still ERROR_MARK.
+ Return NULL_TREE if no such matching def was found. */
+
+static tree
+get_bit_field_ref_def (tree val, enum tree_code &conv_code)
+{
+ if (TREE_CODE (val) != SSA_NAME)
+ return NULL_TREE ;
+ gimple *def_stmt = get_prop_source_stmt (val, false, NULL);
+ if (!def_stmt)
+ return NULL_TREE;
+ enum tree_code code = gimple_assign_rhs_code (def_stmt);
+ if (code == FLOAT_EXPR
+ || code == FIX_TRUNC_EXPR)
+ {
+ tree op1 = gimple_assign_rhs1 (def_stmt);
+ if (conv_code == ERROR_MARK)
+ {
+ if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (val))),
+ GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
+ return NULL_TREE;
+ conv_code = code;
+ }
+ else if (conv_code != code)
+ return NULL_TREE;
+ if (TREE_CODE (op1) != SSA_NAME)
+ return NULL_TREE;
+ def_stmt = SSA_NAME_DEF_STMT (op1);
+ if (! is_gimple_assign (def_stmt))
+ return NULL_TREE;
+ code = gimple_assign_rhs_code (def_stmt);
+ }
+ if (code != BIT_FIELD_REF)
+ return NULL_TREE;
+ return gimple_assign_rhs1 (def_stmt);
+}
+
/* Recognize a VEC_PERM_EXPR. Returns true if there were any changes. */
static bool
@@ -2027,6 +2065,9 @@ simplify_vector_constructor (gimple_stmt
orig[1] = NULL;
conv_code = ERROR_MARK;
maybe_ident = true;
+ tree one_constant = NULL_TREE;
+ auto_vec<tree> constants;
+ constants.safe_grow_cleared (nelts);
FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
{
tree ref, op1;
@@ -2034,68 +2075,55 @@ simplify_vector_constructor (gimple_stmt
if (i >= nelts)
return false;
- if (TREE_CODE (elt->value) != SSA_NAME)
- return false;
- def_stmt = get_prop_source_stmt (elt->value, false, NULL);
- if (!def_stmt)
- return false;
- code = gimple_assign_rhs_code (def_stmt);
- if (code == FLOAT_EXPR
- || code == FIX_TRUNC_EXPR)
+ op1 = get_bit_field_ref_def (elt->value, conv_code);
+ if (op1)
{
- op1 = gimple_assign_rhs1 (def_stmt);
- if (conv_code == ERROR_MARK)
+ ref = TREE_OPERAND (op1, 0);
+ unsigned int j;
+ for (j = 0; j < 2; ++j)
{
- if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (elt->value))),
- GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
- return false;
- conv_code = code;
+ if (!orig[j])
+ {
+ if (TREE_CODE (ref) != SSA_NAME)
+ return false;
+ if (! VECTOR_TYPE_P (TREE_TYPE (ref))
+ || ! useless_type_conversion_p (TREE_TYPE (op1),
+ TREE_TYPE (TREE_TYPE (ref))))
+ return false;
+ if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
+ TREE_TYPE (ref)))
+ return false;
+ orig[j] = ref;
+ break;
+ }
+ else if (ref == orig[j])
+ break;
}
- else if (conv_code != code)
+ if (j == 2)
return false;
- if (TREE_CODE (op1) != SSA_NAME)
- return false;
- def_stmt = SSA_NAME_DEF_STMT (op1);
- if (! is_gimple_assign (def_stmt))
+
+ unsigned int elt;
+ if (maybe_ne (bit_field_size (op1), elem_size)
+ || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
return false;
- code = gimple_assign_rhs_code (def_stmt);
+ if (j)
+ elt += nelts;
+ if (elt != i)
+ maybe_ident = false;
+ sel.quick_push (elt);
}
- if (code != BIT_FIELD_REF)
- return false;
- op1 = gimple_assign_rhs1 (def_stmt);
- ref = TREE_OPERAND (op1, 0);
- unsigned int j;
- for (j = 0; j < 2; ++j)
+ else if (CONSTANT_CLASS_P (elt->value))
{
- if (!orig[j])
- {
- if (TREE_CODE (ref) != SSA_NAME)
- return false;
- if (! VECTOR_TYPE_P (TREE_TYPE (ref))
- || ! useless_type_conversion_p (TREE_TYPE (op1),
- TREE_TYPE (TREE_TYPE (ref))))
- return false;
- if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
- TREE_TYPE (ref)))
- return false;
- orig[j] = ref;
- break;
- }
- else if (ref == orig[j])
- break;
+ if (orig[1]
+ && orig[1] != error_mark_node)
+ return false;
+ orig[1] = error_mark_node;
+ if (!one_constant)
+ one_constant = elt->value;
+ constants[i] = elt->value;
+ sel.quick_push (i + nelts);
+ maybe_ident = false;
}
- if (j == 2)
- return false;
-
- unsigned int elt;
- if (maybe_ne (bit_field_size (op1), elem_size)
- || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
- return false;
- if (j)
- elt += nelts;
- if (elt != i)
- maybe_ident = false;
- sel.quick_push (elt);
}
if (i < nelts)
return false;
@@ -2138,9 +2166,29 @@ simplify_vector_constructor (gimple_stmt
op2 = vec_perm_indices_to_tree (mask_type, indices);
if (!orig[1])
orig[1] = orig[0];
+ if (orig[1] == error_mark_node)
+ {
+ tree_vector_builder vec (type, nelts, 1);
+ for (unsigned i = 0; i < nelts; ++i)
+ if (constants[i])
+ vec.quick_push (constants[i]);
+ else
+ /* ??? Push a don't-care value. */
+ vec.quick_push (one_constant);
+ orig[1] = vec.build ();
+ }
if (conv_code == ERROR_MARK)
gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0],
orig[1], op2);
+ else if (TREE_CODE (orig[1]) == VECTOR_CST)
+ {
+ gimple *conv
+ = gimple_build_assign (make_ssa_name (type), conv_code, orig[0]);
+ orig[0] = gimple_assign_lhs (conv);
+ gsi_insert_before (gsi, conv, GSI_SAME_STMT);
+ gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR,
+ orig[0], orig[1], op2);
+ }
else
{
gimple *perm
Index: gcc/testsuite/gcc.target/i386/pr88828-0.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr88828-0.c (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr88828-0.c (working copy)
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse4.2" } */
+
+typedef int v4si __attribute__((vector_size(16)));
+typedef float v4sf __attribute__((vector_size(16)));
+
+v4si foo (v4si x)
+{
+ return (v4si){ x[0], 1, x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si bar (v4sf x)
+{
+ return (v4si){ 1, x[1], x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "cvttps2dq" } } */
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si baz (v4si x)
+{
+ return (v4si) { x[1], x[2], x[3], 0 };
+}
+
+/* { dg-final { scan-assembler "psrldq" } } */
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Prep for PR88828 fix
2019-05-03 13:02 [PATCH] Prep for PR88828 fix Richard Biener
@ 2019-05-03 16:48 ` H.J. Lu
2019-05-06 12:42 ` Richard Biener
2019-05-06 19:16 ` Bernhard Reutner-Fischer
0 siblings, 2 replies; 4+ messages in thread
From: H.J. Lu @ 2019-05-03 16:48 UTC (permalink / raw)
To: Richard Biener; +Cc: GCC Patches
[-- Attachment #1: Type: text/plain, Size: 9904 bytes --]
On Fri, May 3, 2019 at 6:02 AM Richard Biener <rguenther@suse.de> wrote:
>
>
> The following refactors simplify_vector_constructor and adds
> handling of constants to it in a straight-forward way.
>
> A followup will handle the testcases posted in HJs patch.
>
> Bootstrap / regtest running on x86_64-unknown-linux-gnu.
>
> Richard.
>
> 2019-05-03 Richard Biener <rguenther@suse.de>
>
> PR tree-optimization/88828
> * tree-ssa-forwprop.c (get_bit_field_ref_def): Split out from...
> (simplify_vector_constructor): ...here. Handle constants in
> the constructor.
>
> * gcc.target/i386/pr88828-0.c: New testcase.
>
> Index: gcc/tree-ssa-forwprop.c
> ===================================================================
> --- gcc/tree-ssa-forwprop.c (revision 270847)
> +++ gcc/tree-ssa-forwprop.c (working copy)
> @@ -1997,6 +1997,44 @@ simplify_permutation (gimple_stmt_iterat
> return 0;
> }
>
> +/* Get the BIT_FIELD_REF definition of VAL, if any, looking through
> + conversions with code CONV_CODE or update it if still ERROR_MARK.
> + Return NULL_TREE if no such matching def was found. */
> +
> +static tree
> +get_bit_field_ref_def (tree val, enum tree_code &conv_code)
> +{
> + if (TREE_CODE (val) != SSA_NAME)
> + return NULL_TREE ;
> + gimple *def_stmt = get_prop_source_stmt (val, false, NULL);
> + if (!def_stmt)
> + return NULL_TREE;
> + enum tree_code code = gimple_assign_rhs_code (def_stmt);
> + if (code == FLOAT_EXPR
> + || code == FIX_TRUNC_EXPR)
> + {
> + tree op1 = gimple_assign_rhs1 (def_stmt);
> + if (conv_code == ERROR_MARK)
> + {
> + if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (val))),
> + GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
> + return NULL_TREE;
> + conv_code = code;
> + }
> + else if (conv_code != code)
> + return NULL_TREE;
> + if (TREE_CODE (op1) != SSA_NAME)
> + return NULL_TREE;
> + def_stmt = SSA_NAME_DEF_STMT (op1);
> + if (! is_gimple_assign (def_stmt))
> + return NULL_TREE;
> + code = gimple_assign_rhs_code (def_stmt);
> + }
> + if (code != BIT_FIELD_REF)
> + return NULL_TREE;
> + return gimple_assign_rhs1 (def_stmt);
> +}
> +
> /* Recognize a VEC_PERM_EXPR. Returns true if there were any changes. */
>
> static bool
> @@ -2027,6 +2065,9 @@ simplify_vector_constructor (gimple_stmt
> orig[1] = NULL;
> conv_code = ERROR_MARK;
> maybe_ident = true;
> + tree one_constant = NULL_TREE;
> + auto_vec<tree> constants;
> + constants.safe_grow_cleared (nelts);
> FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
> {
> tree ref, op1;
> @@ -2034,68 +2075,55 @@ simplify_vector_constructor (gimple_stmt
> if (i >= nelts)
> return false;
>
> - if (TREE_CODE (elt->value) != SSA_NAME)
> - return false;
> - def_stmt = get_prop_source_stmt (elt->value, false, NULL);
> - if (!def_stmt)
> - return false;
> - code = gimple_assign_rhs_code (def_stmt);
> - if (code == FLOAT_EXPR
> - || code == FIX_TRUNC_EXPR)
> + op1 = get_bit_field_ref_def (elt->value, conv_code);
> + if (op1)
> {
> - op1 = gimple_assign_rhs1 (def_stmt);
> - if (conv_code == ERROR_MARK)
> + ref = TREE_OPERAND (op1, 0);
> + unsigned int j;
> + for (j = 0; j < 2; ++j)
> {
> - if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (elt->value))),
> - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
> - return false;
> - conv_code = code;
> + if (!orig[j])
> + {
> + if (TREE_CODE (ref) != SSA_NAME)
> + return false;
> + if (! VECTOR_TYPE_P (TREE_TYPE (ref))
> + || ! useless_type_conversion_p (TREE_TYPE (op1),
> + TREE_TYPE (TREE_TYPE (ref))))
> + return false;
> + if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
> + TREE_TYPE (ref)))
> + return false;
> + orig[j] = ref;
> + break;
> + }
> + else if (ref == orig[j])
> + break;
> }
> - else if (conv_code != code)
> + if (j == 2)
> return false;
> - if (TREE_CODE (op1) != SSA_NAME)
> - return false;
> - def_stmt = SSA_NAME_DEF_STMT (op1);
> - if (! is_gimple_assign (def_stmt))
> +
> + unsigned int elt;
> + if (maybe_ne (bit_field_size (op1), elem_size)
> + || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
> return false;
> - code = gimple_assign_rhs_code (def_stmt);
> + if (j)
> + elt += nelts;
> + if (elt != i)
> + maybe_ident = false;
> + sel.quick_push (elt);
> }
> - if (code != BIT_FIELD_REF)
> - return false;
> - op1 = gimple_assign_rhs1 (def_stmt);
> - ref = TREE_OPERAND (op1, 0);
> - unsigned int j;
> - for (j = 0; j < 2; ++j)
> + else if (CONSTANT_CLASS_P (elt->value))
> {
> - if (!orig[j])
> - {
> - if (TREE_CODE (ref) != SSA_NAME)
> - return false;
> - if (! VECTOR_TYPE_P (TREE_TYPE (ref))
> - || ! useless_type_conversion_p (TREE_TYPE (op1),
> - TREE_TYPE (TREE_TYPE (ref))))
> - return false;
> - if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
> - TREE_TYPE (ref)))
> - return false;
> - orig[j] = ref;
> - break;
> - }
> - else if (ref == orig[j])
> - break;
Missing else
return false;
[hjl@gnu-cfl-1 pr88828]$ cat x5.i
typedef float __v4sf __attribute__ ((__vector_size__ (16)));
__v4sf
foo (__v4sf x, float f, float z)
{
__v4sf y = { f, x[0], z, x[3] };
return y;
}
[hjl@gnu-cfl-1 pr88828]$ make x5.s
/export/build/gnu/tools-build/gcc-wip-debug/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/tools-build/gcc-wip-debug/build-x86_64-linux/gcc/
-O2 -S x5.i
during GIMPLE pass: forwprop
x5.i: In function ‘foo’:
x5.i:8:1: internal compiler error: in elt, at vector-builder.h:202
8 | }
| ^
0xe3fb73 vector_builder<poly_int<1u, long>,
int_vector_builder<poly_int<1u, long> > >::elt(unsigned int) const
/export/gnu/import/git/gitlab/x86-gcc/gcc/vector-builder.h:202
0x17b5665 vec_perm_indices::new_vector(int_vector_builder<poly_int<1u,
long> > const&, unsigned int, poly_int<1u, unsigned long>)
/export/gnu/import/git/gitlab/x86-gcc/gcc/vec-perm-indices.c:65
0xe3f93b vec_perm_indices::vec_perm_indices(int_vector_builder<poly_int<1u,
long> > const&, unsigned int, poly_int<1u, unsigned long>)
/export/gnu/import/git/gitlab/x86-gcc/gcc/vec-perm-indices.h:112
0x14e5fef simplify_vector_constructor
/export/gnu/import/git/gitlab/x86-gcc/gcc/tree-ssa-forwprop.c:2155
0x14e8676 execute
/export/gnu/import/git/gitlab/x86-gcc/gcc/tree-ssa-forwprop.c:2693
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://gcc.gnu.org/bugs/> for instructions.
make: *** [Makefile:19: x5.s] Error 1
[hjl@gnu-cfl-1 pr88828]$
This comes from my PR 88828 tests.
> + if (orig[1]
> + && orig[1] != error_mark_node)
> + return false;
> + orig[1] = error_mark_node;
> + if (!one_constant)
> + one_constant = elt->value;
> + constants[i] = elt->value;
> + sel.quick_push (i + nelts);
> + maybe_ident = false;
> }
> - if (j == 2)
> - return false;
> -
> - unsigned int elt;
> - if (maybe_ne (bit_field_size (op1), elem_size)
> - || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
> - return false;
> - if (j)
> - elt += nelts;
> - if (elt != i)
> - maybe_ident = false;
> - sel.quick_push (elt);
> }
> if (i < nelts)
> return false;
> @@ -2138,9 +2166,29 @@ simplify_vector_constructor (gimple_stmt
> op2 = vec_perm_indices_to_tree (mask_type, indices);
> if (!orig[1])
> orig[1] = orig[0];
> + if (orig[1] == error_mark_node)
> + {
> + tree_vector_builder vec (type, nelts, 1);
> + for (unsigned i = 0; i < nelts; ++i)
> + if (constants[i])
> + vec.quick_push (constants[i]);
> + else
> + /* ??? Push a don't-care value. */
> + vec.quick_push (one_constant);
> + orig[1] = vec.build ();
> + }
> if (conv_code == ERROR_MARK)
> gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0],
> orig[1], op2);
> + else if (TREE_CODE (orig[1]) == VECTOR_CST)
> + {
> + gimple *conv
> + = gimple_build_assign (make_ssa_name (type), conv_code, orig[0]);
> + orig[0] = gimple_assign_lhs (conv);
> + gsi_insert_before (gsi, conv, GSI_SAME_STMT);
> + gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR,
> + orig[0], orig[1], op2);
> + }
> else
> {
> gimple *perm
Here is the updated patch.
--
H.J.
[-- Attachment #2: 0001-Prep-for-PR88828-fix.patch --]
[-- Type: text/x-patch, Size: 8019 bytes --]
From 3d306956a4de03cf725448101ba5d4bd438cd441 Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Fri, 3 May 2019 08:22:12 -0700
Subject: [PATCH] Prep for PR88828 fix
The following refactors simplify_vector_constructor and adds
handling of constants to it in a straight-forward way.
A followup will handle the testcases posted in HJs patch.
Bootstrap / regtest running on x86_64-unknown-linux-gnu.
2019-05-03 Richard Biener <rguenther@suse.de>
PR tree-optimization/88828
* tree-ssa-forwprop.c (get_bit_field_ref_def): Split out from...
(simplify_vector_constructor): ...here. Handle constants in
the constructor.
* gcc.target/i386/pr88828-0.c: New testcase.
---
gcc/testsuite/gcc.target/i386/pr88828-0.c | 27 ++++
gcc/tree-ssa-forwprop.c | 159 ++++++++++++++--------
2 files changed, 131 insertions(+), 55 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr88828-0.c
diff --git a/gcc/testsuite/gcc.target/i386/pr88828-0.c b/gcc/testsuite/gcc.target/i386/pr88828-0.c
new file mode 100644
index 00000000000..3ddb2d13526
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr88828-0.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse4.2" } */
+
+typedef int v4si __attribute__((vector_size(16)));
+typedef float v4sf __attribute__((vector_size(16)));
+
+v4si foo (v4si x)
+{
+ return (v4si){ x[0], 1, x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si bar (v4sf x)
+{
+ return (v4si){ 1, x[1], x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "cvttps2dq" } } */
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si baz (v4si x)
+{
+ return (v4si) { x[1], x[2], x[3], 0 };
+}
+
+/* { dg-final { scan-assembler "psrldq" } } */
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 1553c9e70ac..7dd1e64335a 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -1997,17 +1997,54 @@ simplify_permutation (gimple_stmt_iterator *gsi)
return 0;
}
+/* Get the BIT_FIELD_REF definition of VAL, if any, looking through
+ conversions with code CONV_CODE or update it if still ERROR_MARK.
+ Return NULL_TREE if no such matching def was found. */
+
+static tree
+get_bit_field_ref_def (tree val, enum tree_code &conv_code)
+{
+ if (TREE_CODE (val) != SSA_NAME)
+ return NULL_TREE ;
+ gimple *def_stmt = get_prop_source_stmt (val, false, NULL);
+ if (!def_stmt)
+ return NULL_TREE;
+ enum tree_code code = gimple_assign_rhs_code (def_stmt);
+ if (code == FLOAT_EXPR
+ || code == FIX_TRUNC_EXPR)
+ {
+ tree op1 = gimple_assign_rhs1 (def_stmt);
+ if (conv_code == ERROR_MARK)
+ {
+ if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (val))),
+ GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
+ return NULL_TREE;
+ conv_code = code;
+ }
+ else if (conv_code != code)
+ return NULL_TREE;
+ if (TREE_CODE (op1) != SSA_NAME)
+ return NULL_TREE;
+ def_stmt = SSA_NAME_DEF_STMT (op1);
+ if (! is_gimple_assign (def_stmt))
+ return NULL_TREE;
+ code = gimple_assign_rhs_code (def_stmt);
+ }
+ if (code != BIT_FIELD_REF)
+ return NULL_TREE;
+ return gimple_assign_rhs1 (def_stmt);
+}
+
/* Recognize a VEC_PERM_EXPR. Returns true if there were any changes. */
static bool
simplify_vector_constructor (gimple_stmt_iterator *gsi)
{
gimple *stmt = gsi_stmt (*gsi);
- gimple *def_stmt;
tree op, op2, orig[2], type, elem_type;
unsigned elem_size, i;
unsigned HOST_WIDE_INT nelts;
- enum tree_code code, conv_code;
+ enum tree_code conv_code;
constructor_elt *elt;
bool maybe_ident;
@@ -2027,6 +2064,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
orig[1] = NULL;
conv_code = ERROR_MARK;
maybe_ident = true;
+ tree one_constant = NULL_TREE;
+ auto_vec<tree> constants;
+ constants.safe_grow_cleared (nelts);
FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
{
tree ref, op1;
@@ -2034,68 +2074,57 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
if (i >= nelts)
return false;
- if (TREE_CODE (elt->value) != SSA_NAME)
- return false;
- def_stmt = get_prop_source_stmt (elt->value, false, NULL);
- if (!def_stmt)
- return false;
- code = gimple_assign_rhs_code (def_stmt);
- if (code == FLOAT_EXPR
- || code == FIX_TRUNC_EXPR)
+ op1 = get_bit_field_ref_def (elt->value, conv_code);
+ if (op1)
{
- op1 = gimple_assign_rhs1 (def_stmt);
- if (conv_code == ERROR_MARK)
+ ref = TREE_OPERAND (op1, 0);
+ unsigned int j;
+ for (j = 0; j < 2; ++j)
{
- if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (elt->value))),
- GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
- return false;
- conv_code = code;
+ if (!orig[j])
+ {
+ if (TREE_CODE (ref) != SSA_NAME)
+ return false;
+ if (! VECTOR_TYPE_P (TREE_TYPE (ref))
+ || ! useless_type_conversion_p (TREE_TYPE (op1),
+ TREE_TYPE (TREE_TYPE (ref))))
+ return false;
+ if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
+ TREE_TYPE (ref)))
+ return false;
+ orig[j] = ref;
+ break;
+ }
+ else if (ref == orig[j])
+ break;
}
- else if (conv_code != code)
- return false;
- if (TREE_CODE (op1) != SSA_NAME)
+ if (j == 2)
return false;
- def_stmt = SSA_NAME_DEF_STMT (op1);
- if (! is_gimple_assign (def_stmt))
+
+ unsigned int elt;
+ if (maybe_ne (bit_field_size (op1), elem_size)
+ || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
return false;
- code = gimple_assign_rhs_code (def_stmt);
+ if (j)
+ elt += nelts;
+ if (elt != i)
+ maybe_ident = false;
+ sel.quick_push (elt);
}
- if (code != BIT_FIELD_REF)
- return false;
- op1 = gimple_assign_rhs1 (def_stmt);
- ref = TREE_OPERAND (op1, 0);
- unsigned int j;
- for (j = 0; j < 2; ++j)
+ else if (CONSTANT_CLASS_P (elt->value))
{
- if (!orig[j])
- {
- if (TREE_CODE (ref) != SSA_NAME)
- return false;
- if (! VECTOR_TYPE_P (TREE_TYPE (ref))
- || ! useless_type_conversion_p (TREE_TYPE (op1),
- TREE_TYPE (TREE_TYPE (ref))))
- return false;
- if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
- TREE_TYPE (ref)))
- return false;
- orig[j] = ref;
- break;
- }
- else if (ref == orig[j])
- break;
+ if (orig[1]
+ && orig[1] != error_mark_node)
+ return false;
+ orig[1] = error_mark_node;
+ if (!one_constant)
+ one_constant = elt->value;
+ constants[i] = elt->value;
+ sel.quick_push (i + nelts);
+ maybe_ident = false;
}
- if (j == 2)
- return false;
-
- unsigned int elt;
- if (maybe_ne (bit_field_size (op1), elem_size)
- || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
+ else
return false;
- if (j)
- elt += nelts;
- if (elt != i)
- maybe_ident = false;
- sel.quick_push (elt);
}
if (i < nelts)
return false;
@@ -2138,9 +2167,29 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
op2 = vec_perm_indices_to_tree (mask_type, indices);
if (!orig[1])
orig[1] = orig[0];
+ if (orig[1] == error_mark_node)
+ {
+ tree_vector_builder vec (type, nelts, 1);
+ for (unsigned i = 0; i < nelts; ++i)
+ if (constants[i])
+ vec.quick_push (constants[i]);
+ else
+ /* ??? Push a don't-care value. */
+ vec.quick_push (one_constant);
+ orig[1] = vec.build ();
+ }
if (conv_code == ERROR_MARK)
gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0],
orig[1], op2);
+ else if (TREE_CODE (orig[1]) == VECTOR_CST)
+ {
+ gimple *conv
+ = gimple_build_assign (make_ssa_name (type), conv_code, orig[0]);
+ orig[0] = gimple_assign_lhs (conv);
+ gsi_insert_before (gsi, conv, GSI_SAME_STMT);
+ gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR,
+ orig[0], orig[1], op2);
+ }
else
{
gimple *perm
--
2.20.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Prep for PR88828 fix
2019-05-03 16:48 ` H.J. Lu
@ 2019-05-06 12:42 ` Richard Biener
2019-05-06 19:16 ` Bernhard Reutner-Fischer
1 sibling, 0 replies; 4+ messages in thread
From: Richard Biener @ 2019-05-06 12:42 UTC (permalink / raw)
To: H.J. Lu; +Cc: GCC Patches
On Fri, 3 May 2019, H.J. Lu wrote:
> On Fri, May 3, 2019 at 6:02 AM Richard Biener <rguenther@suse.de> wrote:
> >
> >
> > The following refactors simplify_vector_constructor and adds
> > handling of constants to it in a straight-forward way.
> >
> > A followup will handle the testcases posted in HJs patch.
...
> > - orig[j] = ref;
> > - break;
> > - }
> > - else if (ref == orig[j])
> > - break;
>
> Missing else
> return false;
Oops, indeed.
The following is what I have applied after bootstrap/regtest on
x86_64-unknown-linux-gnu.
Richard.
2019-05-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/88828
* tree-ssa-forwprop.c (get_bit_field_ref_def): Split out from...
(simplify_vector_constructor): ...here. Handle constants in
the constructor.
* gcc.target/i386/pr88828-0.c: New testcase.
Index: gcc/tree-ssa-forwprop.c
===================================================================
--- gcc/tree-ssa-forwprop.c (revision 270902)
+++ gcc/tree-ssa-forwprop.c (working copy)
@@ -1997,17 +1997,54 @@ simplify_permutation (gimple_stmt_iterat
return 0;
}
+/* Get the BIT_FIELD_REF definition of VAL, if any, looking through
+ conversions with code CONV_CODE or update it if still ERROR_MARK.
+ Return NULL_TREE if no such matching def was found. */
+
+static tree
+get_bit_field_ref_def (tree val, enum tree_code &conv_code)
+{
+ if (TREE_CODE (val) != SSA_NAME)
+ return NULL_TREE ;
+ gimple *def_stmt = get_prop_source_stmt (val, false, NULL);
+ if (!def_stmt)
+ return NULL_TREE;
+ enum tree_code code = gimple_assign_rhs_code (def_stmt);
+ if (code == FLOAT_EXPR
+ || code == FIX_TRUNC_EXPR)
+ {
+ tree op1 = gimple_assign_rhs1 (def_stmt);
+ if (conv_code == ERROR_MARK)
+ {
+ if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (val))),
+ GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
+ return NULL_TREE;
+ conv_code = code;
+ }
+ else if (conv_code != code)
+ return NULL_TREE;
+ if (TREE_CODE (op1) != SSA_NAME)
+ return NULL_TREE;
+ def_stmt = SSA_NAME_DEF_STMT (op1);
+ if (! is_gimple_assign (def_stmt))
+ return NULL_TREE;
+ code = gimple_assign_rhs_code (def_stmt);
+ }
+ if (code != BIT_FIELD_REF)
+ return NULL_TREE;
+ return gimple_assign_rhs1 (def_stmt);
+}
+
/* Recognize a VEC_PERM_EXPR. Returns true if there were any changes. */
static bool
simplify_vector_constructor (gimple_stmt_iterator *gsi)
{
gimple *stmt = gsi_stmt (*gsi);
- gimple *def_stmt;
tree op, op2, orig[2], type, elem_type;
unsigned elem_size, i;
unsigned HOST_WIDE_INT nelts;
- enum tree_code code, conv_code;
+ enum tree_code conv_code;
constructor_elt *elt;
bool maybe_ident;
@@ -2027,6 +2064,9 @@ simplify_vector_constructor (gimple_stmt
orig[1] = NULL;
conv_code = ERROR_MARK;
maybe_ident = true;
+ tree one_constant = NULL_TREE;
+ auto_vec<tree> constants;
+ constants.safe_grow_cleared (nelts);
FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
{
tree ref, op1;
@@ -2034,68 +2074,57 @@ simplify_vector_constructor (gimple_stmt
if (i >= nelts)
return false;
- if (TREE_CODE (elt->value) != SSA_NAME)
- return false;
- def_stmt = get_prop_source_stmt (elt->value, false, NULL);
- if (!def_stmt)
- return false;
- code = gimple_assign_rhs_code (def_stmt);
- if (code == FLOAT_EXPR
- || code == FIX_TRUNC_EXPR)
+ op1 = get_bit_field_ref_def (elt->value, conv_code);
+ if (op1)
{
- op1 = gimple_assign_rhs1 (def_stmt);
- if (conv_code == ERROR_MARK)
+ ref = TREE_OPERAND (op1, 0);
+ unsigned int j;
+ for (j = 0; j < 2; ++j)
{
- if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (elt->value))),
- GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
- return false;
- conv_code = code;
+ if (!orig[j])
+ {
+ if (TREE_CODE (ref) != SSA_NAME)
+ return false;
+ if (! VECTOR_TYPE_P (TREE_TYPE (ref))
+ || ! useless_type_conversion_p (TREE_TYPE (op1),
+ TREE_TYPE (TREE_TYPE (ref))))
+ return false;
+ if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
+ TREE_TYPE (ref)))
+ return false;
+ orig[j] = ref;
+ break;
+ }
+ else if (ref == orig[j])
+ break;
}
- else if (conv_code != code)
+ if (j == 2)
return false;
- if (TREE_CODE (op1) != SSA_NAME)
- return false;
- def_stmt = SSA_NAME_DEF_STMT (op1);
- if (! is_gimple_assign (def_stmt))
+
+ unsigned int elt;
+ if (maybe_ne (bit_field_size (op1), elem_size)
+ || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
return false;
- code = gimple_assign_rhs_code (def_stmt);
+ if (j)
+ elt += nelts;
+ if (elt != i)
+ maybe_ident = false;
+ sel.quick_push (elt);
}
- if (code != BIT_FIELD_REF)
- return false;
- op1 = gimple_assign_rhs1 (def_stmt);
- ref = TREE_OPERAND (op1, 0);
- unsigned int j;
- for (j = 0; j < 2; ++j)
+ else if (CONSTANT_CLASS_P (elt->value))
{
- if (!orig[j])
- {
- if (TREE_CODE (ref) != SSA_NAME)
- return false;
- if (! VECTOR_TYPE_P (TREE_TYPE (ref))
- || ! useless_type_conversion_p (TREE_TYPE (op1),
- TREE_TYPE (TREE_TYPE (ref))))
- return false;
- if (j && !useless_type_conversion_p (TREE_TYPE (orig[0]),
- TREE_TYPE (ref)))
- return false;
- orig[j] = ref;
- break;
- }
- else if (ref == orig[j])
- break;
+ if (orig[1]
+ && orig[1] != error_mark_node)
+ return false;
+ orig[1] = error_mark_node;
+ if (!one_constant)
+ one_constant = elt->value;
+ constants[i] = elt->value;
+ sel.quick_push (i + nelts);
+ maybe_ident = false;
}
- if (j == 2)
- return false;
-
- unsigned int elt;
- if (maybe_ne (bit_field_size (op1), elem_size)
- || !constant_multiple_p (bit_field_offset (op1), elem_size, &elt))
+ else
return false;
- if (j)
- elt += nelts;
- if (elt != i)
- maybe_ident = false;
- sel.quick_push (elt);
}
if (i < nelts)
return false;
@@ -2138,9 +2167,29 @@ simplify_vector_constructor (gimple_stmt
op2 = vec_perm_indices_to_tree (mask_type, indices);
if (!orig[1])
orig[1] = orig[0];
+ if (orig[1] == error_mark_node)
+ {
+ tree_vector_builder vec (type, nelts, 1);
+ for (unsigned i = 0; i < nelts; ++i)
+ if (constants[i])
+ vec.quick_push (constants[i]);
+ else
+ /* ??? Push a don't-care value. */
+ vec.quick_push (one_constant);
+ orig[1] = vec.build ();
+ }
if (conv_code == ERROR_MARK)
gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0],
orig[1], op2);
+ else if (TREE_CODE (orig[1]) == VECTOR_CST)
+ {
+ gimple *conv
+ = gimple_build_assign (make_ssa_name (type), conv_code, orig[0]);
+ orig[0] = gimple_assign_lhs (conv);
+ gsi_insert_before (gsi, conv, GSI_SAME_STMT);
+ gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR,
+ orig[0], orig[1], op2);
+ }
else
{
gimple *perm
Index: gcc/testsuite/gcc.target/i386/pr88828-0.c
===================================================================
--- gcc/testsuite/gcc.target/i386/pr88828-0.c (nonexistent)
+++ gcc/testsuite/gcc.target/i386/pr88828-0.c (working copy)
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -msse4.2" } */
+
+typedef int v4si __attribute__((vector_size(16)));
+typedef float v4sf __attribute__((vector_size(16)));
+
+v4si foo (v4si x)
+{
+ return (v4si){ x[0], 1, x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si bar (v4sf x)
+{
+ return (v4si){ 1, x[1], x[2], 3 };
+}
+
+/* { dg-final { scan-assembler "cvttps2dq" } } */
+/* { dg-final { scan-assembler "pblendw" } } */
+
+v4si baz (v4si x)
+{
+ return (v4si) { x[1], x[2], x[3], 0 };
+}
+
+/* { dg-final { scan-assembler "psrldq" } } */
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] Prep for PR88828 fix
2019-05-03 16:48 ` H.J. Lu
2019-05-06 12:42 ` Richard Biener
@ 2019-05-06 19:16 ` Bernhard Reutner-Fischer
1 sibling, 0 replies; 4+ messages in thread
From: Bernhard Reutner-Fischer @ 2019-05-06 19:16 UTC (permalink / raw)
To: gcc-patches, H.J. Lu, Richard Biener; +Cc: GCC Patches
On 3 May 2019 18:48:09 CEST, "H.J. Lu" <hjl.tools@gmail.com> wrote:
>On Fri, May 3, 2019 at 6:02 AM Richard Biener <rguenther@suse.de>
>wrote:
>>
>>
>> The following refactors simplify_vector_constructor and adds
>> handling of constants to it in a straight-forward way.
>>
>> A followup will handle the testcases posted in HJs patch.
>>
>> Bootstrap / regtest running on x86_64-unknown-linux-gnu.
>>
>> Richard.
>>
>> 2019-05-03 Richard Biener <rguenther@suse.de>
>>
>> PR tree-optimization/88828
>> * tree-ssa-forwprop.c (get_bit_field_ref_def): Split out
>from...
>> (simplify_vector_constructor): ...here. Handle constants in
>> the constructor.
>>
>> * gcc.target/i386/pr88828-0.c: New testcase.
>>
>> Index: gcc/tree-ssa-forwprop.c
>> ===================================================================
>> --- gcc/tree-ssa-forwprop.c (revision 270847)
>> +++ gcc/tree-ssa-forwprop.c (working copy)
>> @@ -1997,6 +1997,44 @@ simplify_permutation (gimple_stmt_iterat
>> return 0;
>> }
>>
>> +/* Get the BIT_FIELD_REF definition of VAL, if any, looking through
>> + conversions with code CONV_CODE or update it if still ERROR_MARK.
>> + Return NULL_TREE if no such matching def was found. */
>> +
>> +static tree
>> +get_bit_field_ref_def (tree val, enum tree_code &conv_code)
Also:
/enum tree_code/s/enum //g
i think.
thanks,
>> +{
>> + if (TREE_CODE (val) != SSA_NAME)
>> + return NULL_TREE ;
>> + gimple *def_stmt = get_prop_source_stmt (val, false, NULL);
>> + if (!def_stmt)
>> + return NULL_TREE;
>> + enum tree_code code = gimple_assign_rhs_code (def_stmt);
>> + if (code == FLOAT_EXPR
>> + || code == FIX_TRUNC_EXPR)
>> + {
>> + tree op1 = gimple_assign_rhs1 (def_stmt);
>> + if (conv_code == ERROR_MARK)
>> + {
>> + if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (val))),
>> + GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (op1)))))
>> + return NULL_TREE;
>> + conv_code = code;
>> + }
>> + else if (conv_code != code)
>> + return NULL_TREE;
>> + if (TREE_CODE (op1) != SSA_NAME)
>> + return NULL_TREE;
>> + def_stmt = SSA_NAME_DEF_STMT (op1);
>> + if (! is_gimple_assign (def_stmt))
>> + return NULL_TREE;
>> + code = gimple_assign_rhs_code (def_stmt);
>> + }
>> + if (code != BIT_FIELD_REF)
>> + return NULL_TREE;
>> + return gimple_assign_rhs1 (def_stmt);
>> +}
>> +
>> /* Recognize a VEC_PERM_EXPR. Returns true if there were any
>changes. */
>>
>> static bool
>> @@ -2027,6 +2065,9 @@ simplify_vector_constructor (gimple_stmt
>> orig[1] = NULL;
>> conv_code = ERROR_MARK;
>> maybe_ident = true;
>> + tree one_constant = NULL_TREE;
>> + auto_vec<tree> constants;
>> + constants.safe_grow_cleared (nelts);
>> FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (op), i, elt)
>> {
>> tree ref, op1;
>> @@ -2034,68 +2075,55 @@ simplify_vector_constructor (gimple_stmt
>> if (i >= nelts)
>> return false;
>>
>> - if (TREE_CODE (elt->value) != SSA_NAME)
>> - return false;
>> - def_stmt = get_prop_source_stmt (elt->value, false, NULL);
>> - if (!def_stmt)
>> - return false;
>> - code = gimple_assign_rhs_code (def_stmt);
>> - if (code == FLOAT_EXPR
>> - || code == FIX_TRUNC_EXPR)
>> + op1 = get_bit_field_ref_def (elt->value, conv_code);
>> + if (op1)
>> {
>> - op1 = gimple_assign_rhs1 (def_stmt);
>> - if (conv_code == ERROR_MARK)
>> + ref = TREE_OPERAND (op1, 0);
>> + unsigned int j;
>> + for (j = 0; j < 2; ++j)
>> {
>> - if (maybe_ne (GET_MODE_SIZE (TYPE_MODE (TREE_TYPE
>(elt->value))),
>> - GET_MODE_SIZE (TYPE_MODE (TREE_TYPE
>(op1)))))
>> - return false;
>> - conv_code = code;
>> + if (!orig[j])
>> + {
>> + if (TREE_CODE (ref) != SSA_NAME)
>> + return false;
>> + if (! VECTOR_TYPE_P (TREE_TYPE (ref))
>> + || ! useless_type_conversion_p (TREE_TYPE
>(op1),
>> + TREE_TYPE
>(TREE_TYPE (ref))))
>> + return false;
>> + if (j && !useless_type_conversion_p (TREE_TYPE
>(orig[0]),
>> + TREE_TYPE
>(ref)))
>> + return false;
>> + orig[j] = ref;
>> + break;
>> + }
>> + else if (ref == orig[j])
>> + break;
>> }
>> - else if (conv_code != code)
>> + if (j == 2)
>> return false;
>> - if (TREE_CODE (op1) != SSA_NAME)
>> - return false;
>> - def_stmt = SSA_NAME_DEF_STMT (op1);
>> - if (! is_gimple_assign (def_stmt))
>> +
>> + unsigned int elt;
>> + if (maybe_ne (bit_field_size (op1), elem_size)
>> + || !constant_multiple_p (bit_field_offset (op1),
>elem_size, &elt))
>> return false;
>> - code = gimple_assign_rhs_code (def_stmt);
>> + if (j)
>> + elt += nelts;
>> + if (elt != i)
>> + maybe_ident = false;
>> + sel.quick_push (elt);
>> }
>> - if (code != BIT_FIELD_REF)
>> - return false;
>> - op1 = gimple_assign_rhs1 (def_stmt);
>> - ref = TREE_OPERAND (op1, 0);
>> - unsigned int j;
>> - for (j = 0; j < 2; ++j)
>> + else if (CONSTANT_CLASS_P (elt->value))
>> {
>> - if (!orig[j])
>> - {
>> - if (TREE_CODE (ref) != SSA_NAME)
>> - return false;
>> - if (! VECTOR_TYPE_P (TREE_TYPE (ref))
>> - || ! useless_type_conversion_p (TREE_TYPE (op1),
>> - TREE_TYPE
>(TREE_TYPE (ref))))
>> - return false;
>> - if (j && !useless_type_conversion_p (TREE_TYPE
>(orig[0]),
>> - TREE_TYPE (ref)))
>> - return false;
>> - orig[j] = ref;
>> - break;
>> - }
>> - else if (ref == orig[j])
>> - break;
>
>Missing else
> return false;
>
>[hjl@gnu-cfl-1 pr88828]$ cat x5.i
>typedef float __v4sf __attribute__ ((__vector_size__ (16)));
>
>__v4sf
>foo (__v4sf x, float f, float z)
>{
> __v4sf y = { f, x[0], z, x[3] };
> return y;
>}
>[hjl@gnu-cfl-1 pr88828]$ make x5.s
>/export/build/gnu/tools-build/gcc-wip-debug/build-x86_64-linux/gcc/xgcc
>-B/export/build/gnu/tools-build/gcc-wip-debug/build-x86_64-linux/gcc/
>-O2 -S x5.i
>during GIMPLE pass: forwprop
>x5.i: In function ‘foo’:
>x5.i:8:1: internal compiler error: in elt, at vector-builder.h:202
> 8 | }
> | ^
>0xe3fb73 vector_builder<poly_int<1u, long>,
>int_vector_builder<poly_int<1u, long> > >::elt(unsigned int) const
>/export/gnu/import/git/gitlab/x86-gcc/gcc/vector-builder.h:202
>0x17b5665 vec_perm_indices::new_vector(int_vector_builder<poly_int<1u,
>long> > const&, unsigned int, poly_int<1u, unsigned long>)
>/export/gnu/import/git/gitlab/x86-gcc/gcc/vec-perm-indices.c:65
>0xe3f93b
>vec_perm_indices::vec_perm_indices(int_vector_builder<poly_int<1u,
>long> > const&, unsigned int, poly_int<1u, unsigned long>)
>/export/gnu/import/git/gitlab/x86-gcc/gcc/vec-perm-indices.h:112
>0x14e5fef simplify_vector_constructor
>/export/gnu/import/git/gitlab/x86-gcc/gcc/tree-ssa-forwprop.c:2155
>0x14e8676 execute
>/export/gnu/import/git/gitlab/x86-gcc/gcc/tree-ssa-forwprop.c:2693
>Please submit a full bug report,
>with preprocessed source if appropriate.
>Please include the complete backtrace with any bug report.
>See <https://gcc.gnu.org/bugs/> for instructions.
>make: *** [Makefile:19: x5.s] Error 1
>[hjl@gnu-cfl-1 pr88828]$
>
>This comes from my PR 88828 tests.
>
>> + if (orig[1]
>> + && orig[1] != error_mark_node)
>> + return false;
>> + orig[1] = error_mark_node;
>> + if (!one_constant)
>> + one_constant = elt->value;
>> + constants[i] = elt->value;
>> + sel.quick_push (i + nelts);
>> + maybe_ident = false;
>> }
>> - if (j == 2)
>> - return false;
>> -
>> - unsigned int elt;
>> - if (maybe_ne (bit_field_size (op1), elem_size)
>> - || !constant_multiple_p (bit_field_offset (op1), elem_size,
>&elt))
>> - return false;
>> - if (j)
>> - elt += nelts;
>> - if (elt != i)
>> - maybe_ident = false;
>> - sel.quick_push (elt);
>> }
>> if (i < nelts)
>> return false;
>> @@ -2138,9 +2166,29 @@ simplify_vector_constructor (gimple_stmt
>> op2 = vec_perm_indices_to_tree (mask_type, indices);
>> if (!orig[1])
>> orig[1] = orig[0];
>> + if (orig[1] == error_mark_node)
>> + {
>> + tree_vector_builder vec (type, nelts, 1);
>> + for (unsigned i = 0; i < nelts; ++i)
>> + if (constants[i])
>> + vec.quick_push (constants[i]);
>> + else
>> + /* ??? Push a don't-care value. */
>> + vec.quick_push (one_constant);
>> + orig[1] = vec.build ();
>> + }
>> if (conv_code == ERROR_MARK)
>> gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR, orig[0],
>> orig[1], op2);
>> + else if (TREE_CODE (orig[1]) == VECTOR_CST)
>> + {
>> + gimple *conv
>> + = gimple_build_assign (make_ssa_name (type), conv_code,
>orig[0]);
>> + orig[0] = gimple_assign_lhs (conv);
>> + gsi_insert_before (gsi, conv, GSI_SAME_STMT);
>> + gimple_assign_set_rhs_with_ops (gsi, VEC_PERM_EXPR,
>> + orig[0], orig[1], op2);
>> + }
>> else
>> {
>> gimple *perm
>
>Here is the updated patch.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-05-06 19:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-03 13:02 [PATCH] Prep for PR88828 fix Richard Biener
2019-05-03 16:48 ` H.J. Lu
2019-05-06 12:42 ` Richard Biener
2019-05-06 19:16 ` Bernhard Reutner-Fischer
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).