<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Mar 14, 2017 at 9:59 PM, vivek pandya <span dir="ltr"><<a href="mailto:vivekvpandya@gmail.com" target="_blank">vivekvpandya@gmail.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 dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="gmail-">On Tue, Mar 14, 2017 at 7:19 PM, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</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"><span>
    <p><br>
    </p>
    <div class="gmail-m_-893470938952784482m_4013586522218816313moz-cite-prefix">On 03/14/2017 07:16 AM, vivek pandya
      wrote:<br>
    </div>
    <blockquote type="cite">
      
      <div dir="ltr">Hello Hal,
        <div>setCondCodeAction(expand) for un ordered comparison
          generates semantically wrong code for me for example SETUNE
          gets converted to SETOE that causes infinite loops.</div>
      </div>
    </blockquote>
    <br></span>
    Can you please explain what is happening? It sounds like a bug we
    should fix.<span><br>
    <br></span></div></blockquote></span><div>I don't think it is LLVM bug but I am missing some thing or I have not implemented something related properly.</div><div>But I will experiment it with and let you my findings.</div><span class="gmail-"><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"><span>
    <blockquote type="cite">
      <div dir="ltr">
        <div><br>
        </div>
        <div>What is ideal place where I can convert unordered
          comparison to un comparison + OR + ordered comparison ?</div>
        <div>Can I do it by adding required SDNodes ?</div>
        <div>for example I am trying to do it in LowerBR_CC as shown
          below:</div>
        <div>
          <div>      getFPCCtoMBCC(CC,TCC);</div>
          <div>      TargetCC = DAG.getConstant(TCC, dl, MVT::i8);</div>
          <div>      Flag = DAG.getNode(XXXISD::FCMP, dl, MVT::Glue,
            LHS, RHS,</div>
          <div>                         TargetCC);</div>
          <div>      if (isUnordered) {</div>
          <div>      TCC = XXX::COND_UN;</div>
          <div>      TargetCC = DAG.getConstant(TCC, dl, MVT::i8);</div>
          <div>      SDValue UnComp = DAG.getNode(XXX::FCMP, dl,
            MVT::Glue, LHS, RHS,</div>
          <div>                                   TargetCC);</div>
          <div>      Flag = DAG.getNode(ISD::OR, dl, MVT::Glue, Flag,
            UnComp);</div>
          <div>      }</div>
        </div>
        <div>but here I can't OR 2 MVT::Glue value.</div>
        <div>How can I compare results of two fcmp SDValue objs?</div>
      </div>
    </blockquote>
    <br></span>
    If your FCMP node sets some register, you'd need to read it
    (DAG.getCopyFromReg).</div></blockquote></span></div></div></div></blockquote><div>Hey Hal,</div><div>I have few questions here,</div><div>Do you here mean FCMP sets any physical register ? Because as per my understanding getCopyFromReg() requires a reg operand to copy from. </div><div>What if it set some virtual register? Then how to use getCopyFromReg() method?</div><div><br></div><div>getCopyFromReg() requires a Chain operand so I have to make FCMP both Chain and Glue (by using <a class="gmail-code" href="http://llvm.org/docs/doxygen/html/structllvm_1_1SDVTList.html" title="This represents a list of ValueType's that has been intern'd by a SelectionDAG." style="font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253);color:rgb(70,101,162);text-decoration:none">SDVTList</a><span style="color:rgb(0,0,0);font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253)"> VTs = </span><a class="gmail-code" href="http://llvm.org/docs/doxygen/html/classllvm_1_1SelectionDAG.html#a196c23d6cb4d768d037970f1f35bbf66" title="Return an SDVTList that represents the list of values specified." style="font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253);color:rgb(70,101,162);text-decoration:none">getVTList</a><span style="color:rgb(0,0,0);font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253)">(</span><a class="gmail-code" href="http://llvm.org/docs/doxygen/html/classllvm_1_1MVT.html#afd69b4f2dff97a2d7c0192cc769ef50ca62a222acce6360abd2726719fabc2797" style="font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253);color:rgb(70,101,162);text-decoration:none">MVT::Other</a><span style="color:rgb(0,0,0);font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253)">, </span><a class="gmail-code" href="http://llvm.org/docs/doxygen/html/classllvm_1_1MVT.html#afd69b4f2dff97a2d7c0192cc769ef50ca59a1908cf136662bcfdc11ed49515ca9" style="font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253);color:rgb(70,101,162);text-decoration:none">MVT::Glue</a><span style="color:rgb(0,0,0);font-family:monospace,fixed;font-size:9pt;background-color:rgb(251,252,253)">))</span> right ?</div><div><br></div><div>Sincerely,</div><div>Vivek</div><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 dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>Ok I will see some examples for getCopyFromReg().</div><div><br></div><div>Thanks,</div><div>Vivek </div><div><div class="gmail-h5"><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"><span class="gmail-m_-893470938952784482HOEnZb"><font color="#888888"><br>
    <br>
     -Hal</font></span><div><div class="gmail-m_-893470938952784482h5"><br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div><br>
        </div>
        <div>Please provide some guidance.</div>
        <div><br>
        </div>
        <div>Sincerely,</div>
        <div>Vivek</div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Thu, Mar 9, 2017 at 10:29 PM, vivek
          pandya <span dir="ltr"><<a href="mailto:vivekvpandya@gmail.com" target="_blank">vivekvpandya@gmail.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 dir="ltr"><br>
              <div class="gmail_extra"><br>
                <div class="gmail_quote">
                  <div>
                    <div class="gmail-m_-893470938952784482m_4013586522218816313h5">On Thu, Mar 9, 2017 at 9:35 PM, Hal
                      Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</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">
                          <div>
                            <div class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101h5">
                              <p><br>
                              </p>
                              <div class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072moz-cite-prefix">On
                                02/25/2017 03:06 AM, vivek pandya via
                                llvm-dev wrote:<br>
                              </div>
                              <blockquote type="cite">
                                <div dir="ltr">
                                  <div>Note: Question is written after
                                    describing what I have coded.<br>
                                  </div>
                                  <div><br>
                                  </div>
                                  <div>Hello LLVMDevs,</div>
                                  <div><br>
                                  </div>
                                  <div>I am trying to impliment floating
                                    point comparsion for an architecture
                                    which</div>
                                  <div>supports following type of
                                    floating point comparision if FPU is
                                    available:</div>
                                  <div>fcmp.un --> true if one of the
                                    operand is NaN</div>
                                  <div><a href="http://fcmp.lt" target="_blank">fcmp.lt</a> -->
                                    ordered less than, if any input NaN
                                    then return false</div>
                                  <div>fcmp.eq --> ordered equal, if
                                    any input NaN then return false</div>
                                  <div>fcmp.le --> ordered less
                                    equal, if any input NaN then return
                                    false</div>
                                  <div><a href="http://fcmp.gt" target="_blank">fcmp.gt</a> -->
                                    ordered grater than, if any input
                                    NaN then return false</div>
                                  <div><a href="http://fcmp.ne" target="_blank">fcmp.ne</a> -->
                                    ordered not equal, if any input NaN
                                    then return true</div>
                                  <div><a href="http://fcmp.ge" target="_blank">fcmp.ge</a> -->
                                    ordered grater equal, if any input
                                    NaN then return false</div>
                                  <div><br>
                                  </div>
                                  <div>When FPU is not present I need to
                                    generate a library call,</div>
                                  <div><br>
                                  </div>
                                  <div>so I have added following code in
                                    LowerBR_CC function in
                                    XXXISelLowering.cpp</div>
                                  <div><br>
                                  </div>
                                  <div>const XXXSubtarget &STI =
                                    static_cast<const
                                    XXXSubtarget&></div>
                                  <div>                                 
                                               (DAG.getSubtarget());</div>
                                  <div> XXXCC::CondCodes TCC;</div>
                                  <div> getFPCCtoXXCC(CC,TCC);</div>
                                  <div> TargetCC = DAG.getConstant(TCC,
                                    dl, MVT::i8);</div>
                                  <div> if (STI.useHardFloat()) {</div>
                                  <div>    // if fcmp instruction is
                                    available use it</div>
                                  <div>   SDValue Flag =
                                    DAG.getNode(XXXISD::FCMP, dl,
                                    MVT::Glue, LHS, RHS,</div>
                                  <div>                      TargetCC);</div>
                                  <div>   return
                                    DAG.getNode(XXXISD::BR_CC, dl,
                                    Op.getValueType(),</div>
                                  <div>                  Chain, Dest,
                                    TargetCC, Flag);</div>
                                  <div> }</div>
                                  <div> else {</div>
                                  <div>    // else generate library call</div>
                                  <div>   DAG.getTargetLoweringInfo().s<wbr>oftenSetCCOperands(DAG,
                                    MVT::f32, LHS, RHS,</div>
                                  <div>                                 
                                                     CC, dl);</div>
                                  <div><br>
                                  </div>
                                  <div>   SDValue Flag =
                                    DAG.getNode(XXXISD::CMP, dl,
                                    MVT::Glue, LHS, RHS);</div>
                                  <div><br>
                                  </div>
                                  <div>   if (!RHS.getNode()) {</div>
                                  <div>     RHS = DAG.getConstant(0, dl,
                                    LHS.getValueType());</div>
                                  <div>     TargetCC =
                                    DAG.getConstant(XXXCC::COND_NE<wbr>,
                                    dl, MVT::i8);</div>
                                  <div>   }</div>
                                  <div>   return
                                    DAG.getNode(XXXISD::BR_CC, dl,
                                    MVT::Other,</div>
                                  <div>                  Chain, Dest,
                                    TargetCC, Flag);</div>
                                  <div> }</div>
                                  <div><br>
                                  </div>
                                  <div> and code for getFPCCtoXXCC() is
                                    as following:</div>
                                  <div><br>
                                  </div>
                                  <div> static void
                                    getFPCCtoXXCC(ISD::CondCode CC,
                                    XXXCC::CondCodes &CondCode) {</div>
                                  <div>  switch (CC) {</div>
                                  <div>    default:</div>
                                  <div>      llvm_unreachable("Unknown
                                    FP condition!");</div>
                                  <div>    case ISD::SETEQ:</div>
                                  <div>    case ISD::SETOEQ:</div>
                                  <div>      CondCode = XXXCC::COND_E;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETGT:</div>
                                  <div>    case ISD::SETOGT:</div>
                                  <div>      CondCode = XXXCC::COND_GT;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETGE:</div>
                                  <div>    case ISD::SETOGE:</div>
                                  <div>      CondCode = XXXCC::COND_GE;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETOLT:</div>
                                  <div>    case ISD::SETLT:</div>
                                  <div>      CondCode = XXXCC::COND_LT;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETOLE:</div>
                                  <div>    case ISD::SETLE:</div>
                                  <div>      CondCode = XXXCC::COND_LE;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETONE:</div>
                                  <div>    case ISD::SETNE:</div>
                                  <div>      CondCode = XXXCC::COND_NE;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETUO:</div>
                                  <div>      CondCode = XXXCC::COND_UN;</div>
                                  <div>      break;</div>
                                  <div>    case ISD::SETO:</div>
                                  <div>    case ISD::SETUEQ:</div>
                                  <div>    case ISD::SETUGT:</div>
                                  <div>    case ISD::SETUGE:</div>
                                  <div>    case ISD::SETULT:</div>
                                  <div>    case ISD::SETULE:</div>
                                  <div>    case ISD::SETUNE:</div>
                                  <div>      CC =
                                    getSetCCInverse(CC,false);</div>
                                  <div>      getFPCCtoMBCC(CC,CondCode);</div>
                                  <div>      break;</div>
                                  <div>  }</div>
                                  <div>}</div>
                                  <div><br>
                                  </div>
                                  <div> I am generating wrong code when
                                    using floating point library call
                                    for </div>
                                  <div>comparions. For the following
                                    simple case:</div>
                                  <div>float branchTest(float a, float
                                    b) {</div>
                                  <div><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">      </span>float
                                    retVal;<span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">        </span></div>
                                  <div><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">      </span>if
                                    (a == b) {<span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">     </span></div>
                                  <div><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">              </span>retVal
                                    = a / b + 22.34;</div>
                                  <div><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">      </span>}</div>
                                  <div><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">      </span>return
                                    retVal;</div>
                                  <div>}</div>
                                  <div>I am getting:</div>
                                  <div>brlid<span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap"> </span>r15,__nesf2</div>
                                  <div>nop</div>
                                  <div>beqi<span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072gmail-Apple-tab-span" style="white-space:pre-wrap">  </span>r3,.LBB0_2
                                    ; r3 is return regsiter</div>
                                  <div><br>
                                  </div>
                                  <div>Now I want to understand
                                    difference between three different
                                    version of Condition</div>
                                  <div>Codes for same operation and how
                                    according to my target I should
                                    handle them.</div>
                                  <div>For example let's consider SETNE,
                                    SETONE and SETUNE so for my
                                    architecture </div>
                                  <div>I think for floating point all
                                    three are same</div>
                                </div>
                              </blockquote>
                              <br>
                            </div>
                          </div>
                          No, they're not the same. Please see:<br>
                          <br>
                            <a class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072moz-txt-link-freetext" href="http://llvm.org/docs/LangRef.html#id290" target="_blank">http://llvm.org/docs/LangRef.h<wbr>tml#id290</a><br>
                          <br>
                          which explains the difference between SETONE
                          (one) and SETUNE (une). Regarding how SETNE is
                          interpreted for FP, see the comment in the
                          definition of CondCode in
                          include/llvm/CodeGen/ISDOpcode<wbr>s.h which
                          explains, "// Don't care operations: undefined
                          if the input is a nan.".<br>
                          <br>
                          To support the unordered comparisons, if your
                          FPU has only ordered comparisons, then you
                          might need to do the underlying comparison,
                          and a NaN check, and then OR the results. I
                          think that using setCondCodeAction will cause
                          the expansions for the hardware-unsupported
                          variants to happen for you.<br>
                          <br>
                           -Hal<br>
                        </div>
                      </blockquote>
                      <div> </div>
                    </div>
                  </div>
                  <div>Thanks Hal for the guidance !</div>
                  <span class="gmail-m_-893470938952784482m_4013586522218816313HOEnZb"><font color="#888888">
                      <div><br>
                      </div>
                      <div>-Vivek </div>
                    </font></span>
                  <div>
                    <div class="gmail-m_-893470938952784482m_4013586522218816313h5">
                      <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"> <br>
                          <blockquote type="cite"><span>
                              <div dir="ltr">
                                <div> so do I need to use </div>
                                <div>getSetCCInverse() ? Also when I
                                  look at the code of </div>
                                <div>TargetLowering::softenSetCCOpe<wbr>rands
                                  I see that for some condition code it
                                  uses</div>
                                <div>getSetCCInverse() and also I am not
                                  able to understand the way it groups </div>
                                <div>condition code in switch case for
                                  example :</div>
                                <div>  case ISD::SETEQ:</div>
                                <div>  case ISD::SETOEQ:</div>
                                <div>    LC1 = (VT == MVT::f32) ?
                                  RTLIB::OEQ_F32 :</div>
                                <div>          (VT == MVT::f64) ?
                                  RTLIB::OEQ_F64 : RTLIB::OEQ_F128;</div>
                                <div>    break;</div>
                                <div>  case ISD::SETNE:</div>
                                <div>  case ISD::SETUNE:</div>
                                <div>    LC1 = (VT == MVT::f32) ?
                                  RTLIB::UNE_F32 :</div>
                                <div>          (VT == MVT::f64) ?
                                  RTLIB::UNE_F64 : RTLIB::UNE_F128;</div>
                                <div>    break;</div>
                                <div>here why SETNE and SETUNE is
                                  considered same, why SETONE is
                                  considered </div>
                                <div>differently. Is there any guideline
                                  to lower conditional code properly?</div>
                                <div><br>
                                </div>
                                <div>Sincerely,</div>
                                <div>Vivek</div>
                                <div><br>
                                </div>
                              </div>
                              <br>
                              <fieldset class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072mimeAttachmentHeader"></fieldset>
                              <br>
                            </span>
                            <pre>______________________________<wbr>_________________
LLVM Developers mailing list
<a class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>
<a class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-dev</a><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101HOEnZb"><font color="#888888">
</font></span></pre><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101HOEnZb"><font color="#888888">
    </font></span></blockquote><span class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101HOEnZb"><font color="#888888">
    

    <pre class="gmail-m_-893470938952784482m_4013586522218816313m_7239601225858991101m_-2662977842983796072moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre>
  </font></span></div>

</blockquote></div></div></div>
</div></div>
</blockquote></div>
</div>



</blockquote>
<pre class="gmail-m_-893470938952784482m_4013586522218816313moz-signature" cols="72">-- 
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory</pre></div></div></div></blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>