[llvm-dev] Speculation and control dependent no wrap flags

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Fri Feb 3 10:22:29 PST 2017

Personally, I'm in the "strip like metadata" camp.  This is much easier 
to reason about.


On 02/03/2017 07:50 AM, Reid Kleckner via llvm-dev wrote:
> Just yesterday I talked to Dan Gohman, who suggested we strip nowrap 
> flags when speculating. It solves a lot of poison problems.
> On Feb 3, 2017 5:49 AM, "Hal Finkel via llvm-dev" 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>     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
>         <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
>         <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
>         <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
>     _______________________________________________
>     LLVM Developers mailing list
>     llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170203/fa1ae66f/attachment-0001.html>

More information about the llvm-dev mailing list