[PATCH] D124158: [Clang][Attr] Skip adding noundef attribute to arguments when function has convergent attribute

Nicolai Hähnle via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon May 2 12:00:30 PDT 2022


nhaehnle added a comment.

In D124158#3486110 <https://reviews.llvm.org/D124158#3486110>, @jdoerfert wrote:

> I agree. As far as I can tell you have two options, both are specific to the shuffle functions:
>
> 1. Do not set noundef for calls to them as they allow undef values for all lanes we don't read the value.
> 2. Freeze the inputs unconditionally.

Right, with some nitpicks. Option #1 is semantically more accurate: __shfl_sync, subgroupShuffe, and all similar instructions across GPU programming languages are meant to be conceptually similar to `select` in that they select a value from a lane. The "data" argument and return value should allow undef and poison. The incoming value is simply returned as-is, and so poison is propagated instead of causing immediate UB, just as it is for a `select` instruction. However, the lane argument can (and arguably should) still be `noundef`.

There's a separate curious issue in that apparently, reading from an uninitialized variable is **not** UB in CUDA/HIP/GLSL/HLSL/etc. If it was, a lot of code existing out there in the wild would be broken. But that's a matter for the relevant language standards to decide (for the subset of languages that //have// proper standards to begin with).


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D124158/new/

https://reviews.llvm.org/D124158



More information about the llvm-commits mailing list