[LLVMdev] Alignments in LLVM IR
John Criswell
criswell at illinois.edu
Tue Apr 15 08:04:45 PDT 2014
On 4/15/14, 5:41 AM, Jera Hensel wrote:
> Hello,
>
> I am currently writing my Master's Thesis on a topic regarding the
> analysis of memory safety and termination of LLVM programs.
Cool. Have you checked out the Memory Safety Menagerie?
http://sva.cs.illinois.edu/menagerie/
> This includes alignments in LLVM IR, but I am not sure if I understand
> their semantics correctly. I have written a program (see attachment)
> which uses the instruction
>
> store i32 1, i32* %7, align 4
>
> to store an integer at an address that I forced to be uneven, and
> compiled it with clang. The result is that the integer is stored
> exactly there, which I expected for alignment 1 but not for alignment
> 4. Changing the alignment to any other size does not have any effect.
>
> This leads to my questions:
>
> - Do alignments provide additional semantics to be obeyed by the
> compiler or are they just hints that can be ignored?
According to the language reference manual, having a dynamic pointer
value that isn't aligned at the specified alignment is undefined
behavior. The alignment is designed as a hint to the code generator
that it can assume that the address will be at the specified alignment
so that it can generate more efficient code. This is useful on
processors that have different memory access instructions for different
word sizes (I think ARM is an example; I am sure there are others).
> - What is the semantics of alignments from the perspective of an IR
> analyzer as opposed to an IR emitter?
From your perspective, there's undefined behavior if the address in the
load or store isn't aligned at the proper boundary. That said, you can
probably cheat a little bit and look at what the code generator will
do. On x86, for example, the alignment probably doesn't matter as
nearly all x86 memory access instructions can access any alignment; the
memory access may simply be slower than necessary.
> - Can you give me an example where wrong alignments lead to undefined
> behavior?
On some processors, there are different memory access instructions for
accessing memory of difference sizes and alignments. Using an address
that isn't aligned properly would cause a fault. I think ARM does this.
Regards,
John Criswell
>
> Kind regards,
> Jera
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140415/538d9f94/attachment.html>
More information about the llvm-dev
mailing list