<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <br>
    <div class="moz-cite-prefix">On 05/02/2014 04:46 PM, Andrew Trick
      wrote:<br>
    </div>
    <blockquote
      cite="mid:7C8EBA7E-C1D6-472D-B530-46B8E21A55C5@apple.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html;
        charset=windows-1252">
      <br>
      <div>
        <div>On May 2, 2014, at 4:25 PM, Philip Reames <<a
            moz-do-not-send="true"
            href="mailto:listmail@philipreames.com">listmail@philipreames.com</a>>
          wrote:</div>
        <br class="Apple-interchange-newline">
        <blockquote type="cite"><br style="font-family: Helvetica;
            font-size: 12px; font-style: normal; font-variant: normal;
            font-weight: normal; letter-spacing: normal; line-height:
            normal; orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">I'm still not happy with hiding the
            explicit control flow, but I can achieve the same effect as:</span><br
            style="font-family: Helvetica; font-size: 12px; font-style:
            normal; font-variant: normal; font-weight: normal;
            letter-spacing: normal; line-height: normal; orphans: auto;
            text-align: start; text-indent: 0px; text-transform: none;
            white-space: normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">if( div by zero ) throw</span><br
            style="font-family: Helvetica; font-size: 12px; font-style:
            normal; font-variant: normal; font-weight: normal;
            letter-spacing: normal; line-height: normal; orphans: auto;
            text-align: start; text-indent: 0px; text-transform: none;
            white-space: normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">(r, o, d) = safe.div(a,b);</span><br
            style="font-family: Helvetica; font-size: 12px; font-style:
            normal; font-variant: normal; font-weight: normal;
            letter-spacing: normal; line-height: normal; orphans: auto;
            text-align: start; text-indent: 0px; text-transform: none;
            white-space: normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">if( o ) {</span><br style="font-family:
            Helvetica; font-size: 12px; font-style: normal;
            font-variant: normal; font-weight: normal; letter-spacing:
            normal; line-height: normal; orphans: auto; text-align:
            start; text-indent: 0px; text-transform: none; white-space:
            normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">  r = a;</span><br style="font-family:
            Helvetica; font-size: 12px; font-style: normal;
            font-variant: normal; font-weight: normal; letter-spacing:
            normal; line-height: normal; orphans: auto; text-align:
            start; text-indent: 0px; text-transform: none; white-space:
            normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">}</span><br style="font-family:
            Helvetica; font-size: 12px; font-style: normal;
            font-variant: normal; font-weight: normal; letter-spacing:
            normal; line-height: normal; orphans: auto; text-align:
            start; text-indent: 0px; text-transform: none; white-space:
            normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
          <br style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;">
          <span style="font-family: Helvetica; font-size: 12px;
            font-style: normal; font-variant: normal; font-weight:
            normal; letter-spacing: normal; line-height: normal;
            orphans: auto; text-align: start; text-indent: 0px;
            text-transform: none; white-space: normal; widows: auto;
            word-spacing: 0px; -webkit-text-stroke-width: 0px;
            background-color: rgb(255, 255, 255); float: none; display:
            inline !important;">i.e. emit a separate guard branch for
            the interesting condition and not utilize the value from the
            safe div. <span class="Apple-converted-space"> </span></span><br
            style="font-family: Helvetica; font-size: 12px; font-style:
            normal; font-variant: normal; font-weight: normal;
            letter-spacing: normal; line-height: normal; orphans: auto;
            text-align: start; text-indent: 0px; text-transform: none;
            white-space: normal; widows: auto; word-spacing: 0px;
            -webkit-text-stroke-width: 0px;">
        </blockquote>
        <div><br>
        </div>
        Oh, I was just assuming you would deopt on either div-by-zero or
        overflow in order to optimize the common case.</div>
      <div><br>
      </div>
      <div>So, the point of safe.div is that you don’t need control flow
        in the IR except to indicate the throw.</div>
      <div><br>
      </div>
      <div>(r, o, d) = safe.div(a,b)</div>
      <div>if (d) { patchpoint(throw, state) }</div>
      <div><br>
      </div>
      <div>You could also explicitly check div-by-zero but it would be
        harder to fold away that extra check during lowering.</div>
    </blockquote>
    I think I may have worded this badly.  The motivation for the
    explicit guard is to enable LICM and other branch simplifications. 
    This point is completely separate from the choice to deopt or not. 
    <br>
    <br>
    Consider the example below.  This is specifically for x86 with it's
    trapping divide.  Assume I am not utilizing traps, but need to guard
    the divide to handle the two special cases.  The exact handling of
    the edge cases isn't really significant, but the guards must exist. 
    <br>
    <br>
    Given:<br>
    void foo(int[] a, int d) {<br>
      for i = 0....a.length {<br>
        a[i] = a[i]/d<br>
      }<br>
    }<br>
    <br>
    I want:<br>
    void foo(int[]a, int d) {<br>
      // A single check here, not one per iteration<br>
      if( a.length > 0 && d == 0 ) throw;<br>
      for i = 0...a.length {<br>
        // arguably, it might be better to split the loop for d == -1<br>
        if( a[i] == INT_MIN && d == -1 ) {<br>
           continue;<br>
        }<br>
        a[i] = x86_div(a[i], d);<br>
      }<br>
    }<br>
    <br>
    Not:<br>
    void foo(int[]a, int d) {<br>
    <br>
      for i = 0...a.length {<br>
        if( a[i] == INT_MIN && d == -1 ) {<br>
           continue;<br>
        }<br>
        if( d == 0 ) throw;<br>
        a[i] = x86_div(a[i], d);<br>
      }<br>
    }<br>
    <br>
    Hopefully, this helps clarify my point.  <br>
    <br>
    Philip<br>
    <br>
  </body>
</html>