[PATCH] D95122: [Libcalls, Attrs] Annotate libcalls with noundef

Juneyoung Lee via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 21 07:48:45 PST 2021


aqjune added a comment.

In D95122#2512404 <https://reviews.llvm.org/D95122#2512404>, @jdoerfert wrote:

> LGTM. FWIW, `nonnull` should imply `noundef` because if it was `undef` we could pick `null`.

I did not look into the changes in this patch yet,  but does it mean that from

  f(i8* nonnull %p)

it is allowed to attach noundef?

  f(i8* nonnull noundef %p)

I think this shouldn't be allowed, because the former one isn't UB when %p was null but the latter one raises UB.

In D95122#2512515 <https://reviews.llvm.org/D95122#2512515>, @nikic wrote:

> I think this goes against the rules established in D87994 <https://reviews.llvm.org/D87994>, which allows memory accesses based on partially undefined values. Now, I think the change in D87994 <https://reviews.llvm.org/D87994> was a very bad one and we should undo it, but until then I don't think we can annotate with noundef here.

I remember that this was to allow free code motion of load/stores if the offset is within bounds.
e.g

  %p = alloca [8 x i32]
  %q = gep %p, %i ; %i may be partially undef
  load %q ; If 0 <= %i < 8, %q is dereferenceable even if %q is partially undefined


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

https://reviews.llvm.org/D95122



More information about the llvm-commits mailing list