On Mon, Jun 2, 2014 at 12:36 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Fri, May 30, 2014 at 10:48 AM, Eric Botcazou <ebotca...@adacore.com> wrote: >>> I'd say we still handle "basic" symbolic range ops in >>> extract_range_from_binary_1 >>> but in extract_range_from_binary_expr for a symbolic op0 we try to simplify >>> it with both [op1, op1] and with the value-range of op1 until we get a >>> non-varying range as result. Not sure if it's worth restricting that >>> to the case >>> where op0s value-range refers to op1 or vice versa, and eventually only >>> use op1 symbolically then. >> >> Patch along these lines attached. A bit heavy as expected, but it's VRP... >> It deals with my pet problem, you might want to check it does so with yours. >> >> Tested on x86_64-suse-linux with no regressions. > > Looks mostly ok. Any reason why you are not re-creating > MINUS_EXPR in build_symbolic_expr? That is, build > inv - t (for non-pointers, of course)? Otherwise if a range > becomes -t + inv that will no longer match get_single_symbol > for further propagation? > > Then I'm not sure if > > + /* Try with VR0 and [-INF, OP1]. */ > + set_value_range (&new_vr1, VR_RANGE, vrp_val_min (expr_type), op1, > NULL); > + extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &new_vr1); > + if (vr->type != VR_VARYING) > + return; > + > + /* Try with VR0 and [OP1, +INF]. */ > + set_value_range (&new_vr1, VR_RANGE, op1, vrp_val_max (expr_type), > NULL); > + extract_range_from_binary_expr_1 (vr, code, expr_type, &vr0, &new_vr1); > + if (vr->type != VR_VARYING) > + return; > > is a safe thing to do. If it does make a difference to try [-INF, OP1], > [OP1, +INF] instead of just [OP1, OP1] then at least it's very suspicious ;) > (or an "easy" missed optimization). > > So - can you fix the negate thing and drop the four cases trying > the +-INF based ranges?
Btw, the testcases are missing in the patch so I can't have a look myself. Richard. > Thanks, > Richard. > >> >> 2014-05-30 Eric Botcazou <ebotca...@adacore.com> >> >> * tree-vrp.c (get_single_symbol): New function. >> (build_symbolic_expr): Likewise. >> (symbolic_range_based_on_p): New predicate. >> (extract_range_from_binary_expr_1): Deal with single-symbolic ranges >> for PLUS and MINUS. Do not drop symbolic ranges at the end. >> (extract_range_from_binary_expr): Try harder for PLUS and MINUS if >> operand is symbolic and based on the other operand. >> >> >> 2014-05-30 Eric Botcazou <ebotca...@adacore.com> >> >> * gcc.dg/tree-ssa/vrp93.c: New test. >> * gnat.dg/opt38.adb: Likewise. >> >> >> -- >> Eric Botcazou