[LLVMdev] LoadInst::getAlignment

Duncan Sands baldrick at free.fr
Mon Sep 3 02:03:00 PDT 2012


Hi Jonathan,

> I’m just diving into LLVM.  What does it mean when LoadInst::getAlignment()
> returns 0?  Unknown alignment, use default alignment of the type for the load,
> something else?

from the LangRef (load instruction):

The optional constant align argument specifies the alignment of the operation 
(that is, the alignment of the memory address). A value of 0 or an omitted align 
argument means that the operation has the preferential alignment for the target. 
It is the responsibility of the code emitter to ensure that the alignment 
information is correct. Overestimating the alignment results in undefined 
behavior. Underestimating the alignment may produce less efficient code. An 
alignment of 1 is always safe.

Ciao, Duncan.

>
> In particular, clang  appears to set to 0 the alignment of the load instruction
> that results from accessing the lvalue returned by a call.  Is this the intended
> behavior?
>
> For example:
>
> const double &foo(void *p);
>
> double ans;
>
> void bar()
>
> {
>
>     ans = foo(0);
>
> }
>
> Produces:
>
> target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
>
> 2:32:32-f64:64:64-v64:64:64-v128:64:128-a0:0:64-n32-S64"
>
> target triple = "armv4t---eabi"
>
> @ans = global double 0.000000e+00, align 8
>
> define void @_Z3barv() {
>
> entry:
>
>    %call = call double* @_Z3fooPv(i8* null)
>
>    %0 = load double* %call
>
>    store double %0, double* @ans, align 8
>
>    ret void
>
> }
>
> declare double* @_Z3fooPv(i8*)
>
> Notice that the load does not have an alignment specification.
>
> Thanks for your help,
>
> Jon
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>




More information about the llvm-dev mailing list