From: Andrew Pinski <apin...@marvell.com> This just adds a simplification to simplify_vector_constructor for vector of 1 element to be VCE which should reduce memory usage in the compiler and maybe allow for some more optimizations.
OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. PR tree-optimization/101540 gcc/ChangeLog: * tree-ssa-forwprop.c (simplify_vector_constructor): Simplify constructor of vector of 1 element to just be a VIEW_CONVERT_EXPR. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr101540-1.c: New test. --- gcc/testsuite/gcc.dg/tree-ssa/pr101540-1.c | 13 +++++++++++++ gcc/tree-ssa-forwprop.c | 13 +++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr101540-1.c diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr101540-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr101540-1.c new file mode 100644 index 00000000000..73fb342e029 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr101540-1.c @@ -0,0 +1,13 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-forwprop1" } */ +/* PR tree-optimization/101540 */ +typedef unsigned char __attribute__((__vector_size__ (1))) W; + +W foo (unsigned char uc) +{ + return (W){uc}; +} +/* The constructor in the above function should be converted into a VCE. */ +/* { dg-final { scan-tree-dump-times "VIEW_CONVERT_EXPR" 1 "forwprop1"} } */ +// {uc_1(D)} +/* { dg-final { scan-tree-dump-times "{uc_\[0-9\]+.D.}" 0 "forwprop1"} } */ diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index a830bab78ba..94b92d3d0af 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -2392,6 +2392,19 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi) elem_type = TREE_TYPE (type); elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type)); + /* Special case V1 constructor with the same type to being a VCE. */ + if (nelts == 1 && CONSTRUCTOR_NELTS (op) == 1) + { + tree op1 = CONSTRUCTOR_ELT (op, 0)->value; + if (useless_type_conversion_p (elem_type, TREE_TYPE (op1))) + { + op1 = build1 (VIEW_CONVERT_EXPR, type, op1); + gimple_assign_set_rhs_from_tree (gsi, op1); + update_stmt (gsi_stmt (*gsi)); + return true; + } + } + orig[0] = NULL; orig[1] = NULL; conv_code = ERROR_MARK; -- 2.17.1