diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2018-10-03 17:36:29 +0000 |
---|---|---|
committer | Aldy Hernandez <aldyh@gcc.gnu.org> | 2018-10-03 17:36:29 +0000 |
commit | 9b918e82027599898e5f2ff75342a51da06672a9 (patch) | |
tree | 8bcd98852b04d4e16319dc8c385b377d9821b018 /gcc/tree-vrp.c | |
parent | 78125561e39be43dc140d5648abf402c4f7cf1c0 (diff) | |
download | gcc-9b918e82027599898e5f2ff75342a51da06672a9.zip gcc-9b918e82027599898e5f2ff75342a51da06672a9.tar.gz gcc-9b918e82027599898e5f2ff75342a51da06672a9.tar.bz2 |
re PR tree-optimization/87415 (wrong code at -O1 and above on x86_64-linux-gnu)
PR tree-optimization/87415
* tree-vrp.c (set_value_range_with_overflow): Special case one bit
precision fields.
From-SVN: r264817
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 005fc2f..cbc2ea2 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1116,6 +1116,15 @@ set_value_range_with_overflow (value_range &vr, const unsigned int prec = TYPE_PRECISION (type); vr.type = VR_RANGE; vr.equiv = NULL; + + /* For one bit precision if max < min, then the swapped + range covers all values. */ + if (prec == 1 && wi::lt_p (wmax, wmin, sgn)) + { + set_value_range_to_varying (&vr); + return; + } + if (TYPE_OVERFLOW_WRAPS (type)) { /* If overflow wraps, truncate the values and adjust the |