aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@gcc.gnu.org>2019-05-06 12:48:30 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2019-05-06 12:48:30 +0000
commita74f89437c99dcbd50184991b46ced8757ad943e (patch)
tree7af329b4f1b888fff6d3ef5118985aeeb3cd3005 /gcc
parent2ac65a99b198f89bed3c7fe73bb4d63cc9405919 (diff)
downloadgcc-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.c13
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);
}