<div dir="ltr">Hi, <div><br></div><div>I have the below test case.<br><div>--snip--</div><div>struct st {<br></div><div> int a;<br> int b;<br>};<br><br>int * ptr;<br>int x,y;<br><br>void bar(int *x);<br><br>void foo() {<br>  struct st obj;<br>  bar(&obj.b);<br>  if(x)<br>    obj.a =x;<br>  else <br>    obj.a =y;<br><br>  for (int i=0; i<obj.a;i++)<br>    ptr[i]=i;<br>}<br></div><div>--snip--</div><div><br></div><div>LLVM IR  produced at -O3  is shown below.</div></div><div>ref: <a href="https://godbolt.org/z/WPlmfr">https://godbolt.org/z/WPlmfr</a><br></div><div><br></div><div>--Snip--</div><div><div style="background-color:rgb(255,255,254)"><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%8</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">getelementptr</span> <span style="color:rgb(0,128,128)">inbounds</span> <span style="color:rgb(0,128,128)">%<a href="http://struct.st">struct.st</a></span>, <span style="color:rgb(0,128,128)">%<a href="http://struct.st">struct.st</a></span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span>, <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(9,136,90)">0</span>, <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(9,136,90)">0</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">39</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">store</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span>, <span style="color:rgb(0,128,128)">i32</span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">8</span>, <span style="color:rgb(0,128,128)">align</span> <span style="color:rgb(9,136,90)">4</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">40</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">call</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,128,128)">@llvm.dbg.value</span>(<span style="color:rgb(0,128,128)">metadata</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(9,136,90)">0</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(9,136,90)">26</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(0,128,128)">DIExpression</span>()), !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">41</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%9</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">icmp</span> <span style="color:rgb(0,128,128)">sgt</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span>, <span style="color:rgb(9,136,90)">0</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">42</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">br</span> <span style="color:rgb(0,128,128)">i1</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">9</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">10</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">12</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">44</span></div><br><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%11</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">load</span> <span style="color:rgb(0,128,128)">i32</span>*, <span style="color:rgb(0,128,128)">i32</span>** <span style="color:rgb(0,128,128)">@ptr</span>, <span style="color:rgb(0,128,128)">align</span> <span style="color:rgb(9,136,90)">8</span>, !<span style="color:rgb(0,128,128)">tbaa</span> !<span style="color:rgb(9,136,90)">45</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">br</span> <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">13</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">44</span></div><br><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">call</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,128,128)">@llvm.lifetime.end.p0i8</span>(<span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(9,136,90)">8</span>, <span style="color:rgb(0,128,128)">i8</span>* <span style="color:rgb(0,128,128)">nonnull</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">2</span>) <span style="color:rgb(9,136,90)">#4</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">47</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">ret</span> <span style="color:rgb(0,128,128)">void</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">47</span></div><br><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%14</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">phi</span> <span style="color:rgb(0,128,128)">i64</span> [ <span style="color:rgb(9,136,90)">0</span>, <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">10</span> ], [ <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">17</span>, <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">13</span> ]</div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">call</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,128,128)">@llvm.dbg.value</span>(<span style="color:rgb(0,128,128)">metadata</span> <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">14</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(9,136,90)">26</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(0,128,128)">DIExpression</span>()), !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">41</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%15</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">getelementptr</span> <span style="color:rgb(0,128,128)">inbounds</span> <span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32</span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">11</span>, <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">14</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">48</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%16</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">trunc</span> <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">14</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i32</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">49</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">store</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">16</span>, <span style="color:rgb(0,128,128)">i32</span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">15</span>, <span style="color:rgb(0,128,128)">align</span> <span style="color:rgb(9,136,90)">4</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">49</span>, !<span style="color:rgb(0,128,128)">tbaa</span> !<span style="color:rgb(9,136,90)">33</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%17</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">add</span> <span style="color:rgb(0,128,128)">nuw</span> <span style="color:rgb(0,128,128)">nsw</span> <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">14</span>, <span style="color:rgb(9,136,90)">1</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">50</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">call</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,128,128)">@llvm.dbg.value</span>(<span style="color:rgb(0,128,128)">metadata</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">undef</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(9,136,90)">26</span>, <span style="color:rgb(0,128,128)">metadata</span> !<span style="color:rgb(0,128,128)">DIExpression</span>(<span style="color:rgb(0,128,128)">DW_OP_plus_uconst</span>, <span style="color:rgb(9,136,90)">1</span>, <span style="color:rgb(0,128,128)">DW_OP_stack_value</span>)), !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">41</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%18</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">load</span> <span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32</span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">8</span>, <span style="color:rgb(0,128,128)">align</span> <span style="color:rgb(9,136,90)">4</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">51</span>, !<span style="color:rgb(0,128,128)">tbaa</span> !<span style="color:rgb(9,136,90)">52</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%19</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">sext</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">18</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i64</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">42</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(205,49,49)">%20</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">icmp</span> <span style="color:rgb(0,128,128)">slt</span> <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">17</span>, <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">19</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">42</span></div><div style="color:rgb(0,0,0)">  <span style="color:rgb(0,0,255)">br</span> <span style="color:rgb(0,128,128)">i1</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">20</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">13</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">12</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">44</span>, !<span style="color:rgb(0,128,128)">llvm.loop</span> !<span style="color:rgb(9,136,90)">54</span></div><div style="color:rgb(0,0,0)">}</div><div style="color:rgb(0,0,0)">--Snip---</div><div style="color:rgb(0,0,0)"><br></div><div style="color:rgb(0,0,0)">Question is why the load IR and sext  IR (obj.a) is not getting hoisted out of the loop?</div><div style="color:rgb(0,0,0)">--Snip--</div><div style="color:rgb(0,0,0)"><div><span style="color:rgb(205,49,49)">%18</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">load</span> <span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32</span>* <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">8</span>, <span style="color:rgb(0,128,128)">align</span> <span style="color:rgb(9,136,90)">4</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">51</span>, !<span style="color:rgb(0,128,128)">tbaa</span> !<span style="color:rgb(9,136,90)">52</span></div><div><span style="color:rgb(205,49,49)">%19</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">sext</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">18</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i64</span>, !<span style="color:rgb(0,128,128)">dbg</span> !<span style="color:rgb(9,136,90)">42</span></div></div><div style="color:rgb(0,0,0)">--Snip</div><div style="color:rgb(0,0,0)"><br></div><div style="color:rgb(0,0,0)"><span style="color:rgb(34,34,34)">is it because the "obj.a" can alias with "ptr" ?</span><br></div>We are passing only "&obj.b" to bar. But still variable "ptr" is considered to be aliasing with "obj.a" ?<br><br>regards,<br><div style="color:rgb(0,0,0)"><span style="color:rgb(34,34,34)">Venkat.</span> <br></div></div></div></div>