Files
clang-p2996/llvm/test/CodeGen/PowerPC/vec-min-max.ll
Nemanja Ivanovic 8a3d7c9cbd [PowerPC] Turn on CR-Logical reducer pass
Quite a while ago, we implemented a pass that will reduce the number of
CR-logical operations we emit. It does so by converting a CR-logical operation
into a branch. We have kept this off by default because it seemed to cause a
significant regression with one benchmark.
However, that regression turned out to be due to a completely unrelated
reason - AADB introducing a self-copy that is a priority-setting nop and it was
just exacerbated by this pass.

Now that we understand the reason for the only degradation, we can turn this
pass on by default. We have long since fixed the cause for the degradation.

Differential revision: https://reviews.llvm.org/D52431

llvm-svn: 375152
2019-10-17 18:24:28 +00:00

289 lines
8.1 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -mcpu=pwr8 \
; RUN: -verify-machineinstrs | FileCheck %s
; RUN: llc < %s -mtriple=powerpc64le-unknown-unknown -mcpu=pwr7 \
; RUN: -verify-machineinstrs | FileCheck %s --check-prefix=NOP8VEC
define <16 x i8> @getsmaxi8(<16 x i8> %a, <16 x i8> %b) {
; CHECK-LABEL: getsmaxi8:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vmaxsb 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxi8:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vmaxsb 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp sgt <16 x i8> %a, %b
%1 = select <16 x i1> %0, <16 x i8> %a, <16 x i8> %b
ret <16 x i8> %1
}
define <8 x i16> @getsmaxi16(<8 x i16> %a, <8 x i16> %b) {
; CHECK-LABEL: getsmaxi16:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vmaxsh 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxi16:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vmaxsh 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp sgt <8 x i16> %a, %b
%1 = select <8 x i1> %0, <8 x i16> %a, <8 x i16> %b
ret <8 x i16> %1
}
define <4 x i32> @getsmaxi32(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: getsmaxi32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vmaxsw 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxi32:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vmaxsw 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp sgt <4 x i32> %a, %b
%1 = select <4 x i1> %0, <4 x i32> %a, <4 x i32> %b
ret <4 x i32> %1
}
define <2 x i64> @getsmaxi64(<2 x i64> %a, <2 x i64> %b) {
; CHECK-LABEL: getsmaxi64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vmaxsd 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxi64:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xxswapd 0, 35
; NOP8VEC-NEXT: addi 3, 1, -32
; NOP8VEC-NEXT: addi 4, 1, -48
; NOP8VEC-NEXT: xxswapd 1, 34
; NOP8VEC-NEXT: stxvd2x 0, 0, 3
; NOP8VEC-NEXT: stxvd2x 1, 0, 4
; NOP8VEC-NEXT: ld 3, -24(1)
; NOP8VEC-NEXT: ld 4, -40(1)
; NOP8VEC-NEXT: ld 6, -48(1)
; NOP8VEC-NEXT: cmpd 4, 3
; NOP8VEC-NEXT: li 3, 0
; NOP8VEC-NEXT: li 4, -1
; NOP8VEC-NEXT: isel 5, 4, 3, 1
; NOP8VEC-NEXT: std 5, -8(1)
; NOP8VEC-NEXT: ld 5, -32(1)
; NOP8VEC-NEXT: cmpd 6, 5
; NOP8VEC-NEXT: isel 3, 4, 3, 1
; NOP8VEC-NEXT: std 3, -16(1)
; NOP8VEC-NEXT: addi 3, 1, -16
; NOP8VEC-NEXT: lxvd2x 0, 0, 3
; NOP8VEC-NEXT: xxswapd 36, 0
; NOP8VEC-NEXT: xxsel 34, 35, 34, 36
; NOP8VEC-NEXT: blr
entry:
%0 = icmp sgt <2 x i64> %a, %b
%1 = select <2 x i1> %0, <2 x i64> %a, <2 x i64> %b
ret <2 x i64> %1
}
define <4 x float> @getsmaxf32(<4 x float> %a, <4 x float> %b) {
; CHECK-LABEL: getsmaxf32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvmaxsp 34, 34, 35
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxf32:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xvmaxsp 34, 34, 35
; NOP8VEC-NEXT: blr
entry:
%0 = fcmp fast oge <4 x float> %a, %b
%1 = select <4 x i1> %0, <4 x float> %a, <4 x float> %b
ret <4 x float> %1
}
define <2 x double> @getsmaxf64(<2 x double> %a, <2 x double> %b) {
; CHECK-LABEL: getsmaxf64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvmaxdp 34, 34, 35
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmaxf64:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xvmaxdp 34, 34, 35
; NOP8VEC-NEXT: blr
entry:
%0 = fcmp fast oge <2 x double> %a, %b
%1 = select <2 x i1> %0, <2 x double> %a, <2 x double> %b
ret <2 x double> %1
}
define <16 x i8> @getsmini8(<16 x i8> %a, <16 x i8> %b) {
; CHECK-LABEL: getsmini8:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vminsb 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmini8:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vminsb 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp slt <16 x i8> %a, %b
%1 = select <16 x i1> %0, <16 x i8> %a, <16 x i8> %b
ret <16 x i8> %1
}
define <8 x i16> @getsmini16(<8 x i16> %a, <8 x i16> %b) {
; CHECK-LABEL: getsmini16:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vminsh 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmini16:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vminsh 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp slt <8 x i16> %a, %b
%1 = select <8 x i1> %0, <8 x i16> %a, <8 x i16> %b
ret <8 x i16> %1
}
define <4 x i32> @getsmini32(<4 x i32> %a, <4 x i32> %b) {
; CHECK-LABEL: getsmini32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vminsw 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmini32:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: vminsw 2, 2, 3
; NOP8VEC-NEXT: blr
entry:
%0 = icmp slt <4 x i32> %a, %b
%1 = select <4 x i1> %0, <4 x i32> %a, <4 x i32> %b
ret <4 x i32> %1
}
define <2 x i64> @getsmini64(<2 x i64> %a, <2 x i64> %b) {
; CHECK-LABEL: getsmini64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vminsd 2, 2, 3
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsmini64:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xxswapd 0, 35
; NOP8VEC-NEXT: addi 3, 1, -32
; NOP8VEC-NEXT: addi 4, 1, -48
; NOP8VEC-NEXT: xxswapd 1, 34
; NOP8VEC-NEXT: stxvd2x 0, 0, 3
; NOP8VEC-NEXT: stxvd2x 1, 0, 4
; NOP8VEC-NEXT: ld 3, -24(1)
; NOP8VEC-NEXT: ld 4, -40(1)
; NOP8VEC-NEXT: ld 6, -48(1)
; NOP8VEC-NEXT: cmpd 4, 3
; NOP8VEC-NEXT: li 3, 0
; NOP8VEC-NEXT: li 4, -1
; NOP8VEC-NEXT: isel 5, 4, 3, 0
; NOP8VEC-NEXT: std 5, -8(1)
; NOP8VEC-NEXT: ld 5, -32(1)
; NOP8VEC-NEXT: cmpd 6, 5
; NOP8VEC-NEXT: isel 3, 4, 3, 0
; NOP8VEC-NEXT: std 3, -16(1)
; NOP8VEC-NEXT: addi 3, 1, -16
; NOP8VEC-NEXT: lxvd2x 0, 0, 3
; NOP8VEC-NEXT: xxswapd 36, 0
; NOP8VEC-NEXT: xxsel 34, 35, 34, 36
; NOP8VEC-NEXT: blr
entry:
%0 = icmp slt <2 x i64> %a, %b
%1 = select <2 x i1> %0, <2 x i64> %a, <2 x i64> %b
ret <2 x i64> %1
}
define <4 x float> @getsminf32(<4 x float> %a, <4 x float> %b) {
; CHECK-LABEL: getsminf32:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvminsp 34, 34, 35
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsminf32:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xvminsp 34, 34, 35
; NOP8VEC-NEXT: blr
entry:
%0 = fcmp fast ole <4 x float> %a, %b
%1 = select <4 x i1> %0, <4 x float> %a, <4 x float> %b
ret <4 x float> %1
}
define <2 x double> @getsminf64(<2 x double> %a, <2 x double> %b) {
; CHECK-LABEL: getsminf64:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: xvmindp 34, 34, 35
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: getsminf64:
; NOP8VEC: # %bb.0: # %entry
; NOP8VEC-NEXT: xvmindp 34, 34, 35
; NOP8VEC-NEXT: blr
entry:
%0 = fcmp fast ole <2 x double> %a, %b
%1 = select <2 x i1> %0, <2 x double> %a, <2 x double> %b
ret <2 x double> %1
}
define i128 @invalidv1i128(<2 x i128> %v1, <2 x i128> %v2) {
; CHECK-LABEL: invalidv1i128:
; CHECK: # %bb.0:
; CHECK-NEXT: mfvsrd 3, 36
; CHECK-NEXT: xxswapd 0, 36
; CHECK-NEXT: mfvsrd 4, 34
; CHECK-NEXT: xxswapd 1, 34
; CHECK-NEXT: cmpld 4, 3
; CHECK-NEXT: cmpd 1, 4, 3
; CHECK-NEXT: mfvsrd 3, 0
; CHECK-NEXT: crandc 20, 4, 2
; CHECK-NEXT: mfvsrd 4, 1
; CHECK-NEXT: cmpld 1, 4, 3
; CHECK-NEXT: bc 12, 20, .LBB12_3
; CHECK-NEXT: # %bb.1:
; CHECK-NEXT: crand 20, 2, 4
; CHECK-NEXT: bc 12, 20, .LBB12_3
; CHECK-NEXT: # %bb.2:
; CHECK-NEXT: vmr 2, 4
; CHECK-NEXT: .LBB12_3:
; CHECK-NEXT: xxswapd 0, 34
; CHECK-NEXT: mfvsrd 4, 34
; CHECK-NEXT: mfvsrd 3, 0
; CHECK-NEXT: blr
;
; NOP8VEC-LABEL: invalidv1i128:
; NOP8VEC: # %bb.0:
; NOP8VEC-NEXT: cmpld 4, 8
; NOP8VEC-NEXT: cmpd 1, 4, 8
; NOP8VEC-NEXT: addi 5, 1, -32
; NOP8VEC-NEXT: crandc 20, 4, 2
; NOP8VEC-NEXT: cmpld 1, 3, 7
; NOP8VEC-NEXT: crand 21, 2, 4
; NOP8VEC-NEXT: cror 20, 21, 20
; NOP8VEC-NEXT: isel 3, 3, 7, 20
; NOP8VEC-NEXT: isel 4, 4, 8, 20
; NOP8VEC-NEXT: std 3, -32(1)
; NOP8VEC-NEXT: addi 3, 1, -16
; NOP8VEC-NEXT: std 4, -24(1)
; NOP8VEC-NEXT: lxvd2x 0, 0, 5
; NOP8VEC-NEXT: stxvd2x 0, 0, 3
; NOP8VEC-NEXT: ld 3, -16(1)
; NOP8VEC-NEXT: ld 4, -8(1)
; NOP8VEC-NEXT: blr
%1 = icmp slt <2 x i128> %v1, %v2
%2 = select <2 x i1> %1, <2 x i128> %v1, <2 x i128> %v2
%3 = extractelement <2 x i128> %2, i32 0
ret i128 %3
}