<html>
  <head>
    <meta content="text/html; charset=windows-1252"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">Dear Xiangyang,
      <div><br>
      </div>
      <div>There is an LLVM pass called reg2mem which does what Diego
        suggests.  If you're not worried about efficiency, that might
        work for you.</div>
      <div><br>
      </div>
      <div>If you need to do an efficient conversion of code from SSA
        form to non-SSA form, then you need to read Efficiently
        Computing Single Static Assignment Form and the Control
        Dependence Graph by Ron Cytron, Jeane Ferrante, et. al. (I may
        have gotten the title or authors slightly wrong as I'm recalling
        this from memory).</div>
      <div><br>
      </div>
      <div>Anyway, that paper describes how to generate code from SSA
        form.  In essence, you need to do what register allocation does:
        figure out which SSA values in the same def-use chain can live
        in the same variable (because they don't conflict) and which SSA
        values must be assigned to different variables (because they are
        alive at the same time).  If you read the above paper, it should
        become clear.<br>
      </div>
      <div><br>
      </div>
      <div>Regards,</div>
      <div><br>
      </div>
      <div>John Criswell<br>
        <br>
      </div>
      <br>
      On 4/24/15 4:55 PM, Xiangyang Guo wrote:<br>
    </div>
    <blockquote
cite="mid:CAJ9s6GTHcEb+X84Xkr12XxyKS7PQqrQ08gb2wPfUSw64p=SSdg@mail.gmail.com"
      type="cite">
      <meta http-equiv="Context-Type" content="text/html; charset=UTF-8">
      <div dir="ltr">Hi, Diego,
        <div><br>
        </div>
        <div>Thanks for your quick reply. Inserting a copy instruction
          may not work here because I have a limitation of virtual
          register number. I need to assign registers with ssa form to
          registers without ssa form. I will look the source code you
          point out.</div>
        <div><br>
        </div>
        <div>Thanks</div>
        <div><br>
        </div>
        <div>Xiangyang</div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Fri, Apr 24, 2015 at 4:19 PM, Diego
          Novillo <span dir="ltr"><<a moz-do-not-send="true"
              href="mailto:dnovillo@google.com" target="_blank">dnovillo@google.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote">
            <div dir="ltr"><br>
              <div class="gmail_extra"><br>
                <div class="gmail_quote"><span class="">On Fri, Apr 24,
                    2015 at 3:17 PM, Xiangyang Guo <span dir="ltr"><<a
                        moz-do-not-send="true"
                        href="mailto:xguo6@ncsu.edu" target="_blank">xguo6@ncsu.edu</a>></span>
                    wrote:<br>
                    <blockquote class="gmail_quote">
                      <div dir="ltr">Hi,
                        <div><br>
                        </div>
                        <div>I want to convert LLVM IR to another type
                          of IR, which has no SSA form. So the most
                          important thing I need to handle is Phi node
                          and register allocation because another type
                          of IR has a limitation of virtual register
                          number. The first thing I can think about is
                          to learn how LLVM Backend works because LLVM
                          Backend handles these things. But I'm not
                          familiar with Backend. After reading some
                          source code and online tutorials, I think a
                          Backend is too much for my purpose. I really
                          appreciate that if someone can give me hints. </div>
                      </div>
                    </blockquote>
                    <div><br>
                    </div>
                  </span>
                  <div>The easiest way to think about PHI nodes is to
                    consider them copies on CFG edges.  If you do the
                    naive translation of inserting a copy instruction on
                    the corresponding edge for each PHI argument, you'll
                    get a rough approximation for the corresponding
                    normal form.</div>
                  <div><br>
                  </div>
                  <div>This is, of course, very inefficient, but it's
                    the main idea.</div>
                  <div><br>
                  </div>
                  <div>If you can look at GCC's source code, take a look
                    at the algorithm in file gcc/tree-outof-ssa.c.  That
                    implements an SSA->Normal transformation. I'm not
                    really sure where in the LLVM's backend this is
                    done.</div>
                  <span class="HOEnZb">
                    <div><br>
                    </div>
                    <div><br>
                    </div>
                    <div>Diego.</div>
                  </span></div>
              </div>
            </div>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
      <pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a>
</pre>
    </blockquote>
    <br>
    <br>
    <pre class="moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell">http://www.cs.rochester.edu/u/criswell</a></pre>
  </body>
</html>