This makes set_and_canonicalize_value_range more consistent. To be used in further patches.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2012-06-15 Richard Guenther <rguent...@suse.de> * tree-vrp.c (set_and_canonicalize_value_range): Use canonical predicates to set VR_UNDEFINED and VR_VARYING. Drop a case we assert for in set_value_range to VR_VARYING. Index: gcc/tree-vrp.c =================================================================== *** gcc/tree-vrp.c.orig 2012-06-15 13:50:01.929912328 +0200 --- gcc/tree-vrp.c 2012-06-15 13:50:30.354911342 +0200 *************** nonnull_arg_p (const_tree arg) *** 386,391 **** --- 386,403 ---- } + /* Set value range VR to VR_UNDEFINED. */ + + static inline void + set_value_range_to_undefined (value_range_t *vr) + { + vr->type = VR_UNDEFINED; + vr->min = vr->max = NULL_TREE; + if (vr->equiv) + bitmap_clear (vr->equiv); + } + + /* Set value range VR to VR_VARYING. */ static inline void *************** static void *** 463,472 **** set_and_canonicalize_value_range (value_range_t *vr, enum value_range_type t, tree min, tree max, bitmap equiv) { ! /* Nothing to canonicalize for symbolic or unknown or varying ranges. */ ! if ((t != VR_RANGE ! && t != VR_ANTI_RANGE) ! || TREE_CODE (min) != INTEGER_CST || TREE_CODE (max) != INTEGER_CST) { set_value_range (vr, t, min, max, equiv); --- 475,494 ---- set_and_canonicalize_value_range (value_range_t *vr, enum value_range_type t, tree min, tree max, bitmap equiv) { ! /* Use the canonical setters for VR_UNDEFINED and VR_VARYING. */ ! if (t == VR_UNDEFINED) ! { ! set_value_range_to_undefined (vr); ! return; ! } ! else if (t == VR_VARYING) ! { ! set_value_range_to_varying (vr); ! return; ! } ! ! /* Nothing to canonicalize for symbolic ranges. */ ! if (TREE_CODE (min) != INTEGER_CST || TREE_CODE (max) != INTEGER_CST) { set_value_range (vr, t, min, max, equiv); *************** set_and_canonicalize_value_range (value_ *** 502,508 **** if (is_min && is_max) { ! /* We cannot deal with empty ranges, drop to varying. */ set_value_range_to_varying (vr); return; } --- 524,531 ---- if (is_min && is_max) { ! /* We cannot deal with empty ranges, drop to varying. ! ??? This could be VR_UNDEFINED instead. */ set_value_range_to_varying (vr); return; } *************** set_and_canonicalize_value_range (value_ *** 525,530 **** --- 548,562 ---- } } + /* Drop [-INF(OVF), +INF(OVF)] to varying. */ + if (needs_overflow_infinity (TREE_TYPE (min)) + && is_overflow_infinity (min) + && is_overflow_infinity (max)) + { + set_value_range_to_varying (vr); + return; + } + set_value_range (vr, t, min, max, equiv); } *************** set_value_range_to_truthvalue (value_ran *** 608,625 **** } - /* Set value range VR to VR_UNDEFINED. */ - - static inline void - set_value_range_to_undefined (value_range_t *vr) - { - vr->type = VR_UNDEFINED; - vr->min = vr->max = NULL_TREE; - if (vr->equiv) - bitmap_clear (vr->equiv); - } - - /* If abs (min) < abs (max), set VR to [-max, max], if abs (min) >= abs (max), set VR to [-min, min]. */ --- 640,645 ----