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 | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc index fb2d2c9fc1a..de1896aa91a 100644 --- a/gcc/tree-ssa-phiopt.cc +++ b/gcc/tree-ssa-phiopt.cc @@ -542,9 +542,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; -- 2.39.1