<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 28, 2015 at 8:53 PM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><span class="">
    <div>On 01/28/2015 07:02 AM, Sean Silva
      wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">Could you maybe provide an example where replacing
        `%always_poison` with `undef` will change the meaning? At least
        for me, the thing that I'm most unclear about is how poison
        differs from undef.</div>
    </blockquote></span>
    I will second this request for much the same reason.</div></blockquote><div><br></div><div>undef isn't strong enough to perform the simplification "a + 1 > a  -->  true" for an nsw add.</div><div><br></div><div>If we use undef instead of poison, "a + 1" will produce undef iff a is MAX_INT, but we cannot choose a bit-pattern for the undef result that is greater than MAX_INT. In other words, as David said, the comparison 
<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;display:inline!important;background-color:rgb(255,255,255)"><span class=""> </span>"icmp gt i32 undef, MAX_INT"</span>

is always true, just as "and i32 undef, 0" always produces 0.</div><div><br></div><div>I've been discussing a model with David that might steer poison back towards something that simply supports algebraic simplification. If we have a math operation that cannot wrap, then it notionally produces as many bits of undef as the operation could possibly produce. For example, "add nsw i8" can produce an i9 undef, and "mul nsw i8" can produce an undefined 16 bit bitpattern. This is strong enough to do things like "a + 1 > a  -->  true", because on overflow of "a + 1" we can choose an poison value of "MAX_INT + 1", even though that is not a valid i8 bit pattern.</div><div><br></div><div>So, a short version would be that poison is like undef, except you get to include the overflow bits of the computation in your undef value.</div></div></div></div>