> Am 27.01.2024 um 09:16 schrieb Jakub Jelinek <ja...@redhat.com>:
>
> Hi!
>
> We generally allow merging mergeable stmts with some final cast (but not
> further casts or mergeable operations after the cast). As some casts
> are handled conditionally, if (idx < cst) handle_operand (idx); else if
> idx == cst) handle_operand (cst); else ..., we must sure that e.g. the
> mergeable PLUS_EXPR/MINUS_EXPR/NEGATE_EXPR never appear in handle_operand
> called from such casts, because it ICEs on invalid SSA_NAME form (that part
> could be fixable by adding further PHIs) but also because we'd need to
> correctly propagate the overflow flags from the if to else if.
> So, instead lower_mergeable_stmt handles an outermost widening cast (or
> widening cast feeding outermost store) specially.
> The problem was similar to PR113408, that VIEW_CONVERT_EXPR tree is
> present in the gimple_assign_rhs1 while it is not for NOP_EXPR/CONVERT_EXPR,
> so the checks whether the outermost cast should be handled didn't handle
> the VCE case and so handle_plus_minus was called from the conditional
> handle_cast.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
Ok
Richard
> 2024-01-27 Jakub Jelinek <ja...@redhat.com>
>
> PR tree-optimization/113568
> * gimple-lower-bitint.cc (bitint_large_huge::lower_mergeable_stmt):
> For VIEW_CONVERT_EXPR use first operand of rhs1 instead of rhs1
> in the widening extension checks.
>
> * gcc.dg/bitint-78.c: New test.
>
> --- gcc/gimple-lower-bitint.cc.jj 2024-01-26 17:40:29.083814064 +0100
> +++ gcc/gimple-lower-bitint.cc 2024-01-26 18:05:24.461891138 +0100
> @@ -2401,6 +2401,8 @@ bitint_large_huge::lower_mergeable_stmt
> rhs1 = gimple_assign_rhs1 (store_operand
> ? SSA_NAME_DEF_STMT (store_operand)
> : stmt);
> + if (TREE_CODE (rhs1) == VIEW_CONVERT_EXPR)
> + rhs1 = TREE_OPERAND (rhs1, 0);
> /* Optimize mergeable ops ending with widening cast to _BitInt
> (or followed by store). We can lower just the limbs of the
> cast operand and widen afterwards. */
> --- gcc/testsuite/gcc.dg/bitint-78.c.jj 2024-01-26 18:11:54.164435951 +0100
> +++ gcc/testsuite/gcc.dg/bitint-78.c 2024-01-26 18:11:33.642723218 +0100
> @@ -0,0 +1,21 @@
> +/* PR tree-optimization/113568 */
> +/* { dg-do compile { target bitint } } */
> +/* { dg-options "-O2 -std=c23" } */
> +
> +signed char c;
> +#if __BITINT_MAXWIDTH__ >= 464
> +_BitInt(464) g;
> +
> +void
> +foo (void)
> +{
> + _BitInt(464) a[2] = {};
> + _BitInt(464) b;
> + while (c)
> + {
> + b = g + 1;
> + g = a[0];
> + a[0] = b;
> + }
> +}
> +#endif
>
> Jakub
>