mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-29 23:12:55 +01:00
b47be624ea
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 llvm-svn: 194542
43 lines
1.0 KiB
LLVM
43 lines
1.0 KiB
LLVM
; RUN: llc -march=x86-64 -mcpu=corei7 < %s | FileCheck %s -check-prefix=SSE4
|
|
; RUN: llc -march=x86-64 -mcpu=corei7-avx < %s | FileCheck %s -check-prefix=AVX1
|
|
; RUN: llc -march=x86-64 -mcpu=core-avx2 < %s | FileCheck %s -check-prefix=AVX2
|
|
|
|
define <16 x i16> @split16(<16 x i16> %a, <16 x i16> %b, <16 x i8> %__mask) {
|
|
; SSE4-LABEL: split16:
|
|
; SSE4: pminuw
|
|
; SSE4: pminuw
|
|
; SSE4: ret
|
|
; AVX1-LABEL: split16:
|
|
; AVX1: vpminuw
|
|
; AVX1: vpminuw
|
|
; AVX1: ret
|
|
; AVX2-LABEL: split16:
|
|
; AVX2: vpminuw
|
|
; AVX2: ret
|
|
%1 = icmp ult <16 x i16> %a, %b
|
|
%2 = select <16 x i1> %1, <16 x i16> %a, <16 x i16> %b
|
|
ret <16 x i16> %2
|
|
}
|
|
|
|
define <32 x i16> @split32(<32 x i16> %a, <32 x i16> %b, <32 x i8> %__mask) {
|
|
; SSE4-LABEL: split32:
|
|
; SSE4: pminuw
|
|
; SSE4: pminuw
|
|
; SSE4: pminuw
|
|
; SSE4: pminuw
|
|
; SSE4: ret
|
|
; AVX1-LABEL: split32:
|
|
; AVX1: vpminuw
|
|
; AVX1: vpminuw
|
|
; AVX1: vpminuw
|
|
; AVX1: vpminuw
|
|
; AVX1: ret
|
|
; AVX2-LABEL: split32:
|
|
; AVX2: vpminuw
|
|
; AVX2: vpminuw
|
|
; AVX2: ret
|
|
%1 = icmp ult <32 x i16> %a, %b
|
|
%2 = select <32 x i1> %1, <32 x i16> %a, <32 x i16> %b
|
|
ret <32 x i16> %2
|
|
}
|