mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-22 20:43:44 +02:00
0c45f2a8ef
When v1i1 is legal (e.g. AVX512) the legalizer can reach a case where a v1i1 SETCC with an illgeal vector type operand wasn't scalarized (since v1i1 is legal) but its operands does have to be scalarized. This used to assert because SETCC was missing from the vector operand scalarizer. This patch attemps to teach the legalizer to handle these cases by scalazring the operands, converting the node into a scalar SETCC node. Differential revision: https://reviews.llvm.org/D36651 llvm-svn: 311071
53 lines
1.9 KiB
LLVM
53 lines
1.9 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mattr=+avx512f | FileCheck %s
|
|
; RUN: llc < %s -mattr=+avx512f,+avx512vl,+avx512bw,+avx512dq | FileCheck %s
|
|
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
define void @test() local_unnamed_addr {
|
|
; CHECK-LABEL: test:
|
|
; CHECK: # BB#0:
|
|
; CHECK-NEXT: vmovdqa {{.*#+}} xmm0 = [2,3]
|
|
; CHECK-NEXT: vpextrq $1, %xmm0, %rax
|
|
; CHECK-NEXT: vmovq %xmm0, %rcx
|
|
; CHECK-NEXT: negq %rdx
|
|
; CHECK-NEXT: fld1
|
|
; CHECK-NEXT: fldz
|
|
; CHECK-NEXT: fld %st(0)
|
|
; CHECK-NEXT: fcmove %st(2), %st(0)
|
|
; CHECK-NEXT: cmpq %rax, %rcx
|
|
; CHECK-NEXT: fld %st(1)
|
|
; CHECK-NEXT: fcmove %st(3), %st(0)
|
|
; CHECK-NEXT: cmpq %rax, %rax
|
|
; CHECK-NEXT: fld %st(2)
|
|
; CHECK-NEXT: fcmove %st(4), %st(0)
|
|
; CHECK-NEXT: movl $1, %eax
|
|
; CHECK-NEXT: cmpq %rax, %rax
|
|
; CHECK-NEXT: fld %st(3)
|
|
; CHECK-NEXT: fcmove %st(5), %st(0)
|
|
; CHECK-NEXT: fstp %st(5)
|
|
; CHECK-NEXT: fxch %st(2)
|
|
; CHECK-NEXT: fadd %st(3)
|
|
; CHECK-NEXT: fxch %st(4)
|
|
; CHECK-NEXT: fadd %st(3)
|
|
; CHECK-NEXT: fxch %st(2)
|
|
; CHECK-NEXT: fadd %st(3)
|
|
; CHECK-NEXT: fxch %st(1)
|
|
; CHECK-NEXT: faddp %st(3)
|
|
; CHECK-NEXT: fxch %st(3)
|
|
; CHECK-NEXT: fstpt (%rax)
|
|
; CHECK-NEXT: fxch %st(1)
|
|
; CHECK-NEXT: fstpt (%rax)
|
|
; CHECK-NEXT: fxch %st(1)
|
|
; CHECK-NEXT: fstpt (%rax)
|
|
; CHECK-NEXT: fstpt (%rax)
|
|
%1 = icmp eq <4 x i64> <i64 0, i64 1, i64 2, i64 3>, undef
|
|
%2 = select <4 x i1> %1, <4 x x86_fp80> <x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK3FFF8000000000000000, x86_fp80 0xK3FFF8000000000000000>, <4 x x86_fp80> zeroinitializer
|
|
%3 = fadd <4 x x86_fp80> undef, %2
|
|
%4 = shufflevector <4 x x86_fp80> %3, <4 x x86_fp80> undef, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>
|
|
store <8 x x86_fp80> %4, <8 x x86_fp80>* undef, align 16
|
|
unreachable
|
|
}
|
|
|