[LLVMdev] all LLVM Instructions that may write to memory -- other than StoreInst?
Chuck Zhao
czhao at eecg.toronto.edu
Fri Jan 21 15:00:07 PST 2011
John,
Thanks for the reply.
I agree with your comments that the "Memory" LLVM Spec refers to doesn't
include stack.
Let me leverage a bit further:
If I need to work on high-level IRs (not machine dependent, not in the
code-gen stage), is it reasonable to assume that
ALL LLVM IRs that have a result field will have potential to write stack?
E.g.
<result> = add<ty> <op1>,<op2> /; yields {ty}:result/
br i1<cond>, label<iftrue>, label<iffalse>
br label<dest> /; Unconditional branch/
ADD can (potential) write stack to store its result, while BR will NEVER
write stack because its doesn't have a result.
Thank you
Chuck
On 1/21/2011 5:33 PM, John Criswell wrote:
> On 1/21/11 2:50 PM, Chuck Zhao wrote:
>> I need to figure out all LLVM Instructions that may write to memory.
>>
>> In http://llvm.org/docs/tutorial/OCamlLangImpl7.html, it mentions that
>> "In LLVM, all memory accesses are explicit with load/store
>> instructions, and it is carefully designed not to have (or need) an
>> "address-of" operator."
>>
>> I take this as "StoreInst is the only one that writes to memory".
>
> There are intrinsic functions which write to memory also, such as memcpy.
>>
>> However, this doesn't seem to be enough.
>
> Your observation is correct. Strictly speaking, any instruction can
> write to memory after code generation because it may access a stack
> spill slot or a function parameter which the ABI places on the stack.
>
> When the Language Reference Manual talks about writing to memory, it
> is talking about writing to memory that is visible at the LLVM IR
> level. The stack frame is invisible at the LLVM IR level. Put
> another way, "memory" is a set of memory locations which can be
> explicitly accessed by LLVM load and store instructions and are not in
> SSA form; it is not all of the memory within the computer.
>
> If you're interested in finding instructions that write to RAM
> (including writes to stack spill slots), it may be better to work on
> Machine Instructions within the code generator framework.
>
> -- John T.
>
>
>>
>> Consider:
>> ...
>> int a, b, d;
>> d = a + b;
>> ...
>>
>> The above code is turned into LLVM IR:
>> %0 = load i32* @a, align 4
>> %1 = load i32* @b, align 4
>> %2 = add nsw i32 %1, %0
>> store i32 %2, i32* @d, align 4
>>
>> Is it possible that temps such as %0, %1 and/or %2 will NOT being register allocated later in the compilation stage, and thus left in memory?
>>
>> The above code, when converted back to C level, looks like this:
>> ...
>> unsigned int llvm_cbe_tmp__6;
>> unsigned int llvm_cbe_tmp__7;
>> unsigned int llvm_cbe_tmp__8;
>> unsigned int llvm_cbe_tmp__9;
>>
>> llvm_cbe_tmp__6 = *(&a);
>> llvm_cbe_tmp__7 = *(&b);
>> llvm_cbe_tmp__8 = ((unsigned int )(((unsigned int )llvm_cbe_tmp__7) + ((unsigned int )llvm_cbe_tmp__6)));
>> *(&d) = llvm_cbe_tmp__8;
>> llvm_cbe_tmp__9 = /*tail*/ printf(((&_OC_str.array[((signed int )0u)])), llvm_cbe_tmp__8);
>> ...
>>
>> It seems the compiler-generated temps are _actually_ left on stack, and writes to them are actually writes to stack memory (via load, add, ...).
>>
>>
>>
>> I am confused here.
>> Could somebody help to clarify it?
>>
>> Thank you
>>
>> Chuck
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110121/9276a7a2/attachment.html>
More information about the llvm-dev
mailing list