From 145bc41dae7c7bfa093d61e77346f98e6a595a0e Mon Sep 17 00:00:00 2001 From: Andrew MacLeod Date: Thu, 29 Jul 2021 11:22:28 -0400 Subject: 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. --- gcc/range-op.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'gcc/range-op.cc') 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) -- cgit v1.1