aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-06-04 16:16:49 +0200
committerJakub Jelinek <jakub@redhat.com>2024-06-04 16:16:49 +0200
commit591d30c5c97e757f63ce0d99ae9a3dbe8c75a50a (patch)
treeaa773d49def70b17ba64071998e7d3867fbad4da
parent181861b072ff1ef650c1a9d0290a4a672b9e747c (diff)
downloadgcc-591d30c5c97e757f63ce0d99ae9a3dbe8c75a50a.zip
gcc-591d30c5c97e757f63ce0d99ae9a3dbe8c75a50a.tar.gz
gcc-591d30c5c97e757f63ce0d99ae9a3dbe8c75a50a.tar.bz2
ranger: Improve CLZ fold_range [PR115337]
cfn_ctz::fold_range includes special cases for the case where .CTZ has two arguments and so is well defined at zero, and the second argument is equal to prec or -1, but cfn_clz::fold_range does that only for the prec case. -1 is fairly common as well though, because the <stdbit.h> builtins do use it now, so I think it is worth special casing that. If we don't know anything about the argument, the difference for .CLZ (arg, -1) is that previously the result was varying, now it will be [-1, prec-1]. If we knew arg can't be zero, it used to be optimized before as well into e.g. [0, prec-1] or similar. 2024-06-04 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/115337 * gimple-range-op.cc (cfn_clz::fold_range): For m_gimple_call_internal_p handle as a special case also second argument of -1 next to prec.
-rw-r--r--gcc/gimple-range-op.cc16
1 files changed, 9 insertions, 7 deletions
diff --git a/gcc/gimple-range-op.cc b/gcc/gimple-range-op.cc
index aec3f39..1b9a847 100644
--- a/gcc/gimple-range-op.cc
+++ b/gcc/gimple-range-op.cc
@@ -941,8 +941,10 @@ cfn_clz::fold_range (irange &r, tree type, const irange &lh,
int maxi = prec - 1;
if (m_gimple_call_internal_p)
{
- // Only handle the single common value.
- if (rh.lower_bound () == prec)
+ // Handle only the two common values.
+ if (rh.lower_bound () == -1)
+ mini = -1;
+ else if (rh.lower_bound () == prec)
maxi = prec;
else
// Magic value to give up, unless we can prove arg is non-zero.
@@ -953,7 +955,7 @@ cfn_clz::fold_range (irange &r, tree type, const irange &lh,
if (wi::gt_p (lh.lower_bound (), 0, TYPE_SIGN (lh.type ())))
{
maxi = prec - 1 - wi::floor_log2 (lh.lower_bound ());
- if (mini == -2)
+ if (mini < 0)
mini = 0;
}
else if (!range_includes_zero_p (lh))
@@ -969,11 +971,11 @@ cfn_clz::fold_range (irange &r, tree type, const irange &lh,
if (max == 0)
{
// If CLZ_DEFINED_VALUE_AT_ZERO is 2 with VALUE of prec,
- // return [prec, prec], otherwise ignore the range.
- if (maxi == prec)
- mini = prec;
+ // return [prec, prec] or [-1, -1], otherwise ignore the range.
+ if (maxi == prec || mini == -1)
+ mini = maxi;
}
- else
+ else if (mini >= 0)
mini = newmini;
if (mini == -2)