aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/BranchFolding.cpp
diff options
context:
space:
mode:
authorStepan Dyatkovskiy <stpworld@narod.ru>2012-08-20 07:57:06 +0000
committerStepan Dyatkovskiy <stpworld@narod.ru>2012-08-20 07:57:06 +0000
commit08da177c355dcde40dbe6c0a21b26956fcbca32c (patch)
tree188b2acf0d06a64d09822dab245f66fdc76c5549 /lib/CodeGen/BranchFolding.cpp
parent75d8ad461f1ab7542123086d51e61530a5229d9a (diff)
downloadexternal_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