[llvm-dev] [RFC] Adding a globalmemonly attribute for functions that only access global memory

Johannes Doerfert via llvm-dev llvm-dev at lists.llvm.org
Tue Sep 14 09:50:17 PDT 2021


Hi Nicolai,

On 9/13/21 11:59 AM, Nicolai Hähnle via llvm-dev wrote:
> Hi Mugilan,
>
> I think this is an interesting direction. I've recently put some thought
> into the memory attributes you mention for unrelated reasons, and found
> that the various XYZonly attributes don't compose well, while noXYZ
> attributes compose better.The reason is simple. With what you're proposing,
> we end up with:
>
> * argmemonly
> * inaccessiblememonly
> * inaccessibleorargmemonly
> * globalmemonly
>
> There are 4 attributes talking about 3 types of memory. Clearly, there are
> orthogonality issues. First of all, glancing at your patch, your new
> attribute should really be called inaccessibleorglobalmemonly. What if
> somebody wants argorglobalmemonly? Do they add yet another attribute? That
> way lies madness.

Agreed. We actually wanted to use this to make the point that we
need to switch up the scheme :)

That said, I think the handling of globalmemonly should be discussed
and merged (after refinement) as it will be reused whatever the later
scheme will be.


> If we instead take a step back, we can recognize that there are different
> "paths" of accessing memory:
>
> * arg
> * global
> * inaccessible
> * indirect (i.e., via a pointer loaded from memory)
> * other (e.g., pointer returned by black box function)
>
> These could map very nicely onto noXYZ attributes. You end up 5 attributes:
> noargmem, noglobalmem, noinaccessiblemem, noindirectmem, noothermem. Nicely
> composable, in particular today's attribute are mapped as follows:
>
> * argmemonly -> noglobalmem noinaccessiblemem noindirectmem noothermem
> * inaccessiblememonly -> noargmem noglobalmem noindirectmem noothermem
> * inaccessibleorargmemonly -> noglobalmem noindirectmem noothermem
> * globalmemonly -> noargmem noindirectmem noothermem (remember, you seem to
> want to allow access to inaccessible memory here)
>
> More importantly, the 5 attributes can express any future desired
> combination, e.g. a function that accesses memory through argument
> pointers, and through pointers loaded from there (transitively) is:
> noglobalmem noinaccessiblemem noothermem
>
> Thoughts?

I was thinking we go with a bitfield but otherwise I'm with you. This
is the Attributor AAMemoryLocation encoding:

```
     /// Encoding of different locations that could be accessed by a memory
     /// access.
     enum {
      ALL_LOCATIONS = 0,
      NO_LOCAL_MEM = 1 << 0,
      NO_CONST_MEM = 1 << 1,
      NO_GLOBAL_INTERNAL_MEM = 1 << 2,
      NO_GLOBAL_EXTERNAL_MEM = 1 << 3,
      NO_GLOBAL_MEM = NO_GLOBAL_INTERNAL_MEM | NO_GLOBAL_EXTERNAL_MEM,
      NO_ARGUMENT_MEM = 1 << 4,
      NO_INACCESSIBLE_MEM = 1 << 5,
      NO_MALLOCED_MEM = 1 << 6,
      NO_UNKOWN_MEM = 1 << 7,
      NO_LOCATIONS = NO_LOCAL_MEM | NO_CONST_MEM | NO_GLOBAL_INTERNAL_MEM |
                     NO_GLOBAL_EXTERNAL_MEM | NO_ARGUMENT_MEM |
                     NO_INACCESSIBLE_MEM | NO_MALLOCED_MEM | NO_UNKOWN_MEM,
     }
```

I was thinking to use this, or a variation of that, as the argument of 
an attribute. Thus,
   `access_locations(~(NO_GLOBAL_MEM | NO_ARGUMENT_MEM))`
to express argument and global memory is potentially accessed.

That said, I *also* want us to allow to use this interface for "special 
memory locations".
What I mean is for example a special "location" for things like intrinsics:
   `llvm.assume` writes only to bit "LLVM_ASSUME_MEM"
   `llvm.launder.invariant.group` writes only to bit 
"LLVM_LAUNDER_INVARIANT_GROUP" (D109548)
   ...
This way they stop to interfere with each other and other effects.

I hope this makes some sense.

~ Johannes



>
> Cheers,
> Nicolai
>
> On Sat, Sep 11, 2021 at 9:16 PM Mugilan Ganesan via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
>> Hello everyone,
>>
>> We propose the addition of a GlobalMemOnly attribute to LLVM.
>>
>> Definition:
>>
>> This attribute indicates that the only memory accessed inside a function,
>> that is visible to the callee, is global memory. If the function reads or
>> writes other memory that is visible to the callee, the behavior is
>> undefined.
>>
>> Motivation:
>>
>> Memory attributes already exist for specifying the memory locations
>> accessed by a function, such as ArgMemOnly and InacessibleMemOnly.
>> Similarly, there are attributes for describing memory behaviour, such as
>> ReadOnly and WriteOnly.
>>
>> However, no attributes exist for differentiating the types of memory
>> objects that functions can access, such as global objects and objects
>> created by alloca. We would like to start by introducing an attribute to
>> deal with functions that only access global objects.
>>
>> The addition of the GlobalMemOnly attribute can benefit LLVM as follows:
>>
>> 1. Improves Alias Analysis, since this information can be used to improve
>> the determination of aliasing between functions and memory locations that
>> point to global objects.
>>
>> 2. Provides Transforms with greater information: many math lib calls only
>> modify the global variable errno. Unnecessary loads of the call arguments
>> can therefore be removed, since the calls will have no side-effects on them.
>>
>> Patches Overview:
>>
>> 1. Definition of GlobalMemOnly in the AsmParser, IR, and LLVM Bitcode. It
>> is also defined in the LangRef.
>>
>> https://reviews.llvm.org/D109644
>>
>> 2. Support is added to Alias Analysis. If a function is GlobalMemOnly and
>> a memory location does not point to a global object, getModRefInfo can
>> infer that no aliasing between the function and the location can occur.
>> This patch also adds a regression test for BasicAA.
>>
>> https://reviews.llvm.org/D109647
>>
>> 3. Certain math lib calls are assigned GlobalMemOnly, since they only
>> modify the global variable errno. These calls include common functions,
>> such as atan, exp, and log.
>>
>> https://reviews.llvm.org/D109648
>>
>> Please let us know of any thoughts you may have regarding this attribute’s
>> implementation and use cases. We believe that it can strengthen LLVM’s
>> alias analysis and optimization passes if added.
>>
>> Thanks,
>> Mugilan
>> _______________________________________________
>> 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


More information about the llvm-dev mailing list