[LLVMdev] SIMD instructions and memory alignment on X86

Peter Newman peter at uformia.com
Tue Jul 16 18:39:57 PDT 2013


Hello all,

I'm currently in the process of debugging a crash occurring in our 
program. In LLVM 3.2 and 3.3 it appears that JIT generated code is 
attempting to perform access unaligned memory with a SSE2 instruction. 
However this only happens under certain conditions that seem (but may 
not be) related to the stacks state on calling the function.

Our program acts as a front-end, using the LLVM C++ API to generate a 
JIT generated function. This function is primarily mathematical, so we 
use the Vector types to take advantage of SIMD instructions (as well as 
a few SSE2 intrinsics).

This worked in LLVM 2.8 but started failing in 3.2 and has continued to 
fail in 3.3. It fails with no optimizations applied to the LLVM 
Function/Module. It crashes with what is reported as a memory access 
error (accessing 0xffffffff), however it's suggested that this is how 
the SSE fault raising mechanism appears.

The generated instruction varies, but it seems to often be similar to (I 
don't have it in front of me, sorry):
movapd xmm0, xmm[ecx+0x???????]
Where the xmm register changes, and the second parameter is a memory access.
ECX is always set to 0x7ffffff - however I don't know if this is part of 
the SSE error reporting process or is part of the situation causing the 
error.

I haven't worked out exactly what code path etc is causing this crash. 
I'm hoping that someone can tell me if there were any changed 
requirements for working with SIMD in LLVM 3.2 (or earlier, we haven't 
tried 3.0 or 3.1). I currently suspect the use of GlobalVariable (we 
first discovered the crash when using a feature that uses them), however 
I have attempted using setAlignment on the GlobalVariables without any 
change.

--
Peter N



More information about the llvm-dev mailing list