This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi Richard, Thanks for the review. On 29 April 2016 at 20:47, Richard Biener <richard.guenther@gmail.com> wrote: > On Sun, Apr 17, 2016 at 1:14 AM, kugan > <kugan.vivekanandarajah@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. Please find a modified version which checks for two-valued variable and uses this to optimize. In the attached test case (in function bar), we end up doing the conversion twice. Bootstrapped and regression tested on x86_64-linux-gnu without no new regressions. Is this OK for trunk? Thanks, Kugan gcc/testsuite/ChangeLog: 2016-08-09 Kugan Vivekanandarajah <kuganv@linaro.org> PR tree-optimization/61839 * gcc.dg/tree-ssa/pr61839.c: New test. gcc/ChangeLog: 2016-08-09 Kugan Vivekanandarajah <kuganv@linaro.org> PR tree-optimization/61839 * tree-vrp.c (two_valued_val_range_p): New. (simplify_stmt_using_ranges): Convert CST BINOP VAR where VAR is two-valued to VAR == VAL1 ? (CST BINOP VAL1) : (CST BINOP VAL2).
Attachment:
p3.txt
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |