diff options
author | Stepan Dyatkovskiy <stpworld@narod.ru> | 2012-08-20 07:57:06 +0000 |
---|---|---|
committer | Stepan Dyatkovskiy <stpworld@narod.ru> | 2012-08-20 07:57:06 +0000 |
commit | 08da177c355dcde40dbe6c0a21b26956fcbca32c (patch) | |
tree | 188b2acf0d06a64d09822dab245f66fdc76c5549 /lib/CodeGen/BranchFolding.cpp | |
parent | 75d8ad461f1ab7542123086d51e61530a5229d9a (diff) | |
download | external_llvm-08da177c355dcde40dbe6c0a21b26956fcbca32c.zip external_llvm-08da177c355dcde40dbe6c0a21b26956fcbca32c.tar.gz external_llvm-08da177c355dcde40dbe6c0a21b26956fcbca32c.tar.bz2 |
Fixed DAGCombiner bug (found and localized by James Malloy):
The DAGCombiner tries to optimise a BUILD_VECTOR by checking if it
consists purely of get_vector_elts from one or two source vectors. If
so, it either makes a concat_vectors node or a shufflevector node.
However, it doesn't check the element type width of the underlying
vector, so if you have this sequence:
Node0: v4i16 = ...
Node1: i32 = extract_vector_elt Node0
Node2: i32 = extract_vector_elt Node0
Node3: v16i8 = BUILD_VECTOR Node1, Node2, ...
It will attempt to:
Node0: v4i16 = ...
NewNode1: v16i8 = concat_vectors Node0, ...
Where this is actually invalid because the element width is completely
different. This causes an assertion failure on DAG legalization stage.
Fix:
If output item type of BUILD_VECTOR differs from input item type.
Make concat_vectors based on input element type and then bitcast it to the output vector type. So the case described above will transformed to:
Node0: v4i16 = ...
NewNode1: v8i16 = concat_vectors Node0, ...
NewNode2: v16i8 = bitcast NewNode1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@162195 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/BranchFolding.cpp')
0 files changed, 0 insertions, 0 deletions