diff options
author | Sebastian Pop <spop@codeaurora.org> | 2012-11-30 19:08:04 +0000 |
---|---|---|
committer | Sebastian Pop <spop@codeaurora.org> | 2012-11-30 19:08:04 +0000 |
commit | cb4953089bb845afedeaaf5dfd03d8d5639fd656 (patch) | |
tree | b6d1717ceedc59f6961b8211130f37e6887cdd1e /lib/Transforms/Vectorize/LoopVectorize.cpp | |
parent | 75cbb00727329ad11d5900d70c9f5d05cb375e65 (diff) |
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>.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169024 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Vectorize/LoopVectorize.cpp')
0 files changed, 0 insertions, 0 deletions