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 <andrew.pinski@oss.qualcomm.com>
This commit is contained in:
Andrew Pinski
2025-11-26 13:55:41 -08:00
parent dfd17e05f9
commit a651bb3535
2 changed files with 5 additions and 2 deletions

View 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 *-*-* } } */
}
}

View 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)
{