SelectionDAG: Teach the legalizer to split SETCC if VSELECT needs splitting too.
authorJuergen Ributzka <juergen@apple.com>
Wed, 13 Nov 2013 01:57:54 +0000 (01:57 +0000)
committerJuergen Ributzka <juergen@apple.com>
Wed, 13 Nov 2013 01:57:54 +0000 (01:57 +0000)
commitc7e77f91fecd662b198939a9a8ee0a0cc3828fc4
tree10b8c447404b770e3ab436452f5fedafebedc151
parentcfe36cb02a4c2d99fd2ea0892e7b2668f2df2b8b
SelectionDAG: Teach the legalizer to split SETCC if VSELECT needs splitting too.

This patch reapplies r193676 with an additional fix for the Hexagon backend. The
SystemZ backend has already been fixed by r194148.

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. 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@194542 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
lib/CodeGen/SelectionDAG/LegalizeTypesGeneric.cpp
lib/Target/Hexagon/HexagonISelLowering.h
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/X86/vec_split.ll [new file with mode: 0644]