[llvm-dev] Speculation and control dependent no wrap flags
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Fri Feb 3 05:49:31 PST 2017
On 02/03/2017 07:28 AM, Artur Pilipenko wrote:
> I'm looking at the bug (https://llvm.org/bugs/show_bug.cgi?id=31181)
> which was triggered by my change to make CVP mark adds as no wrap
> (https://reviews.llvm.org/rL278220) and I'd like to have some broader
> discussion of the problem. In this bug CVP correctly marks an add as
> nuw basing on the loop latch check, but later loop rotation pass moves
> the add to a point before the check. In the new context nuw is no
> longer valid and leads to an incorrect transformation of the loop. See
> https://llvm.org/bugs/show_bug.cgi?id=31181#c5 comment in the bug for
> more details.
>
> Since nsw, nuw flags can be control dependent, it seems like we should
> be treating them as metadata, i.e. we should be stripping them when we
> speculate the instruction. I don’t think that we are doing this now
> anywhere. The problem was noticed on loop rotation, but I expect any
> other pass which speculates overflowing operations is suffering from
> the same problem.
>
> Thoughts?
We generally don't strip these because violating the wrapping constraint
does not immediately cause UB. Instead, it generates a poison value. So
long as that poison value is not used in way which causes UB, then
everything is fine. In this case, I suspect that we want to fix IndVars
to strip the flag, or not do the transformation, when it might introduce
this kind of issue (i.e. a situation where we might branch on a poison
value).
-Hal
>
> Artur
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list