]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
reassociation: Fix canonical ordering in some cases
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Wed, 26 Nov 2025 21:55:41 +0000 (13:55 -0800)
committerAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Thu, 27 Nov 2025 16:46:09 +0000 (08:46 -0800)
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 <andrew.pinski@oss.qualcomm.com>
gcc/testsuite/c-c++-common/Wstringop-overflow.c
gcc/tree-ssa-reassoc.cc

index 5757a23141ed96130cbd7ac825248192d8c90077..9829fe14116fc1340381a6c3f1f9236e303249af 100644 (file)
@@ -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 *-*-* } } */
   }
 }
 
index c140f76766eb0072e4468bf06bc23a2ea4fa4ebb..6e220e02ecd62d560a84019f4e63914517a3e54e 100644 (file)
@@ -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)
        {