aboutsummaryrefslogtreecommitdiff
path: root/gcc/range-op.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2021-07-29 11:22:28 -0400
committerAndrew MacLeod <amacleod@redhat.com>2021-07-30 15:10:49 -0400
commit145bc41dae7c7bfa093d61e77346f98e6a595a0e (patch)
treeb6aa0a6a9a985dabf305c65bd12a2d9a82f19493 /gcc/range-op.cc
parentebbcdd7fae1f802763850e4afedfdfa09cf10e1a (diff)
downloadgcc-145bc41dae7c7bfa093d61e77346f98e6a595a0e.zip
gcc-145bc41dae7c7bfa093d61e77346f98e6a595a0e.tar.gz
gcc-145bc41dae7c7bfa093d61e77346f98e6a595a0e.tar.bz2
Handle constants in wi_fold for trunc_mod.
Handle const % const, as wi_fold_in_parts may now provide this. Before this [10, 10] % [4, 4] would produce [0, 3] instead of [2, 2]. gcc/ * range-op.cc (operator_trunc_mod::wi_fold): Fold constants. gcc/testsuite/ * gcc.dg/tree-ssa/pr61839_2.c: Adjust. Add new const fold test.
Diffstat (limited to 'gcc/range-op.cc')
-rw-r--r--gcc/range-op.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/range-op.cc b/gcc/range-op.cc
index 6922888..eb66e12 100644
--- a/gcc/range-op.cc
+++ b/gcc/range-op.cc
@@ -3240,6 +3240,18 @@ operator_trunc_mod::wi_fold (irange &r, tree type,
return;
}
+ // Check for constant and try to fold.
+ if (lh_lb == lh_ub && rh_lb == rh_ub)
+ {
+ wi::overflow_type ov = wi::OVF_NONE;
+ tmp = wi::mod_trunc (lh_lb, rh_lb, sign, &ov);
+ if (ov == wi::OVF_NONE)
+ {
+ r = int_range<2> (type, tmp, tmp);
+ return;
+ }
+ }
+
// ABS (A % B) < ABS (B) and either 0 <= A % B <= A or A <= A % B <= 0.
new_ub = rh_ub - 1;
if (sign == SIGNED)