diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2021-07-29 11:22:28 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2021-07-30 15:10:49 -0400 |
commit | 145bc41dae7c7bfa093d61e77346f98e6a595a0e (patch) | |
tree | b6aa0a6a9a985dabf305c65bd12a2d9a82f19493 /gcc/range-op.cc | |
parent | ebbcdd7fae1f802763850e4afedfdfa09cf10e1a (diff) | |
download | gcc-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.cc | 12 |
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) |