This move this canonicalization from forwprop (forward_propagate_into_gimple_cond) to gimple-fold. This is a step in removing forward_propagate_into_gimple_cond from forwprop.
Bootstrapped and tested on x86_64-linux-gnu. gcc/ChangeLog: * gimple-fold.cc (replace_stmt_with_simplification): Canonicalize `_Bool == 0` and `_Bool != 1` into `_Bool != 0` with swapping the edges. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- gcc/gimple-fold.cc | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc index c3a9f6356d4..e6d1384c416 100644 --- a/gcc/gimple-fold.cc +++ b/gcc/gimple-fold.cc @@ -6079,7 +6079,24 @@ replace_stmt_with_simplification (gimple_stmt_iterator *gsi, { gcc_assert (res_op->code.is_tree_code ()); auto code = tree_code (res_op->code); - if (TREE_CODE_CLASS (code) == tcc_comparison + /* Canonicalize _Bool == 0 and _Bool != 1 to _Bool != 0 by swapping edges. */ + if ((TREE_CODE (TREE_TYPE (ops[0])) == BOOLEAN_TYPE + || (INTEGRAL_TYPE_P (TREE_TYPE (ops[0])) + && TYPE_PRECISION (TREE_TYPE (ops[0])) == 1)) + && ((code == EQ_EXPR + && integer_zerop (ops[1])) + || (code == NE_EXPR + && integer_onep (ops[1]))) + && gimple_bb (stmt)) + { + basic_block bb = gimple_bb (stmt); + gimple_cond_set_code (cond_stmt, NE_EXPR); + gimple_cond_set_lhs (cond_stmt, ops[0]); + gimple_cond_set_rhs (cond_stmt, build_zero_cst (TREE_TYPE (ops[0]))); + EDGE_SUCC (bb, 0)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE); + EDGE_SUCC (bb, 1)->flags ^= (EDGE_TRUE_VALUE|EDGE_FALSE_VALUE); + } + else if (TREE_CODE_CLASS (code) == tcc_comparison /* GIMPLE_CONDs condition may not throw. */ && (!flag_exceptions || !cfun->can_throw_non_call_exceptions -- 2.43.0