[FunctionAttrs] Volatile operations can access inaccessible memory
authorNikita Popov <npopov@redhat.com>
Thu, 13 Oct 2022 10:16:26 +0000 (12:16 +0200)
committerNikita Popov <npopov@redhat.com>
Thu, 20 Oct 2022 09:57:10 +0000 (11:57 +0200)
commitf2fe289374b03d7a11559fa5ea2c6a0c225d0aec
treed7662397ba285cec786c005d3797e7654520f118
parent0f4dc562bca3ad61bfc194b9e435c5b27f219461
[FunctionAttrs] Volatile operations can access inaccessible memory

Per LangRef, volatile operations are allowed to access the location
of their pointer argument, plus inaccessible memory:

> Any volatile operation can have side effects, and any volatile
> operation can read and/or modify state which is not accessible
> via a regular load or store in this module.
> [...]
> The allowed side-effects for volatile accesses are limited. If
> a non-volatile store to a given address would be legal, a volatile
> operation may modify the memory at that address. A volatile
> operation may not modify any other memory accessible by the
> module being compiled. A volatile operation may not call any
> code in the current module.

FunctionAttrs currently does not model this and ends up marking
functions with volatile accesses on arguments as argmemonly,
even though they should be inaccessiblemem_or_argmemonly.

Differential Revision: https://reviews.llvm.org/D135863
llvm/lib/Transforms/IPO/FunctionAttrs.cpp
llvm/test/Transforms/FunctionAttrs/nosync.ll
llvm/test/Transforms/FunctionAttrs/readattrs.ll
llvm/test/Transforms/FunctionAttrs/writeonly.ll