<html dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" id="owaParaStyle"></style>
</head>
<body fpstyle="1" ocsi="0">
<div style="direction: ltr;font-family: Tahoma;color: #000000;font-size: 10pt;">Using LLVM 2.9, the following LLVM IR produces invalid x86 32 bit assembly (a misaligned SSE store).
<div><br>
</div>
<div>
<div>; ModuleID = 'MisalignedStore'</div>
<div><br>
</div>
<div>define void @MisalignedStore() nounwind readnone {</div>
<div>entry:</div>
<div>  %v = alloca <4 x float>, align 16</div>
<div>  store <4 x float> zeroinitializer, <4 x float>* %v, align 16</div>
<div>  br label %post-block</div>
<div><br>
</div>
<div>post-block:</div>
<div>  %f = alloca float</div>
<div>  ret void</div>
<div>}</div>
</div>
<div><br>
</div>
<div>If I feed this to llc with -march=x86, the following is produced.  Note the 24 byte offset from ebp:</div>
<div><br>
</div>
<div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.def<span class="Apple-tab-span" style="white-space:pre">
</span>_MisalignedStore;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.scl<span class="Apple-tab-span" style="white-space:pre">
</span>2;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.type<span class="Apple-tab-span" style="white-space:pre">
</span>32;</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.endef</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.text</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.globl<span class="Apple-tab-span" style="white-space:pre">
</span>_MisalignedStore</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>.align<span class="Apple-tab-span" style="white-space:pre">
</span>16, 0x90</div>
<div>_MisalignedStore:                       # @MisalignedStore</div>
<div># BB#0:                                 # %entry</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>pushl<span class="Apple-tab-span" style="white-space:pre">
</span>%ebp</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>movl<span class="Apple-tab-span" style="white-space:pre">
</span>%esp, %ebp</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>subl<span class="Apple-tab-span" style="white-space:pre">
</span>$24, %esp</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>pxor<span class="Apple-tab-span" style="white-space:pre">
</span>%xmm0, %xmm0</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>movaps<span class="Apple-tab-span" style="white-space:pre">
</span>%xmm0, -24(%ebp)</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>movl<span class="Apple-tab-span" style="white-space:pre">
</span>$8, %eax</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>calll<span class="Apple-tab-span" style="white-space:pre">
</span>__alloca</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>movl<span class="Apple-tab-span" style="white-space:pre">
</span>%ebp, %esp</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>popl<span class="Apple-tab-span" style="white-space:pre">
</span>%ebp</div>
<div><span class="Apple-tab-span" style="white-space:pre"></span>ret</div>
</div>
<div><br>
</div>
<div><br>
</div>
<div>The code is trivial and useless, but it's a boiled down version of a real program.  Am I doing something wrong in that IR?  Note that removing the last alloca of %f or the jump to post-block both cause the resulting assembly to be correct.  Note also that
 specifying -march=x86-64 to llc results in correct code as well.  If this is a known problem and has been fixed already, can you point me at the commit?</div>
<div><br>
</div>
<div>Aaron Dwyer</div>
<div>Imagination Technologies</div>
<div><br>
</div>
</div>
</body>
</html>