[prev in list] [next in list] [prev in thread] [next in thread]
List: gcc-patches
Subject: Re: [PATCH PR100499]Fix wrong niter info caused by overflow behavior
From: Richard Biener via Gcc-patches <gcc-patches () gcc ! gnu ! org>
Date: 2021-05-31 10:01:55
Message-ID: CAFiYyc38Ld=M1LHvRnTAi4rTZczV8dAo0cR+aEb+9egYpLT7mQ () mail ! gmail ! com
[Download RAW message or body]
On Thu, May 27, 2021 at 5:38 AM bin.cheng via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi,
> As described in PR100499, loop niters analysis for "!=" now relies on multiple_of_p which
> so far is mostly implemented for no-overflow scenarios. This patch fixes the issue by:
> 1. add new parameter to multiple_of_p indicating no-wrapping behavior in top expression.
> 2. pass new argument to help multiple_of_p, for example, the case in stor-layout.c.
> 3. adjust calls in number_of_iterations_ne by checking multiple_of_p without dependence
> on wrapping/no-wrapping behavior. It also corrects one issue in PR72817.
>
> Noticed there are some improvements in ranger to help analysis of multiple_of_p. For
> TOP expression like "left op right", we would like to check if this specific op wraps or not.
> For example:
> 1. left (unsigned, multiple of 3) + 0xfffffffd: the result is multiple of 3 if "+" wraps even if
> right operand is not multiple of 3.
> 2. left (unsigned, multiple of 3) + 6: the result is not multiple of 3 if "+" wraps even if the
> right operand is multiple of 3.
> So in the end, we might need ranger to tell if such operator wraps or not, i.e, must_overflow,
> must_not_overflow, may_overflow. Of course, we need to be conservative in the last case.
>
> Bootstrap and test on x86_64. Any comments?
The multiple_of_p changes could have ABI impact on the 2nd occurance in
stor-layout.c, so a conservative fix would leave that one with
/*no_wrap = */true
as well.
In fact most of the scattered uses elsewhere should possibly converted to
wi::multiple_of_p.
Now,
+ if (!no_wrap && TYPE_OVERFLOW_WRAPS (type)
+ /* Overflow/wrap doesn't matter if the 2nd operand is power of 2. */
+ && !integer_pow2p (TREE_OPERAND (top, 1)))
+ return false;
are integer_pow2_p the only cases we can handle with ignoring overflow?
Isn't the other case when bottom is integer_pow2_p?
I wonder if it makes sense to wrap the core worker of multiple_of_p, using
tree_ctz for integer_pow2_p (bottom), that also already uses range/nonzero
bits info on SSA names.
That said - please factor out the niter analysis changes, they should be
valid on their own and it will be interesting to be able to bisect their
effect separately.
Thanks,
Richard.
> Thanks,
> bin
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic