edges of COND. */
extract_true_false_args_from_phi (dom, stmt, &arg0, &arg1);
gcc_assert (arg0 && arg1);
- t = make_ssa_name (boolean_type_node);
- new_stmt = gimple_build_assign (t, gimple_cond_code (cond),
- gimple_cond_lhs (cond),
- gimple_cond_rhs (cond));
- gsi_insert_on_edge (loop_preheader_edge (level), new_stmt);
+ /* For `bool_val != 0`, reuse bool_val. */
+ if (gimple_cond_code (cond) == NE_EXPR
+ && integer_zerop (gimple_cond_rhs (cond))
+ && types_compatible_p (TREE_TYPE (gimple_cond_lhs (cond)),
+ boolean_type_node))
+ {
+ t = gimple_cond_lhs (cond);
+ }
+ else
+ {
+ t = make_ssa_name (boolean_type_node);
+ new_stmt = gimple_build_assign (t, gimple_cond_code (cond),
+ gimple_cond_lhs (cond),
+ gimple_cond_rhs (cond));
+ gsi_insert_on_edge (loop_preheader_edge (level), new_stmt);
+ }
new_stmt = gimple_build_assign (gimple_phi_result (stmt),
COND_EXPR, t, arg0, arg1);
todo |= TODO_cleanup_cfg;