<div dir="ltr"><div>Hi,</div>
<div>I have a question regarding pointer aliasing.</div>
<div>I have following C code:</div>
<blockquote style="MARGIN-RIGHT: 0px">
<div clear="all">void factorial(float **a, float **b)</div>
<div>{</div>
<div>  b[2][2] = a[0][2];</div>
<div>  b[2][2] = a[0][1];</div>
<div>}</div>
<div> </div></blockquote>
<div>Which is converted to following LLVM IR:</div>
<blockquote style="MARGIN-RIGHT: 0px">
<div><span class="llvm_keyword">define</span> <span class="llvm_type">void</span> @factorial(<span class="llvm_type">float</span>** <span class="llvm_keyword">nocapture</span> %a, <span class="llvm_type">float</span>** <span class="llvm_keyword">nocapture</span> %b) <span class="llvm_keyword">nounwind</span> {</div>

<div>entry:</div>
<div>  %0 = <span class="llvm_keyword">getelementptr</span> inbounds <span class="llvm_type">float</span>** %b, <span class="llvm_type">i64</span> 2   ; <<span class="llvm_type">float</span>**> [#uses=2]</div>
<div>  %1 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>** %0, <span class="llvm_keyword">align</span> 8                   ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %2 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>** %a, <span class="llvm_keyword">align</span> 8                   ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %3 = <span class="llvm_keyword">getelementptr</span> inbounds <span class="llvm_type">float</span>* %2, <span class="llvm_type">i64</span> 2    ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %4 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>* %3, <span class="llvm_keyword">align</span> 4 ; <<span class="llvm_type">float</span>> [#uses=1]</div>
<div>  %5 = <span class="llvm_keyword">getelementptr</span> inbounds <span class="llvm_type">float</span>* %1, <span class="llvm_type">i64</span> 2    ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  <span class="llvm_keyword">store</span> <span class="llvm_type">float</span> %4, <span class="llvm_type">float</span>* %5, <span class="llvm_keyword">align</span> 4</div>
<div>  %6 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>** %0, <span class="llvm_keyword">align</span> 8                   ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %7 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>** %a, <span class="llvm_keyword">align</span> 8                   ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %8 = <span class="llvm_keyword">getelementptr</span> inbounds <span class="llvm_type">float</span>* %7, <span class="llvm_type">i64</span> 1    ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  %9 = <span class="llvm_keyword">load</span> <span class="llvm_type">float</span>* %8, <span class="llvm_keyword">align</span> 4                    ; <<span class="llvm_type">float</span>> [#uses=1]</div>
<div>  %10 = <span class="llvm_keyword">getelementptr</span> inbounds <span class="llvm_type">float</span>* %6, <span class="llvm_type">i64</span> 2   ; <<span class="llvm_type">float</span>*> [#uses=1]</div>
<div>  <span class="llvm_keyword">store</span> <span class="llvm_type">float</span> %9, <span class="llvm_type">float</span>* %10, <span class="llvm_keyword">align</span> 4</div>
<div>  <span class="llvm_keyword">ret</span> <span class="llvm_type">void</span></div>
<div>}</div></blockquote>
<div> </div>
<div>Assuming that a and b arrays contains pointers that are not aliased,</div>
<div>is it possible to remove the first store by using some C or LLVM IR specific declarations?</div>
<div> </div>
<div>Thanks.</div>
<div> </div>
<div> </div></div>