SelectionDAG: Teach the legalizer to split SETCC if VSELECT needs splitting too.
authorJuergen Ributzka <juergen@apple.com>
Wed, 30 Oct 2013 05:48:18 +0000 (05:48 +0000)
committerJuergen Ributzka <juergen@apple.com>
Wed, 30 Oct 2013 05:48:18 +0000 (05:48 +0000)
commit4eced19c505bb32dc210a18e87624f64d011894c
tree5da7c1301173763ed6b160ab2e50e90ec956a686
parent6a4860af7aedd1bec725d0e59f43f66335f9a5a5
SelectionDAG: Teach the legalizer to split SETCC if VSELECT needs splitting too.

The Type Legalizer recognizes that VSELECT needs to be split, because the type
is to wide for the given target. The same does not always apply to SETCC,
because less space is required to encode the result of a comparison. As a result
VSELECT is split and SETCC is unrolled into scalar comparisons.

This commit fixes the issue by checking for VSELECT-SETCC patterns in the DAG
Combiner. If a matching pattern is found, then the result mask of SETCC is
promoted to the expected vector mask type for the given target. This mask has
usually the same size as the VSELECT return type (except for Intel KNL). Now the
type legalizer will split both VSELECT and SETCC.

This allows the following X86 DAG Combine code to sucessfully detect the MIN/MAX
pattern. This fixes PR16695, PR17002, and <rdar://problem/14594431>.

Reviewed by Nadav

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@193676 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/vec_split.ll [new file with mode: 0644]