summaryrefslogtreecommitdiffstats
path: root/clang/lib/Serialization/ModuleManager.cpp
diff options
context:
space:
mode:
authorSebastian Pop <spop@codeaurora.org>2012-11-30 19:08:04 +0000
committerSebastian Pop <spop@codeaurora.org>2012-11-30 19:08:04 +0000
commita204f7223710403664b0412bb34ea29c328332d1 (patch)
tree2acf572f8c52c30fc58a161edfde609753023d2e /clang/lib/Serialization/ModuleManager.cpp
parent1c5f186f3047aeecc28e1a18ade6d1375708340a (diff)
downloadbcm5719-llvm-a204f7223710403664b0412bb34ea29c328332d1.tar.gz
bcm5719-llvm-a204f7223710403664b0412bb34ea29c328332d1.zip
Codegen failure for vmull with small vectors
Codegen was failing with an assertion because of unexpected vector operands when legalizing the selection DAG for a MUL instruction. The asserting code was legalizing multiplies for vectors of size 128 bits. It uses a custom lowering to try and detect cases where it can use a VMULL instruction instead of a VMOVL + VMUL. The code was looking for input operands to the MUL that had been sign or zero extended. If it found the extended operands it would drop the sign/zero extension and use the original vector size as input to a VMULL instruction. The code assumed that the original input vector was 64 bits so that after dropping the extension it would fit directly into a D register and could be used as an operand of a VMULL instruction. The input code that trigger the failure used a vector of <4 x i8> that was sign extended to <4 x i32>. It was not safe to drop the sign extension in this case because the original vector is only 32 bits wide. The fix is to insert a sign extension for the vector to reach the required 64 bit size. In this particular example, the vector would need to be sign extented to a <4 x i16>. llvm-svn: 169024
Diffstat (limited to 'clang/lib/Serialization/ModuleManager.cpp')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud