[PATCH] D74935: [LangRef][AliasAnalysis] Clarify `noalias` affects only modified objects

Johannes Doerfert via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 20 15:25:47 PST 2020


jdoerfert created this revision.
jdoerfert added reviewers: hfinkel, nlopes, regehr, efriedma.
Herald added a subscriber: bollu.
Herald added a reviewer: sstefan1.
Herald added a reviewer: uenoku.
Herald added a project: LLVM.

We already mention that `noalias` is modeled after the C99 `restrict`
qualifier but we did omit one important requirement in the description.
For the restrict guarantees the object affected has to be modified
during the execution of the function, in any way (see 6.7.3.1.4 in [0]).

There are two reasons we want this restriction as well:

1. To match the `restrict` semantics when we lower it to `noalias`.
2. To allow the reasoning that the object pointed to by a `noalias` pointer is not modified through means not derived from this pointer. Hence, following the uses of that pointer is sufficient to determine potential modifications.

The discussion on this came up as part of D73428 <https://reviews.llvm.org/D73428>. In that patch the
Attributor is taught to derive `noalias` for call site arguments based
on alias queries against objects that are accessed in the callee. This
is possible even if the pointer passed at the call site was `noalias`.
To simplify the logic there *and* to allow the use of `noalias` as
described in 2) above, it is beneficial to follow the C `restrict`
semantics in cases where there might be "read-read-aliases". Note that
 AliasAnalysis* queries for read only objects already result in
 `NoAlias` even if the pointers might "alias".

- From this point of view our Alias Analysis is basically a Dependence Analysis.

[0] http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D74935

Files:
  llvm/docs/LangRef.rst


Index: llvm/docs/LangRef.rst
===================================================================
--- llvm/docs/LangRef.rst
+++ llvm/docs/LangRef.rst
@@ -1110,8 +1110,9 @@
     This indicates that objects accessed via pointer values
     :ref:`based <pointeraliasing>` on the argument or return value are not also
     accessed, during the execution of the function, via pointer values not
-    *based* on the argument or return value. The attribute on a return value
-    also has additional semantics described below. The caller shares the
+    *based* on the argument or return value, if the object is modified, by any
+    means, during the execution of the function. The attribute on a return
+    value also has additional semantics described below. The caller shares the
     responsibility with the callee for ensuring that these requirements are met.
     For further details, please see the discussion of the NoAlias response in
     :ref:`alias analysis <Must, May, or No>`.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74935.245759.patch
Type: text/x-patch
Size: 985 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200220/5c75993a/attachment.bin>


More information about the llvm-commits mailing list