diff mbox series

[PUSHED,4/8] Adjust op_with_boolean_value_range_p for irange API.

Message ID 20200804063441.517123-5-aldyh@redhat.com
State New
Headers show
Series irange API adjustments for various files | expand

Commit Message

Aldy Hernandez Aug. 4, 2020, 6:34 a.m. UTC
It seems to me that we should also check for [0,0] and [1,1] in the
range, but I am leaving things as is to avoid functional changes.

gcc/ChangeLog:

	* vr-values.c (simplify_using_ranges::op_with_boolean_value_range_p): Adjust
	for irange API.
---
 gcc/vr-values.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Richard Biener Aug. 4, 2020, 6:55 a.m. UTC | #1
On Tue, Aug 4, 2020 at 8:39 AM Aldy Hernandez via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> It seems to me that we should also check for [0,0] and [1,1] in the
> range, but I am leaving things as is to avoid functional changes.
>
> gcc/ChangeLog:
>
>         * vr-values.c (simplify_using_ranges::op_with_boolean_value_range_p): Adjust
>         for irange API.
> ---
>  gcc/vr-values.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/gcc/vr-values.c b/gcc/vr-values.c
> index 609375c072e..1190fa96453 100644
> --- a/gcc/vr-values.c
> +++ b/gcc/vr-values.c
> @@ -448,10 +448,11 @@ simplify_using_ranges::op_with_boolean_value_range_p (tree op)
>    if (TREE_CODE (op) != SSA_NAME)
>      return false;
>
> +  /* ?? Errr, this should probably check for [0,0] and [1,1] as well
> +     as [0,1].  */
>    const value_range *vr = get_value_range (op);
> -  return (vr->kind () == VR_RANGE
> -         && integer_zerop (vr->min ())
> -         && integer_onep (vr->max ()));
> +  return *vr == value_range (build_zero_cst (TREE_TYPE (op)),
> +                            build_one_cst (TREE_TYPE (op)));

This now builds trees in a predicate which is highly dubious.  Isn't
there a better (cheaper) primitive to build a [0, 1] range to compare against?
I guess from what I read it will also allocate memory for the range entry?

Richard.


>  }
>
>  /* Extract value range information for VAR when (OP COND_CODE LIMIT) is
> --
> 2.26.2
>
Aldy Hernandez Aug. 4, 2020, 9:45 a.m. UTC | #2
On 8/4/20 8:55 AM, Richard Biener wrote:
> On Tue, Aug 4, 2020 at 8:39 AM Aldy Hernandez via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
>>
>> It seems to me that we should also check for [0,0] and [1,1] in the
>> range, but I am leaving things as is to avoid functional changes.
>>
>> gcc/ChangeLog:
>>
>>          * vr-values.c (simplify_using_ranges::op_with_boolean_value_range_p): Adjust
>>          for irange API.
>> ---
>>   gcc/vr-values.c | 7 ++++---
>>   1 file changed, 4 insertions(+), 3 deletions(-)
>>
>> diff --git a/gcc/vr-values.c b/gcc/vr-values.c
>> index 609375c072e..1190fa96453 100644
>> --- a/gcc/vr-values.c
>> +++ b/gcc/vr-values.c
>> @@ -448,10 +448,11 @@ simplify_using_ranges::op_with_boolean_value_range_p (tree op)
>>     if (TREE_CODE (op) != SSA_NAME)
>>       return false;
>>
>> +  /* ?? Errr, this should probably check for [0,0] and [1,1] as well
>> +     as [0,1].  */
>>     const value_range *vr = get_value_range (op);
>> -  return (vr->kind () == VR_RANGE
>> -         && integer_zerop (vr->min ())
>> -         && integer_onep (vr->max ()));
>> +  return *vr == value_range (build_zero_cst (TREE_TYPE (op)),
>> +                            build_one_cst (TREE_TYPE (op)));
> 
> This now builds trees in a predicate which is highly dubious.  Isn't
> there a better (cheaper) primitive to build a [0, 1] range to compare against?
> I guess from what I read it will also allocate memory for the range entry?

Both 0 and 1 are cached for all integer types.  We are also caching 1 
and MAX for pointers per the irange patchset, so this shouldn't be a 
performance issue.

Also, we do the same thing for irange::nonzero_p(), which is used a lot 
more often (and probably on critical paths), and per our benchmarks we 
didn't find it to take any significant time:

   tree zero = build_zero_cst (type ());
   return *this == int_range<1> (zero, zero, VR_ANTI_RANGE);

However, I suppose we could implement it with something like:

return vr->num_pairs() == 1
   && vr->lower_bound () == 0
   && vr->upper_bound () == 1

but that's hardly any faster, especially since num_pairs() is 
non-trivial for the value_range legacy code.

I just don't think it's worth it.

Aldy
diff mbox series

Patch

diff --git a/gcc/vr-values.c b/gcc/vr-values.c
index 609375c072e..1190fa96453 100644
--- a/gcc/vr-values.c
+++ b/gcc/vr-values.c
@@ -448,10 +448,11 @@  simplify_using_ranges::op_with_boolean_value_range_p (tree op)
   if (TREE_CODE (op) != SSA_NAME)
     return false;
 
+  /* ?? Errr, this should probably check for [0,0] and [1,1] as well
+     as [0,1].  */
   const value_range *vr = get_value_range (op);
-  return (vr->kind () == VR_RANGE
-	  && integer_zerop (vr->min ())
-	  && integer_onep (vr->max ()));
+  return *vr == value_range (build_zero_cst (TREE_TYPE (op)),
+			     build_one_cst (TREE_TYPE (op)));
 }
 
 /* Extract value range information for VAR when (OP COND_CODE LIMIT) is