[LLVMdev] Unexpected behavior reading/writing <8 x i1> vector to memory
Matt Pharr
matt.pharr at gmail.com
Tue Sep 6 16:37:30 PDT 2011
I'm seeing some behavior that surprised me in writing an <8 x i1> vector to memory and reading it back. (Specifically, the surprise is that I didn't get the original value back!). This happens both with TOT and 2.9. This program illustrates the issue:
define i32 @foo() {
%c = alloca <8 x i1>
store <8 x i1> <i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <8 x i1>* %c
%val = load <8 x i1>* %c
%vali8 = bitcast <8 x i1> %val to i8
%vali32 = zext i8 %vali8 to i32
ret i32 %vali32
}
If I run this through opt -mem2reg before compiling with llc, then I basically get:
_foo:
movl $1, %eax
ret
which looks good to me (and is the result I expect).
If I just run it through llc without mem2reg,I get this suspicious output, which returns zero.
_foo:
movb $1, -8(%rsp)
movb $0, -8(%rsp)
movzbl -8(%rsp), %eax
ret
Is this a bug? I double checked the LLVM assembly reference manual and didn't see anything about writing vectors of i1 to memory as being undefined.
(I recognize that I probably don't want to be doing this in general and wouldn't expect it to necessarily be super efficient. But this was unusual enough that it seemed worth checking about.)
Thanks,
-matt
More information about the llvm-dev
mailing list