On Sun, Apr 17, 2016 at 1:14 AM, kugan <kugan.vivekanandara...@linaro.org> wrote: > 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.
You are missing a testcase. I think the transform can be generalized to any two-value value-range by instead of lhs = cond_res ? (cst binop 1) : (cst binop 0) emitting lhs = tmp == val1 ? (cst binop val1) : (cst binop val2); In the PR I asked the transform to be only carried out if cond_res and tmp have a single use (and thus they'd eventually vanish). I'm not sure if a general two-value "constant" propagation is profitable which is why I was originally asking for the pattern to only apply if the resulting value is used in a comparison which we could then in turn simplify by substituting COND_RES (or ! COND_RES) for it. For the general two-value case we'd substitute it with tmp [=!]= val[12] dependent on which constant is cheaper to test for. So I think this needs some exploring work on which way to go and which transform is profitable in the end. I think the general two-value case feeding a condition will be always profitable. Thanks, Richard. > Thanks, > Kugan > > gcc/ChangeLog: > > 2016-04-17 Kugan Vivekanandarajah <kug...@linaro.org> > Add PR tree-optimization/61839 > * tree-vrp.c (simplify_stmt_using_ranges): Convert CST BINOP > COND_EXPR to > COND_EXPR ? (CST BINOP 1) : (CST BINOP 0) when possible.