[LLVMdev] MCJIT generates MOVAPS on unaligned address

Frank Winter fwinter at jlab.org
Thu Aug 7 12:42:59 PDT 2014


MCJIT when lowering to x86-64 generates a MOVAPS (Move Aligned Packed 
Single-Precision Floating-Point Values) on a non-aligned memory address:

     movaps    88(%rdx), %xmm0

where %rdx comes in as a function argument with only natural alignment 
(float*). This x86 instruction requires the memory address to be 16 byte 
aligned which 88 plus something aligned to 4 byte isn't.

Here the according IR code which was produced from the SLP vectorizer:

define void @func(float* noalias %arg0, float* noalias %arg1, float* 
noalias %arg2) {
entrypoint:
...
   %104 = getelementptr float* %arg0, i32 22
...
   %204 = bitcast float* %104 to <4 x float>*
   store <4 x float> %198, <4 x float>* %204

This in itself not wrong. However, shouldn't the lowering pass recognize 
the wrong alignment?

I am using LLVM 3.4.2 as available as source code from llvm.org.

Thanks,
Frank






More information about the llvm-dev mailing list