我正在尝试在LLVM中使用结构体内的向量。我有以下C结构体定义:
struct Foo
{
uint32_t len;
uint32_t data[32] __attribute__ ((aligned (16)));
};
这里有一些LLVM代码,用于将42添加到data
字段的第3个元素中:
%Foo = type { i32, <32 x i32> }
define void @process(%Foo*) {
_L1:
%data = getelementptr %Foo* %0, i32 0, i32 1
%vec = load <32 x i32>* %data
%x = extractelement <32 x i32> %vec, i32 3
%xNew = add i32 42, %x
%vecNew = insertelement <32 x i32> %vec, i32 %xNew, i32 3
store <32 x i32> %vecNew, <32 x i32>* %data
ret void
}
然而,llc的输出似乎需要将向量对齐到128字节,这似乎很浪费,并且也是错误的(据我所知,向量应该是16字节对齐的):
.file "process.bc"
.text
.globl process
.align 16, 0x90
.type process,@function
process: # @process
.Leh_func_begin0:
# BB#0: # %_L1
movdqa 128(%rdi), %xmm0
pextrd $3, %xmm0, %eax
addl $42, %eax
pinsrd $3, %eax, %xmm0
movdqa %xmm0, 128(%rdi)
ret
.Ltmp0:
.size process, .Ltmp0-process
.Leh_func_end0:
当然,如果我也将C定义更改为在128字节处对齐数据字段,那么它就可以工作了,但是浪费124字节(与使用16字节对齐相比仅浪费12字节)似乎是不正确的。那么这里发生了什么?