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? 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