On Fri, Aug 19, 2016 at 10:17 AM, Kugan Vivekanandarajah <kugan.vivekanandara...@linaro.org> wrote: > Ping? > > https://gcc.gnu.org/ml/gcc-patches/2016-08/msg00987.html
Sorry for the delay. + /* ~[TYPE_MIN + 1, TYPE_MAX - 1] */ + if (vr->type == VR_ANTI_RANGE && INTEGRAL_TYPE_P (TREE_TYPE (var)) + && wi::sub (vr->min, wi::min_value (TREE_TYPE (var))) == 1 + && wi::sub (wi::max_value (TREE_TYPE (var)), vr->max) == 1) use vrp_val_min/max instead of wi::max/min_value + { + *a = vrp_val_min (TREE_TYPE (var)); + *b = vrp_val_max (TREE_TYPE (var)); Ok with that change. Thanks, Richard. > Thanks, > Kugan > > On 12 August 2016 at 13:19, kugan <kugan.vivekanandara...@linaro.org> wrote: >> Hi Richard, >> >> >> On 11/08/16 20:04, Richard Biener wrote: >>> >>> On Thu, Aug 11, 2016 at 6:11 AM, kugan >>> <kugan.vivekanandara...@linaro.org> wrote: >> >> >> [SNIP] >> >>> >>> +two_valued_val_range_p (tree var, tree *a, tree *b) >>> +{ >>> + value_range *vr = get_value_range (var); >>> + if ((vr->type != VR_RANGE >>> + && vr->type != VR_ANTI_RANGE) >>> + || !range_int_cst_p (vr)) >>> + return false; >>> >>> range_int_cst_p checks for vr->type == VR_RANGE so the anti-range handling >>> doesn't ever trigger - which means you should add a testcase for it as >>> well. >> >> >> Fixed it. I have also added a testcase. >> >>> >>> >>> + { >>> + *a = TYPE_MIN_VALUE (TREE_TYPE (var)); >>> + *b = TYPE_MAX_VALUE (TREE_TYPE (var)); >>> >>> note that for pointer types this doesn't work, please also use >>> vrp_val_min/max for >>> consistency. I think you want to add a INTEGRAL_TYPE_P (TREE_TYPE (var)) >>> to the guard of two_valued_val_range_p. >>> >>> + /* First canonicalize to simplify tests. */ >>> + if (commutative_tree_code (rhs_code) >>> + && TREE_CODE (rhs2) == INTEGER_CST) >>> + std::swap (rhs1, rhs2); >>> >>> note that this doesn't really address my comment - if you just want to >>> handle >>> commutative ops then simply look for the constant in the second place >>> rather >>> than the first which is the canonical operand order. But even for >>> non-commutative >>> operations we might want to apply this optimization - and then for both >>> cases, >>> rhs1 or rhs2 being constant. Like x / 5 and 5 / x. >>> >>> Note that you can rely on int_const_binop returning NULL_TREE for >>> "invalid" >>> ops like x % 0 or x / 0, so no need to explicitely guard this here. >> >> >> Sorry, I misunderstood you. I have changed it now. I also added test-case to >> check this. >> >> Bootstrapped and regression tested on x86_64-linux-gnu with no new >> regressions. Is this OK for trunk now? >> >> Thanks, >> Kugan >> >> gcc/testsuite/ChangeLog: >> >> 2016-08-12 Kugan Vivekanandarajah <kug...@linaro.org> >> >> PR tree-optimization/61839 >> * gcc.dg/tree-ssa/pr61839_1.c: New test. >> * gcc.dg/tree-ssa/pr61839_2.c: New test. >> * gcc.dg/tree-ssa/pr61839_3.c: New test. >> * gcc.dg/tree-ssa/pr61839_4.c: New test. >> >> gcc/ChangeLog: >> >> 2016-08-12 Kugan Vivekanandarajah <kug...@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). >> Also Convert VAR BINOP CST where VAR is two-valued to >> VAR == VAL1 ? (VAL1 BINOP CST) : (VAL2 BINOP CST).