]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PHIOPT: Allow MIN/MAX to have up to 2 MIN/MAX expressions for early phiopt
authorAndrew Pinski <apinski@marvell.com>
Sat, 1 Apr 2023 04:59:11 +0000 (04:59 +0000)
committerAndrew Pinski <apinski@marvell.com>
Thu, 27 Apr 2023 15:00:25 +0000 (08:00 -0700)
In the early PHIOPT mode, the original minmax_replacement, would
replace a PHI node with up to 2 min/max expressions in some cases,
this allows for that too.

OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.

gcc/ChangeLog:

* tree-ssa-phiopt.cc (phiopt_early_allow): Allow for
up to 2 min/max expressions in the sequence/match code.

gcc/tree-ssa-phiopt.cc

index 5ab23b54ed6c6524784965abc18f7bd9dfd4b6d2..7fc6ac17b4ad7dca2140661a51ee07aab3f4c4fe 100644 (file)
@@ -533,9 +533,23 @@ phiopt_early_allow (gimple_seq &seq, gimple_match_op &op)
     return false;
   tree_code code = (tree_code)op.code;
 
-  /* For non-empty sequence, only allow one statement.  */
+  /* For non-empty sequence, only allow one statement
+     except for MIN/MAX, allow max 2 statements,
+     each with MIN/MAX.  */
   if (!gimple_seq_empty_p (seq))
     {
+      if (code == MIN_EXPR || code == MAX_EXPR)
+       {
+         if (!gimple_seq_singleton_p (seq))
+           return false;
+
+         gimple *stmt = gimple_seq_first_stmt (seq);
+         /* Only allow assignments.  */
+         if (!is_gimple_assign (stmt))
+           return false;
+         code = gimple_assign_rhs_code (stmt);
+         return code == MIN_EXPR || code == MAX_EXPR;
+       }
       /* Check to make sure op was already a SSA_NAME.  */
       if (code != SSA_NAME)
        return false;