[LLVMdev] copy instructions

Cochran, Wayne Owen wcochran at vancouver.wsu.edu
Sat Apr 23 10:57:04 PDT 2011


It is my understanding, the alloca memory routines are used
for forcing variables to be allocated on the stack frame -- which
you would want for source level debugging.
When SSA registers are used, LLVM will decide what goes into
registers and what will spill over to the stack frame.
I want the latter.
--w

Wayne O. Cochran
Assistant Professor Computer Science
wcochran at vancouver.wsu.edu



-----Original Message-----
From: Eli Friedman [mailto:eli.friedman at gmail.com]
Sent: Fri 4/22/2011 5:53 PM
To: Cochran, Wayne Owen
Cc: llvmdev at cs.uiuc.edu
Subject: Re: [LLVMdev] copy instructions
 
On Fri, Apr 22, 2011 at 10:40 AM, Wayne Cochran
<wcochran at vancouver.wsu.edu> wrote:
> This is a simple SSA code generation 101 question.
>
> If I follow the IR code generation techniques in the Dragon book the
> statement
>  x = y + z
> would translate into something like this in SSA/LLVM
>  %0 = add %y, %z
>  %x = %0
> Obviously "copy instructions" like %foo = %bar are senseless in SSA
> since %foo and %bar are immutably fixed to the same value and there
> is no need for two aliases for the same thing (this is my own observation,
> please tell me if my thinking is off).
>
> What are the general code generation techniques to avoid "copy instructions"?
>
> For example, the simple code generation methods that yield the translation
> above might look like the following:
>
> Value *AddExpression::codeGen() {
>  Value *l = left->codeGen();
>  Value *r = right->codeGen();
>  Value *result = new TempValue;  // get unique temporary
>  emit(result->str() + " add " + l->str() + ", " r-str());
>  return result;
> }
>
> Value *assignExpression::codeGen() {
>  Value *rval = rvalue->codeGen();
>  Value *lval = new NameValue(ident);
>  emit(lval->str() + " = " + rval->str());    // emit (silly) copy instruction
>  return lval;
> }
>
> What I have suggested to my students is to omit the (non-existent) copy instruction
> and use the "rval" above as a replacement for all future occurrences of "ident."
> i.e., something like the following:
>
> Value *assignExpression::codeGen() {
>  Value *rval = rvalue->codeGen();
>  update symbol table so that all future reference to "ident" are replaced with rval
>  return rval;
> }
>
> Using this scheme, the following
>  x = y + z
>  u = x * y + foo(x)
> would be translated into
>  %0 = add %y, %z
>  %1 = mul %0, %y
>  %2 = call foo(%0)
>  %3 = add %1, %2
>
>
> Is there a more obvious approach to avoiding "copy instructions"?

The recommended approach to generating LLVM IR is simply not to try to
generate code in SSA form; see
http://llvm.org/docs/tutorial/LangImpl7.html#memory .

-Eli

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110423/f74713b7/attachment.html>


More information about the llvm-dev mailing list