From: Andrew Pinski <apin...@marvell.com>

Since match and simplify does not have all of the inverted
comparison patterns, it make sense to just have
phi-opt try to do the inversion and try match and simplify again.

OK? Bootstrapped and tested on x86_64-linux-gnu.

Thanks,
Andrew Pinski

gcc/ChangeLog:

        * tree-ssa-phiopt.c (match_simplify_replacement):
        If "A ? B : C" fails to simplify, try "(!A) ? C : B".
---
 gcc/tree-ssa-phiopt.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index feb8ca8d0d1..3b3762a668b 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -879,7 +879,26 @@ match_simplify_replacement (basic_block cond_bb, 
basic_block middle_bb,
                            arg0, arg1,
                            &seq, NULL);
   if (!result)
-    return false;
+    {
+      /* Try !A ? arg1 : arg0 instead.
+        Not all match patterns support inverted comparisons.  */
+      enum tree_code comp_code = gimple_cond_code (stmt);
+      tree cmp0 = gimple_cond_lhs (stmt);
+      tree cmp1 = gimple_cond_rhs (stmt);
+      comp_code = invert_tree_comparison (comp_code, HONOR_NANS (cmp0));
+      if (comp_code != ERROR_MARK)
+       {
+         cond = build2_loc (gimple_location (stmt),
+                            comp_code, boolean_type_node,
+                            cmp0, cmp1);
+         result = gimple_simplify (COND_EXPR, type,
+                                   cond,
+                                   arg1, arg0,
+                                   &seq, NULL);
+       }
+      if (!result)
+       return false;
+    }
 
   gsi = gsi_last_bb (cond_bb);
   if (stmt_to_move)
-- 
2.27.0

Reply via email to