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