]> granicus.if.org Git - clang/commit
Patch over a really horrible bug in our vector builtins that showed up
authorChandler Carruth <chandlerc@gmail.com>
Thu, 1 Oct 2015 02:21:34 +0000 (02:21 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Thu, 1 Oct 2015 02:21:34 +0000 (02:21 +0000)
commit7b14e91805ac121e6ec0104095b703d9ffbc2641
tree7e9fb479b5175e392105df4d42d635317fb689bc
parent619bc166a16154b1b97a8605d2eb11dff8070f1e
Patch over a really horrible bug in our vector builtins that showed up
recently when we started using direct conversion to model sign
extension. The __v16qi type we use for SSE v16i8 vectors is defined in
terms of 'char' which may or may not be signed! This causes us to
generate pmovsx and pmovzx depending on the setting of -funsigned-char.

This patch just forms an explicitly signed type and uses that to
formulate the sign extension. While this gets the correct behavior
(which we now verify with the enhanced test) this is just the tip of the
ice berg. Now that I know what to look for, I have found errors of this
sort *throughout* our vector code. Fortunately, this is the only
specific place where I know of users actively having their code
miscompiled by Clang due to this, so I'm keeping the fix for those users
minimal and targeted.

I'll be sending a proper email for discussion of how to fix these
systematically, what the implications are, and just how widely broken
this is... From what I can tell, we have never shipped a correct set of
builtin headers for x86 when users rely on -funsigned-char. Oops.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@248980 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Headers/smmintrin.h
test/CodeGen/sse41-builtins.c