From a04d8591f266f810cf4681930772982444227b83 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Wed, 10 May 2006 10:22:39 +0000 Subject: [PATCH] re PR middle-end/27302 (Fold does not fold (i < j) == (j > i) to 1) 2006-05-10 Richard Guenther PR tree-optimization/27302 * fold-const.c (operand_equal_p): For two comparisons, try comparison of one comparison code swapped if that yields the same code. * gcc.dg/torture/pr27302.c: New testcase. From-SVN: r113670 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 16 ++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr27302.c | 15 +++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr27302.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6cd1fcc76f3..c52d9dd0db0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-05-10 Richard Guenther + + PR tree-optimization/27302 + * fold-const.c (operand_equal_p): For two comparisons, + try comparison of one comparison code swapped if that yields + the same code. + 2006-05-10 Ben Elliston * tree-pretty-print.c (pretty_print_string): No need to handle diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 26e53c0c32c..030bcb1c951 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -2489,6 +2489,22 @@ operand_equal_p (tree arg0, tree arg1, unsigned int flags) STRIP_NOPS (arg0); STRIP_NOPS (arg1); + /* In case both args are comparisons but with different comparison + code, try to swap the comparison operands of one arg to produce + a match and compare that variant. */ + if (TREE_CODE (arg0) != TREE_CODE (arg1) + && COMPARISON_CLASS_P (arg0) + && COMPARISON_CLASS_P (arg1)) + { + enum tree_code swap_code = swap_tree_comparison (TREE_CODE (arg1)); + + if (TREE_CODE (arg0) == swap_code) + return operand_equal_p (TREE_OPERAND (arg0, 0), + TREE_OPERAND (arg1, 1), flags) + && operand_equal_p (TREE_OPERAND (arg0, 1), + TREE_OPERAND (arg1, 0), flags); + } + if (TREE_CODE (arg0) != TREE_CODE (arg1) /* This is needed for conversions and for COMPONENT_REF. Might as well play it safe and always test this. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9eff9f48d40..7e7c9982e75 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-05-10 Richard Guenther + + PR tree-optimization/27302 + * gcc.dg/torture/pr27302.c: New testcase. + 2006-05-09 Dirk Mueller Richard Guenther diff --git a/gcc/testsuite/gcc.dg/torture/pr27302.c b/gcc/testsuite/gcc.dg/torture/pr27302.c new file mode 100644 index 00000000000..0e41fc385e0 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr27302.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ + +extern void link_error (void); + +void test0 (int a, int b) +{ + if ((a < b) != (b > a)) + link_error (); +} + +int main() +{ + test0 (1, 2); + return 0; +} -- 2.30.2