aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Macleod <amacleod@gcc.gnu.org>2018-04-01 21:21:07 +0000
committerAndrew Macleod <amacleod@gcc.gnu.org>2018-04-01 21:21:07 +0000
commit57a26c8c98d68fb6569e67850125ef65e1f359ba (patch)
tree94834635d3b3bc790dbee605e34af7c33f3fae10
parent9cde03b9f79f1e418b774e2f380e7c8e2a9cc6d7 (diff)
downloadgcc-57a26c8c98d68fb6569e67850125ef65e1f359ba.zip
gcc-57a26c8c98d68fb6569e67850125ef65e1f359ba.tar.gz
gcc-57a26c8c98d68fb6569e67850125ef65e1f359ba.tar.bz2
Dont wind back thru divide yet
From-SVN: r258999
-rw-r--r--gcc/range-op.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/gcc/range-op.c b/gcc/range-op.c
index 60c513a..6191727 100644
--- a/gcc/range-op.c
+++ b/gcc/range-op.c
@@ -1061,7 +1061,7 @@ operator_divide::op1_irange (irange& r ATTRIBUTE_UNUSED,
// a_7 = a_6 / 4
// if a_7 is [4,4], a_6 is actually [16,19] so ranges are trickier to
// calulate.
- if (op2.singleton_p (offset) && op_rr (OPM_MUL, r, lhs, op2))
+ if (0 & op2.singleton_p (offset) && op_rr (OPM_MUL, r, lhs, op2))
{
wide_int ub, lb;
bool lb_ov = false, ub_ov = false;
@@ -1075,10 +1075,26 @@ operator_divide::op1_irange (irange& r ATTRIBUTE_UNUSED,
offset = wi::sub (offset, 1, sign, &ub_ov);
lb = r.lower_bound ();
ub = r.upper_bound ();
+
if (wi::le_p (lb, 0, sign))
- lb = wi::sub (lb, offset, sign, &lb_ov);
+ {
+ lb = wi::sub (lb, offset, sign, &lb_ov);
+ if (lb_ov)
+ {
+ lb = wi::min_value (TYPE_PRECISION (type), sign);
+ lb_ov = false;
+ }
+
+ }
if (wi::ge_p (ub, 0, sign))
- ub = wi::add (ub, offset, sign, &ub_ov);
+ {
+ ub = wi::add (ub, offset, sign, &ub_ov);
+ if (ub_ov)
+ {
+ ub = wi::max_value (TYPE_PRECISION (type), sign);
+ ub_ov = false;
+ }
+ }
add_to_range (r, lb, lb_ov, ub, ub_ov);
if (!r.overflow_p ())
return true;