> Am 27.11.2025 um 04:58 schrieb Andrew Pinski <[email protected]>:
>
> This was noticed in PR122843 were sometimes reassociation
> would create the uncanonical order of operands. This fixes
> the problem by swapping the order as the rewrite happens.
>
> Wstringop-overflow.c needed to be xfailed since it started
> not to warn because well the warning is too dependent on
> the order of operands to MIN_EXPR. This testcase
> failed if we had supplied -fno-tree-reassoc before too;
> but nothing in the IR changes except the order of 2 operands
> of MIN_EXPR. I filed PR 122881 for this xfail.
>
> Bootstrapped and tested on x86_64-linux-gnu.
Ok
Richard
> gcc/ChangeLog:
>
> * tree-ssa-reassoc.cc (rewrite_expr_tree): Swap
> oe1 and oe2 if commutative code and not in
> canonical order.
>
> gcc/testsuite/ChangeLog:
>
> * c-c++-common/Wstringop-overflow.c: Xfail, PR 122881.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
> gcc/testsuite/c-c++-common/Wstringop-overflow.c | 4 ++--
> gcc/tree-ssa-reassoc.cc | 3 +++
> 2 files changed, 5 insertions(+), 2 deletions(-)
>
> diff --git a/gcc/testsuite/c-c++-common/Wstringop-overflow.c
> b/gcc/testsuite/c-c++-common/Wstringop-overflow.c
> index 5757a23141e..9829fe14116 100644
> --- a/gcc/testsuite/c-c++-common/Wstringop-overflow.c
> +++ b/gcc/testsuite/c-c++-common/Wstringop-overflow.c
> @@ -90,8 +90,8 @@ void test_strncat (char **d, const char* s, int i)
> }
>
> {
> - size_t n = i < strlen (s) ? i : strlen (s); /* { dg-message "length
> computed here" } */
> - T (d, s, n); /* { dg-message ".strncat\[^\n\r\]*
> specified bound depends on the length of the source argument" } */
> + size_t n = i < strlen (s) ? i : strlen (s); /* { dg-message "length
> computed here" "PR122881" { xfail *-*-* } } */
> + T (d, s, n); /* { dg-message ".strncat\[^\n\r\]*
> specified bound depends on the length of the source argument" "PR122881" {
> xfail *-*-* } } */
> }
> }
>
> diff --git a/gcc/tree-ssa-reassoc.cc b/gcc/tree-ssa-reassoc.cc
> index c140f76766e..6e220e02ecd 100644
> --- a/gcc/tree-ssa-reassoc.cc
> +++ b/gcc/tree-ssa-reassoc.cc
> @@ -5268,6 +5268,9 @@ rewrite_expr_tree (gimple *stmt, enum tree_code
> rhs_code, unsigned int opindex,
>
> oe1 = ops[opindex];
> oe2 = ops[opindex + 1];
> + if (commutative_tree_code (rhs_code)
> + && tree_swap_operands_p (oe1->op, oe2->op))
> + std::swap (oe1, oe2);
>
> if (rhs1 != oe1->op || rhs2 != oe2->op)
> {
> --
> 2.43.0
>