diff options
author | Aldy Hernandez <aldyh@gcc.gnu.org> | 2019-05-06 12:48:30 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2019-05-06 12:48:30 +0000 |
commit | a74f89437c99dcbd50184991b46ced8757ad943e (patch) | |
tree | 7af329b4f1b888fff6d3ef5118985aeeb3cd3005 /gcc | |
parent | 2ac65a99b198f89bed3c7fe73bb4d63cc9405919 (diff) | |
download | gcc-a74f89437c99dcbd50184991b46ced8757ad943e.zip gcc-a74f89437c99dcbd50184991b46ced8757ad943e.tar.gz gcc-a74f89437c99dcbd50184991b46ced8757ad943e.tar.bz2 |
Dumb down MAX/MIN of pointers when comparing ranger and VRP operations.
From-SVN: r270909
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/tree-vrp.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 3747f7d..aeac6a4 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1702,6 +1702,19 @@ ranger_fold (value_range_base *vr, enum tree_code code, vr->set_undefined (); return; } + // MAX/MIN of pointers in VRP dumbs everything down to + // NULL/NON_NULL/VARYING. The ranger, because it has sub-ranges, + // can sometimes get slightly better ranges. For now, dumb down the + // ranger result so it compares with VRP. + if (flag_ranges_mode == RANGES_CHECKING + && (code == MAX_EXPR || code == MIN_EXPR) + && POINTER_TYPE_P (res.type ()) + && !res.zero_p () + && !res.non_zero_p ()) + { + vr->set_varying (); + return; + } *vr = irange_to_value_range (res); } |