PING

On 9/17/18 6:12 AM, Aldy Hernandez wrote:
It seems most of the remaining anti range code in extract_range_from_unary_expr for CONVERT_EXPR_P is actually dealing with non-nullness in practice.

Anti-range handling is mostly handled by canonicalizing anti-ranges into its two set constituents (~[10,20] => [MIN,9] U [21,MAX]) and dealing with them piece-meal.  For that matter, the only way we can reach the conversion code in extract_range_from_unary_expr with an anti-range is either with a pointer (because pointers are ignored from ranges_from_anti_range on purpose), or when converting integers of the form ~[SSA, SSA].  I verified this with a bootstrap + tests with some specially placed asserts, BTW.

So... if we special handle pointer conversions (both to and fro, as opposed to just to), we get rid of any anti-ranges with the exception of ~[SSA, SSA] between integers.  And anti-ranges of unknown quantities (SSAs) will be handled automatically already (courtesy of extract_range_into_wide_ints).

I propose we handle pointers at the beginning, and everything else just falls into place, with no special code.

As commented in the code, this will pessimize conversions from (char *)~[0, 2] to int, because we will forget that the range can also not be 1 or 2.  But as Jeff commented, we really only care about null or non-nullness.  Special handling magic pointers with constants IMO is a wasted effort.  For that matter, I think it was me that added this spaghetti a few weeks ago to make sure we handled ~[0,2].  We weren't even handling it a short while back :-).  Furthermore, in a bootstrap, I think we only triggered this twice.  And I'm not even sure we make further use of anything null/not-null for pointers later on.

This patch simplifies the code, and removes more special handling and cryptic comments related to anti-ranges.

Tested with all languages including Ada and Go.

OK for trunk?

Reply via email to