[llvm-dev] Function attributes for memory side-effects

Alexey Zhikhartsev via llvm-dev llvm-dev at lists.llvm.org
Thu Apr 30 08:45:26 PDT 2020


Hi Johannes,

This got me puzzled:

> In case of library functions we actually "know" the side effects and will
add the appropriate attributes.

How can we make sure that a function in the LLVM IR is a specific library
function and not something that the user wrote themself? For example, we
see a call to "printf" in the code but it could be a function that just
happened to be named "printf" that does all sorts of things that we
wouldn't expect from a genuine libc printf.

Alexey

On Thu, Apr 30, 2020 at 11:35 AM Johannes Doerfert via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

>
> On 4/29/20 4:12 PM, Reid Kleckner via llvm-dev wrote:
>  > On Tue, Apr 28, 2020 at 12:58 PM Ejjeh, Adel via llvm-dev <
>  > llvm-dev at lists.llvm.org> wrote:
>  >
>  >> Specifically, I want to be able to know when a called function does not
>  >> have any side effects (e.g. math library functions like sqrt)
>  >>
>  >
>  > Apologies for the pedantry, but I believe sqrt may set errno, so it
>  > actually can have side effects. :( See -fno-math-errno and the
>  > documentation around it.
>  >
>  >
>  >> , and was wondering if there are attributes that specify this
> behavior (I
>  >> know there is the ‘noread’ attribute but wasn’t sure if there’s
> something
>  >> similar for writes)? Also, how can I tell clang to generate those
>  >> attributes at the function declaration? Any information would be
> helpful.
>  >>
>  >
>  > Yep, I believe the IR attributes are `readonly` and `readnone`. Readonly
>  > implies no side effects (no writes), and readnone implies no memory
>  > dependencies at all. The return value is a pure function of the
> arguments.
>  > Two calls with the same arguments can be folded together.
>  >
>  > There are a couple of passes (Attributor, FunctionAttrs, I'm not
>  > up-to-date) that will infer these attributes if they can see a precise
>  > definition of the function body. Learning anything interesting usually
>  > requires expanding the scope of analysis with LTO, so these passes
> can look
>  > across translation unit boundaries.
>
> Often true. In case of library functions we actually "know" the side
> effects and will add the appropriate attributes. As you said, fast math
> flags are needed for math library functions that may otherwise write
> errno.
>
>
> The full list of attributes we have so far is:
>
>     access locations: `readnone`, `inaccessiblememonly`, `argmemonly`,
> and `inaccessiblemem_or_argmemonly`
>   and access "kinds": `readonly` and `writeonly`
>
> Except for `readnone` you can combine a location attribute with a "kind"
> or have one of either alone. The Attributor does internally derive more
> "locations", basically any combination of:
>    local memory
>    constant memory
>    internal global memory
>    external global memory
>    argument memory
>    inaccessible memory
>    malloced memory (returned by a function with the `noalias` return
> attribute)
>    unknown memory
> I want to add some/all of these as attributes but didn't find the time
> yet.
>
>
> Cheers,
>
>    Johannes
>
>
>
>  >
>  > HTH
>  >
>  >
>  > _______________________________________________
>  > LLVM Developers mailing list
>  > llvm-dev at lists.llvm.org
>  > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://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/20200430/5f573672/attachment.html>


More information about the llvm-dev mailing list