<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">Hi,<br>
      I'm not sure. But in your lowered DAG the chain nodes are the
      first operands for you custom nodes, however for the other nodes
      the chain is the last operand. I seem to remember that during
      targetlowering the chain is the first operand and then it seems to
      switch over after ISelDAG, this confused me and may have something
      to do with the issue that you are seeing. I really don't know much
      about scheduling, do you want to post your instruction definitions
      again to see if someone else has some ideas,.<br>
      <br>
      cheers,<br>
      sam<br>
      <pre class="moz-signature" cols="72">Sam Parker
Research Student
Electronic System Design Group
School of Electronic, Electrical and Systems Engineering
Loughborough University
UK
</pre>
      On 01/09/14 14:35, Dmitri Kovalenko wrote:<br>
    </div>
    <blockquote
cite="mid:CAF+j+H_0DUku_QeuYBiBWM4=ZprM2xucX-v3FvGXaOep8UciuA@mail.gmail.com"
      type="cite">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <div dir="ltr">
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div>Before I wrote here, I tried both ways you
                    decsribed, but none of them has worked out for me.<br>
                  </div>
                  With yours sugesstions I was able to move a bit
                  further with the first approach (when we don't create
                  regclass and just hard-code it in .td)<br>
                  <br>
                </div>
                But I still receive strange errors. I received DAG which
                I happy with (DAG here: <a moz-do-not-send="true"
                  href="http://goo.gl/62tpkk">http://goo.gl/62tpkk</a>),
                but everything goes broken on scheduling.<br>
                <br>
              </div>
              I had to chain mine nodes, because otherwise nodes xmac
              and srxacc got removed on first combine. But since they
              are chained, they have MVT::Other return type, and that
              causes strange crash inside func GetCostFor in
              ScheduleDAGRRList.cpp:<br>
              <br>
              Def RegClass = TLI->getRepRegClassFor(VT)->getID();<br>
            </div>
            When VT is MVT::Other it returns 0x0, what results crash.<br>
            <br>
          </div>
          It got me confused, because reading documentation on CodeGen
          gave me an idea, that chain edges are control flow edges, not
          data edges. So I don't understand why scheduler tries to
          assign some register to it.<br>
          <br>
        </div>
        I'm struggling with this problem way to long for now, and I very
        appreciate yours help, Sam.<br>
        <div>
          <div>
            <div>
              <div>
                <div>
                  <div><br>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <br>
        <div class="gmail_quote">
          2014-09-01 1:50 GMT+04:00 Sam Parker <span dir="ltr"><<a
              moz-do-not-send="true" href="mailto:S.Parker3@lboro.ac.uk"
              target="_blank">S.Parker3@lboro.ac.uk</a>></span>:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            Hi,<br>
            <br>
            Yes, that's what I would do. If you want LLVM and the
            register allocator to also know that the instruction
            explicitly defines the register, I would designate the
            register into it's own register class and have your
            instruction write to that class (and there will be only a
            single option for RA).<br>
            <br>
            cheers,<br>
            <div class="">Sam<br>
              <br>
              Sam Parker<br>
              Research Student<br>
              Electronic Systems Design Group<br>
            </div>
            Loughborough University<br>
            UK<br>
            <br>
            ________________________________________<br>
            From: Dmitri Kovalenko [<a moz-do-not-send="true"
              href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a>]<br>
            Sent: 31 August 2014 21:53<br>
            To: Sam Parker<br>
            Cc: <a moz-do-not-send="true"
              href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><br>
            Subject: Re: [LLVMdev] understanding DAG: node creation<br>
            <div class=""><br>
              Sam, thanks for your answer.<br>
              That's a great suggestion.<br>
              <br>
              And excuse me for maybe dilettante question:<br>
              To hard-code use of the global register means to hard-code
              it in the 'asm string' argument of the instruction
              definition in the .td file?<br>
              <br>
              <br>
            </div>
            2014-09-01 0:44 GMT+04:00 Sam Parker <<a
              moz-do-not-send="true" href="mailto:S.Parker3@lboro.ac.uk">S.Parker3@lboro.ac.uk</a><mailto:<a
              moz-do-not-send="true" href="mailto:S.Parker3@lboro.ac.uk">S.Parker3@lboro.ac.uk</a>>>:<br>
            <div class="im HOEnZb">Hi Dmitri,<br>
              <br>
              If you have such a simple intrinsic which operates on a
              single register,  just lower the intrinsic to a target
              specific node which is only implemented by a single
              instruction. Like you were doing before and by using a
              chain operand. Hard code the instruction to use and define
              the global register and only pass the instruction the
              actual variable argument.<br>
              <br>
              Hope that helps,<br>
              Sam<br>
              <br>
              Sam Parker<br>
              Research Student<br>
              Electronic Systems Design Group<br>
              School of Electronic, Electrical and Systems Engineering<br>
              Loughborough University<br>
              <br>
              ----- Reply message -----<br>
            </div>
            <div class="HOEnZb">
              <div class="h5">From: "Dmitri Kovalenko" <<a
                  moz-do-not-send="true"
                  href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a><mailto:<a
                  moz-do-not-send="true"
                  href="mailto:dmitri.a.kovalenko@gmail.com">dmitri.a.kovalenko@gmail.com</a>>><br>
                To: <<a moz-do-not-send="true"
                  href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><mailto:<a
                  moz-do-not-send="true"
                  href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a>>><br>
                Subject: [LLVMdev] understanding DAG: node creation<br>
                Date: Sat, Aug 30, 2014 22:18<br>
                <br>
                <br>
                I have an intrinsic and it must be lowered to
                instruction, which works with fixed register.<br>
                So, it takes contents of this register and another
                argument as input. After execution, the result of the
                instruction is placed into that same fixed register.<br>
                <br>
                What should I do in
                SelectionDAGBuilder::visitIntrinicCall to describe such
                behaviour for a SDNode?<br>
                <br>
                Thank you for the ideas and insights.<br>
                <br>
                --<br>
                Sincerely,<br>
                Dmitri Kovalenko<br>
                <br>
                <br>
                <br>
                --<br>
                Sincerely,<br>
                Dmitri Kovalenko</div>
            </div>
          </blockquote>
        </div>
        <br>
        <br clear="all">
        <br>
        -- <br>
        <div>Sincerely,</div>
        <div>Dmitri Kovalenko</div>
      </div>
    </blockquote>
    <br>
  </body>
</html>