Following discussion on llvm-dev ("proposed new rule for getelementptr"),
authorDan Gohman <gohman@apple.com>
Mon, 27 Jul 2009 18:07:55 +0000 (18:07 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 27 Jul 2009 18:07:55 +0000 (18:07 +0000)
add a new "Pointer Aliasing Rules" section.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77216 91177308-0d34-0410-b5e6-96231b3b80d8

docs/LangRef.html

index 9ab62c03492fec031cc280acefd52ae7c9c37f4c..7858e6373d335bebfc25c3cfe71e598e45b44528 100644 (file)
@@ -48,6 +48,7 @@
       <li><a href="#gc">Garbage Collector Names</a></li>
       <li><a href="#moduleasm">Module-Level Inline Assembly</a></li>
       <li><a href="#datalayout">Data Layout</a></li>
+      <li><a href="#pointeraliasing">Pointer Aliasing Rules</a></li>
     </ol>
   </li>
   <li><a href="#typesystem">Type System</a>
@@ -1243,6 +1244,54 @@ target datalayout = "<i>layout specification</i>"
 
 </div>
 
+<!-- ======================================================================= -->
+<div class="doc_subsection">
+  <a name="pointeraliasing">Pointer Aliasing Rules</a>
+</div>
+
+<div class="doc_text">
+
+<p>Any memory access must be done though a pointer value associated
+with with address range of the memory access, otherwise the behavior
+is undefined. Pointer values are associated with address ranges
+according to the following rules:</p>
+
+<ul>
+  <li>A pointer value formed from a <tt>getelementptr</tt> instruction is
+      associated with the addresses associated with the first operand of
+      the <tt>getelementptr</tt>.</li>
+  <li>An addresses of a global variable is associated with the address
+      range of the variable's storage.</li>
+  <li>The result value of an allocation instruction is associated with
+      the address range of the allocated storage.</li>
+  <li>A null pointer in the default address-space is associated with
+      no addresses.</li>
+  <li>A pointer value formed by an <tt>inttoptr</tt> is associated with
+      all address ranges of all pointer values that contribute (directly
+      or indirectly) to the computation of the pointer's value.</li>
+  <li>The result value of a <tt>bitcast</tt> is associated with all
+      addresses associated with the operand of the <tt>bitcast</tt>.</li>
+  <li>An integer constant other than zero or a pointer value returned
+      from a function not defined within LLVM may be associated with address
+      ranges allocated through mechanisms other than those provided by
+      LLVM. Such ranges shall not overlap with any ranges of address
+      allocated by mechanisms provided by LLVM.</li>
+  </ul>
+
+<p>LLVM IR does not associate types with memory. The result type of a
+<tt>load</tt> merely indicates the size and alignment of the memory from
+which to load, as well as the interpretation of the value. The first
+operand of a <tt>store</tt> similarly only indicates the size and
+alignment of the store.</p>
+
+<p>Consequently, type-based alias analysis, aka TBAA, aka
+<tt>-fstrict-aliasing</tt>, is not applicable to general unadorned
+LLVM IR. <a href="#metadata">Metadata</a> may be used to encode
+additional information which specialized optimization passes may use
+to implement type-based alias analysis.</p>
+
+</div>
+
 <!-- *********************************************************************** -->
 <div class="doc_section"> <a name="typesystem">Type System</a> </div>
 <!-- *********************************************************************** -->