From: Andrew Pinski Date: Wed, 26 Nov 2025 21:55:41 +0000 (-0800) Subject: reassociation: Fix canonical ordering in some cases X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a651bb353554ecb79898d48dd077b7cd288467df;p=thirdparty%2Fgcc.git reassociation: Fix canonical ordering in some cases 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. 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 --- 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) {