On Tue, Jan 13, 2026 at 11:25 AM Robin Dapp <[email protected]> wrote:
>
> Hi,
>
> This issue got raised after r16-6671 in which I removed checks for
> number-of-element equality.  In the splat case with conversion:
>
>   vector(16) int w;
>   vector(8) long int v;
>   _13 = BIT_FIELD_REF <w_12(D), 32, 160>;
>   _2 = (long int) _13;
>   _3 = (long int) _13;
>   ...
>   _9 = (long int) _13;
>   _1 = {_2, _3, _4, _5, _6, _7, _8, _9};
>
> right now we do
>   _16 = VEC_PERM_EXPR <w_12(D), w_12(D), { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
> 5, 5, 5, 5, 5 }>;
>   _17 = VIEW_CONVERT_EXPR<vector(8) intD.6>(_16);
>
> where the view convert is actually an optimized
>   _17 = BIT_FIELD_REF (_16, 512, 0);
>
> 512 is the size of the unconverted source but we should actually use the
> converted source type.  That's what this patch does.
>
> Bootstrapped and regtested on x86, power10, aarch64 still running.
> Regtested on riscv64.

OK.

> Regards
>  Robin
>
>         PR tree-optimization/123525
>
> gcc/ChangeLog:
>
>         * tree-ssa-forwprop.cc (simplify_vector_constructor): Use
>         converted source type for conversion bit field ref.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/vect/pr123525.c: New test.
>         * g++.dg/vect/pr123525-2.cc: New test.
> ---
>  gcc/testsuite/g++.dg/vect/pr123525-2.cc | 38 +++++++++++++++++++++++++
>  gcc/testsuite/gcc.dg/vect/pr123525.c    | 14 +++++++++
>  gcc/tree-ssa-forwprop.cc                |  5 +++-
>  3 files changed, 56 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/g++.dg/vect/pr123525-2.cc
>  create mode 100644 gcc/testsuite/gcc.dg/vect/pr123525.c
>
> diff --git a/gcc/testsuite/g++.dg/vect/pr123525-2.cc 
> b/gcc/testsuite/g++.dg/vect/pr123525-2.cc
> new file mode 100644
> index 00000000000..4dbe0f1218d
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/vect/pr123525-2.cc
> @@ -0,0 +1,38 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-march=tigerlake -std=c++23" { target { 
> x86_64-*-* i?86-*-* } } } */
> +/* { dg-additional-options "-std=c++23" } */
> +
> +short ScAddress_nTabP;
> +struct ScAddress {
> +  short nCol;
> +  short nTab;
> +  ScAddress(short nColP) : nCol(nColP), nTab(ScAddress_nTabP) {}
> +};
> +
> +struct ScRange {
> +  ScAddress aStart;
> +};
> +
> +struct CellRangeAddress {
> +  int StartColumn;
> +  int StartRow;
> +  int EndColumn;
> +  int EndRow;
> +};
> +
> +struct ScCellRangeObj {
> +  ScCellRangeObj(int, ScRange &);
> +};
> +
> +CellRangeAddress ScVbaRangeMergeArea_aCellAddress;
> +void ScVbaRangeMergeArea() {
> +  if (ScVbaRangeMergeArea_aCellAddress.StartColumn == 0 &&
> +      ScVbaRangeMergeArea_aCellAddress.EndColumn == 0 &&
> +      ScVbaRangeMergeArea_aCellAddress.StartRow == 0 &&
> +      ScVbaRangeMergeArea_aCellAddress.EndRow == 0)
> +    ;
> +  else {
> +    ScRange refRange(ScVbaRangeMergeArea_aCellAddress.StartColumn);
> +    ScCellRangeObj(0, refRange);
> +  }
> +}
> diff --git a/gcc/testsuite/gcc.dg/vect/pr123525.c 
> b/gcc/testsuite/gcc.dg/vect/pr123525.c
> new file mode 100644
> index 00000000000..e00f465e6d7
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/vect/pr123525.c
> @@ -0,0 +1,14 @@
> +/* { dg-do compile } */
> +/* { dg-additional-options "-mavx512f" { target { x86_64-*-* i?86-*-* } } } 
> */
> +/* { dg-additional-options "-Wno-psabi" } */
> +
> +typedef __attribute__((__vector_size__(64))) long V;
> +typedef __attribute__((__vector_size__(64))) int W;
> +
> +V v;
> +
> +V
> +foo(W w)
> +{
> +  return w[5] > v;
> +}
> diff --git a/gcc/tree-ssa-forwprop.cc b/gcc/tree-ssa-forwprop.cc
> index b70fe8169ad..bdc63a7a71b 100644
> --- a/gcc/tree-ssa-forwprop.cc
> +++ b/gcc/tree-ssa-forwprop.cc
> @@ -4260,7 +4260,10 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
>        if (nelts != refnelts)
>         res = gimple_build (&stmts, BIT_FIELD_REF,
>                             conv_code != ERROR_MARK ? conv_src_type : type,
> -                           res, TYPE_SIZE (type), bitsize_zero_node);
> +                           res,
> +                           TYPE_SIZE (conv_code != ERROR_MARK ? conv_src_type
> +                                                              : type),
> +                           bitsize_zero_node);
>        if (conv_code != ERROR_MARK)
>         res = gimple_build (&stmts, conv_code, type, res);
>        else if (!useless_type_conversion_p (type, TREE_TYPE (res)))
> --
> 2.52.0

Reply via email to