<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2017-04-06 17:57 GMT+02:00 Sanjoy Das <span dir="ltr"><<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Piotr,<br>
<br>
On April 6, 2017 at 2:36:53 AM, Piotr Padlewski<br>
<span class="gmail-">(<a href="mailto:piotr.padlewski@gmail.com">piotr.padlewski@gmail.com</a>) wrote:<br>
> I disagree, I find it different than the patch you mentioned. We don't have<br>
> any problems with code like this:<br>
><br>
> ptr = load i8*, i8** %ptrptr, !dereferenceable !{i64 8}<br>
> if (false) {<br>
><br>
> // ptr is not actually dereferenceable, even the load above has UB<br>
> // (since the metadata is "wrong"), but it is never executed so all is<br>
> well.<br>
> int val = *ptr;<br>
> }<br>
<br>
</span>I was not talking about code like that.  The problem is code like this:<br>
<span class="gmail-"><br>
if (false) {<br>
  ptr = load i8*, i8** %ptrptr, !dereferenceable !{i64 8, !"GlobalProperty}<br>
  // ptr is not actually dereferenceable, even the load above has UB<br>
  // (since the metadata is "wrong"), but it is never executed so all is well.<br>
  int val = *ptr;<br>
}<br>
<br>
</span>I did not mention this earlier, but I've assumed that %ptrptr itself<br>
is dereferenceable, which means you can hoist the load of ptr.  Since<br>
because of !"GlobalProperty" you don't strip the !dereferenceable,<br>
you'll also be able to hoist the load of val, which would segfault<br>
because ptr was not dereferenceable.<br>
<br>
That is, with the !"GlobalProperty" bit in the picture, it is possible<br>
to make "if (false) { X }" introduce UB in a program for certain<br>
values of X.<br>
<span class="gmail-HOEnZb"><font color="#888888"><br></font></span></blockquote><div>Hi Sanjoy, </div><div>My point is that this it is exactly the same way as normal !dereferenceable introduces UB.</div><div><br></div><div> ptr = load i8*, i8** %ptrptr, !dereferenceable !{i64 8}</div><div> if (false) {<br>  int val = *ptr;<br>  }<br></div><div><br></div><div>If frontend says that something is dereferenceable, which is not actually dereferenceable,  then it is UB and everything can happen - like the execution of dead instruction. </div><div>This is exactly the same with the global properties - we are giving a guarantee that pointer it is dereferenceable even if we would hoist or sink it, and if it is not true then it is UB.</div><div><br></div><div>I don't see why UB with normal dereferenceable is acceptable, but having this property globally is not.</div><div><br></div><div> </div></div></div></div>