<div dir="ltr"><div>So I've been narrowing down a very fun issue in our Burst compiler stack with respect to noalias support, and I've managed to basically boil this down to the following failure (see <a href="https://godbolt.org/z/-mdjPV">https://godbolt.org/z/-mdjPV</a>):</div><div><br></div><div>
<div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> called(</span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)">* __restrict__ a, </span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)">* b, </span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)">* c) {</span></div><div><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(0,0,255)">return</span><span style="color:rgb(0,0,0)"> *a + *b + *c;</span></div><div><span style="color:rgb(0,0,0)">}</span></div><br><div><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> foo(</span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> * x, </span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> * y) {</span></div><div><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(0,0,255)">return</span><span style="color:rgb(0,0,0)"> *x + *y + called(x, x, y);</span></div><div><span style="color:rgb(0,0,0)">}</span></div><br><div><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> bar(</span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> * x, </span><span style="color:rgb(0,0,255)">int</span><span style="color:rgb(0,0,0)"> * y) {</span></div><div><span style="color:rgb(0,0,0)">    </span><span style="color:rgb(0,0,255)">return</span><span style="color:rgb(0,0,0)"> called(x, x, y) + *x + *y;</span></div><div><span style="color:rgb(0,0,0)">}</span></div></div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><br></div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)">Which becomes:</div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><br></div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)">
<div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div><span style="color:rgb(0,0,255)">define</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">dso_local</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">@called</span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">noalias</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">2</span><span style="color:rgb(0,0,0)">) </span><span style="color:rgb(0,128,128)">local_unnamed_addr</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">#0</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">7</span><span style="color:rgb(0,0,0)"> {</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%4</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">19</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%5</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">24</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%6</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">nsw</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">5</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">25</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%7</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">2</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">26</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%8</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">nsw</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">6</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">27</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(0,0,255)">ret</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">8</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">28</span></div><div><span style="color:rgb(0,0,0)">}</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,255)">define</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">dso_local</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">@foo</span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">) </span><span style="color:rgb(0,128,128)">local_unnamed_addr</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">#0</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">29</span><span style="color:rgb(0,0,0)"> {</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%3</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">36</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%4</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">37</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%5</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">3</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%6</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">shl</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">5</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(9,136,90)">1</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%7</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">6</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">3</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">38</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(0,0,255)">ret</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">39</span></div><div><span style="color:rgb(0,0,0)">}</span></div><div><span style="color:rgb(0,0,0)"><br></span></div><div><span style="color:rgb(0,0,255)">define</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">dso_local</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">@bar</span><span style="color:rgb(0,0,0)">(</span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(0,128,128)">nocapture</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">readonly</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">) </span><span style="color:rgb(0,128,128)">local_unnamed_addr</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">#0</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">40</span><span style="color:rgb(0,0,0)"> {</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%3</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">47</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">alias.scope</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">48</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%4</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">load</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)">* </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(0,128,128)">align</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">51</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">tbaa</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">20</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">noalias</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">48</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%5</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">4</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">3</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%6</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">shl</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">5</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(9,136,90)">1</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(205,49,49)">%7</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">=</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,0,255)">add</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">6</span><span style="color:rgb(0,0,0)">, </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">3</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">52</span></div><div><span style="color:rgb(0,0,0)">  </span><span style="color:rgb(0,0,255)">ret</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(0,128,128)">i32</span><span style="color:rgb(0,0,0)"> </span><span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span><span style="color:rgb(0,0,0)">, !</span><span style="color:rgb(0,128,128)">dbg</span><span style="color:rgb(0,0,0)"> !</span><span style="color:rgb(9,136,90)">53</span></div><div><span style="color:rgb(0,0,0)">}</span></div></div>

</div>

</div><div><br></div><div>The issue is that CSE just looks at two loads from the same location and goes 'hey I can combine them!' but it doesn't take into account whether either load has extra aliasing information or not. So in foo it has turned a noalias pointer into an aliasing one, but in bar it has turned an aliasing pointer into a non-aliasing one.</div><div><br></div><div>I'm not sure what the C spec says (if anything) about this, but for us we'd like the behaviour to be defined.</div><div><br></div><div>Does anyone have any opinions on solving this before I drop a patch?</div><div>Should we perhaps make the behaviour to choose (alias over non-alias, or vice versa) controllable via a hidden CSE option?</div><div>What should we do in the presence of two conflicting sets of noalias information?</div><div><br></div><div>Sidenote: I'm aware of the 'full restrict' patch that has been circulated, but irrespective of whether that lands or not we'd still like to have some defined behaviour for the above case.</div><div><br></div><div>Cheers,</div><div>-Neil.<br></div><div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><table style="border-collapse:collapse;border-spacing:0px;color:rgb(90,90,91);font-size:13px;margin:0px 0px 20px;padding:0px" width="100%" cellspacing="0" cellpadding="0" border="0"><tbody style="margin:0px;padding:0px"><tr style="margin:0px;padding:0px"><td style="border-collapse:collapse;font-size:0px;line-height:1.5em;padding:0px 0px 20px;vertical-align:top" align="left"><table style="border-collapse:collapse;border-spacing:0px;margin:0px;padding:0px" cellspacing="0" cellpadding="0" border="0" align="left"><tbody style="margin:0px;padding:0px"><tr style="margin:0px;padding:0px"><td style="border-collapse:collapse;font-size:1.12em;line-height:1.5em;padding:0px;vertical-align:top;width:64px"><img style="border:medium none currentcolor;border-radius:0px;display:block;font-size:13px;height:auto;line-height:100%;margin:0px;max-width:100%;outline-style:none;outline-width:medium;padding:20px 0px 0px;width:100%" alt="" src="https://unity3d.com/profiles/unity3d/themes/unity/images/ui/other/unity-logo-dark-email.png" width="64" height="auto"></td></tr></tbody></table></td></tr><tr style="margin:0px;padding:0px"><td style="border-collapse:collapse;font-size:0px;line-height:1.5em;padding:0px;vertical-align:top" align="left"><div style="color:rgb(0,0,0);font-family:Roboto,Arial;font-size:14px;font-weight:600;line-height:15px;margin:0px;padding:0px">Neil Henning</div></td></tr><tr style="margin:0px;padding:0px"><td style="border-collapse:collapse;font-size:0px;line-height:1.5em;padding:0px;vertical-align:top" align="left"><div style="color:rgb(0,0,0);font-family:Roboto,Arial;font-size:14px;line-height:15px;margin:0px;padding:0px 0px 10px">Senior Software Engineer Compiler</div></td></tr><tr style="margin:0px;padding:0px"><td style="border-collapse:collapse;font-size:0px;line-height:1.5em;padding:0px;vertical-align:top" align="left"><div style="color:rgb(0,0,0);font-family:Roboto,Arial;font-size:12px;line-height:15px;margin:0px;padding:0px"><a href="http://unity.com" target="_blank">unity.com</a></div></td></tr></tbody></table></div></div></div></div>