[llvm-dev] Possible soundness issue with available_externally (split from "RFC: Add guard intrinsics")

Sanjoy Das via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 29 11:08:28 PST 2016


I may be misunderstanding you here, but I've tried to reply inline
below:

On Mon, Feb 29, 2016 at 11:00 AM, Xinliang David Li
<xinliangli at gmail.com> wrote:
> yes -- it is UB if user writes code like this.

So we agree that given that the user wrote exactly what you have
above, there is no guarantee from the compiler to generate anything
meaningful?

> What if the g=0 is
> speculatively moved above the call of maybe_divide at O2?  My point is that

You mean, the program was initially something like

g = 42
maybe_divide(&g)
g = 0

which LLVM optimized to

g = 0
maybe_divide(&g)

?

That code motion is legal only if `maybe_divide` is `readnone` -- if
LLVM speculates the store without first inferring `readnone` on
`maybe_divide`, that's buggy for a different reason.

> such runtime behavior difference may not specific to multi-TU definition
> scenario.

The multi-TU constraint is relevant here because the linker may
legally replace a `readnone` version of `maybe_divide` with version
that reads memory; retroactively invalidating the optimization above.  If
there is only one TU, then the `maybe_divide` the optimizer sees is
what the final executable gets; and all is well.

-- Sanjoy


More information about the llvm-dev mailing list