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 <[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