As explained in PR61839, Following difference results in extra instructions: - c = b != 0 ? 486097858 : 972195717; + c = a + 972195718 >> (b != 0);
As suggested in PR, attached patch converts CST BINOP COND_EXPR to COND_EXPR ? (CST BINOP 1) : (CST BINOP 0).
Bootstrapped and regression tested for x86-64-linux-gnu with no new regression. Is this OK for statege-1.
Thanks, Kugan gcc/ChangeLog: 2016-04-17 Kugan Vivekanandarajah <kug...@linaro.org> * tree-vrp.c (simplify_stmt_using_ranges): Convert CST BINOP COND_EXPR to COND_EXPR ? (CST BINOP 1) : (CST BINOP 0) when possible.
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index bbdf9ce..caf7a2a 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -9902,6 +9902,49 @@ simplify_stmt_using_ranges (gimple_stmt_iterator *gsi) { enum tree_code rhs_code = gimple_assign_rhs_code (stmt); tree rhs1 = gimple_assign_rhs1 (stmt); + tree rhs2 = gimple_assign_rhs2 (stmt); + tree var; + + /* Convert: + COND_RES = X COMPARE Y + TMP = (CAST) COND_RES + LHS = CST BINOP TMP + + To: + LHS = COND_RES ? (CST BINOP 1) : (CST BINOP 0) */ + + if (TREE_CODE_CLASS (rhs_code) == tcc_binary + && TREE_CODE (rhs1) == INTEGER_CST + && TREE_CODE (rhs2) == SSA_NAME + && is_gimple_assign (SSA_NAME_DEF_STMT (rhs2)) + && gimple_assign_rhs_code (SSA_NAME_DEF_STMT (rhs2)) == NOP_EXPR + && (var = gimple_assign_rhs1 (SSA_NAME_DEF_STMT (rhs2))) + && TREE_CODE (var) == SSA_NAME + && is_gimple_assign (SSA_NAME_DEF_STMT (var)) + && TREE_CODE_CLASS (gimple_assign_rhs_code (SSA_NAME_DEF_STMT (var))) + == tcc_comparison) + + { + value_range *vr = get_value_range (var); + if (range_int_cst_p (vr) + && integer_zerop (vr->min) + && integer_onep (vr->max)) + { + + tree new_rhs1 = int_const_binop (rhs_code, rhs1, vr->max); + tree new_rhs2 = int_const_binop (rhs_code, rhs1, vr->min); + + if (new_rhs1 && new_rhs2) + { + gimple_assign_set_rhs_with_ops (gsi, + COND_EXPR, var, + new_rhs1, + new_rhs2); + update_stmt (gsi_stmt (*gsi)); + return true; + } + } + } switch (rhs_code) {