blob: 67fd3f4acacaae37f00f6f1de3ae1c3c424de02a [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S --passes=slp-vectorizer -mtriple=x86_64-unknown-linux -mcpu=skylake-avx512 < %s | FileCheck %s
define i32 @or_nonzero(ptr %p) {
; CHECK-LABEL: define i32 @or_nonzero(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[INPUT:%.*]] = load <8 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> [[INPUT]])
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[TMP3]], 0
; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[CMP]] to i32
; CHECK-NEXT: ret i32 [[RESULT]]
;
%input = load <8 x i8>, ptr %p, align 1
%a0 = extractelement <8 x i8> %input, i64 0
%a1 = extractelement <8 x i8> %input, i64 1
%a2 = extractelement <8 x i8> %input, i64 2
%a3 = extractelement <8 x i8> %input, i64 3
%a4 = extractelement <8 x i8> %input, i64 4
%a5 = extractelement <8 x i8> %input, i64 5
%a6 = extractelement <8 x i8> %input, i64 6
%a7 = extractelement <8 x i8> %input, i64 7
%or1 = or i8 %a0, %a1
%or2 = or i8 %or1, %a2
%or3 = or i8 %or2, %a3
%or4 = or i8 %or3, %a4
%or5 = or i8 %or4, %a5
%or6 = or i8 %or5, %a6
%or7 = or i8 %or6, %a7
%cmp = icmp ne i8 %or7, 0
%result = zext i1 %cmp to i32
ret i32 %result
}
define i32 @or_nonzero_commuted(ptr %p) {
; CHECK-LABEL: define i32 @or_nonzero_commuted(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[INPUT:%.*]] = load <8 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> [[INPUT]])
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 0, [[TMP1]]
; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[CMP]] to i32
; CHECK-NEXT: ret i32 [[RESULT]]
;
%input = load <8 x i8>, ptr %p, align 1
%a0 = extractelement <8 x i8> %input, i64 0
%a1 = extractelement <8 x i8> %input, i64 1
%a2 = extractelement <8 x i8> %input, i64 2
%a3 = extractelement <8 x i8> %input, i64 3
%a4 = extractelement <8 x i8> %input, i64 4
%a5 = extractelement <8 x i8> %input, i64 5
%a6 = extractelement <8 x i8> %input, i64 6
%a7 = extractelement <8 x i8> %input, i64 7
%or1 = or i8 %a0, %a1
%or2 = or i8 %or1, %a2
%or3 = or i8 %or2, %a3
%or4 = or i8 %or3, %a4
%or5 = or i8 %or4, %a5
%or6 = or i8 %or5, %a6
%or7 = or i8 %or6, %a7
%cmp = icmp ne i8 0, %or7
%result = zext i1 %cmp to i32
ret i32 %result
}
define i32 @or_zero(ptr %p) {
; CHECK-LABEL: define i32 @or_zero(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[INPUT:%.*]] = load <8 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> [[INPUT]])
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP3]], 0
; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[CMP]] to i32
; CHECK-NEXT: ret i32 [[RESULT]]
;
%input = load <8 x i8>, ptr %p, align 1
%a0 = extractelement <8 x i8> %input, i64 0
%a1 = extractelement <8 x i8> %input, i64 1
%a2 = extractelement <8 x i8> %input, i64 2
%a3 = extractelement <8 x i8> %input, i64 3
%a4 = extractelement <8 x i8> %input, i64 4
%a5 = extractelement <8 x i8> %input, i64 5
%a6 = extractelement <8 x i8> %input, i64 6
%a7 = extractelement <8 x i8> %input, i64 7
%or1 = or i8 %a0, %a1
%or2 = or i8 %or1, %a2
%or3 = or i8 %or2, %a3
%or4 = or i8 %or3, %a4
%or5 = or i8 %or4, %a5
%or6 = or i8 %or5, %a6
%or7 = or i8 %or6, %a7
%cmp = icmp eq i8 %or7, 0
%result = zext i1 %cmp to i32
ret i32 %result
}
define i32 @umax_nonzero(ptr %p) {
; CHECK-LABEL: define i32 @umax_nonzero(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[INPUT:%.*]] = load <8 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> [[INPUT]])
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[TMP3]], 0
; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[CMP]] to i32
; CHECK-NEXT: ret i32 [[RESULT]]
;
%input = load <8 x i8>, ptr %p, align 1
%a0 = extractelement <8 x i8> %input, i64 0
%a1 = extractelement <8 x i8> %input, i64 1
%a2 = extractelement <8 x i8> %input, i64 2
%a3 = extractelement <8 x i8> %input, i64 3
%a4 = extractelement <8 x i8> %input, i64 4
%a5 = extractelement <8 x i8> %input, i64 5
%a6 = extractelement <8 x i8> %input, i64 6
%a7 = extractelement <8 x i8> %input, i64 7
%c1 = icmp ugt i8 %a0, %a1
%m1 = select i1 %c1, i8 %a0, i8 %a1
%c2 = icmp ugt i8 %m1, %a2
%m2 = select i1 %c2, i8 %m1, i8 %a2
%c3 = icmp ugt i8 %m2, %a3
%m3 = select i1 %c3, i8 %m2, i8 %a3
%c4 = icmp ugt i8 %m3, %a4
%m4 = select i1 %c4, i8 %m3, i8 %a4
%c5 = icmp ugt i8 %m4, %a5
%m5 = select i1 %c5, i8 %m4, i8 %a5
%c6 = icmp ugt i8 %m5, %a6
%m6 = select i1 %c6, i8 %m5, i8 %a6
%c7 = icmp ugt i8 %m6, %a7
%m7 = select i1 %c7, i8 %m6, i8 %a7
%cmp = icmp ne i8 %m7, 0
%result = zext i1 %cmp to i32
ret i32 %result
}
define i32 @umax_zero_commuted(ptr %p) {
; CHECK-LABEL: define i32 @umax_zero_commuted(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[INPUT:%.*]] = load <8 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> [[INPUT]])
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 0, [[TMP1]]
; CHECK-NEXT: [[RESULT:%.*]] = zext i1 [[CMP]] to i32
; CHECK-NEXT: ret i32 [[RESULT]]
;
%input = load <8 x i8>, ptr %p, align 1
%a0 = extractelement <8 x i8> %input, i64 0
%a1 = extractelement <8 x i8> %input, i64 1
%a2 = extractelement <8 x i8> %input, i64 2
%a3 = extractelement <8 x i8> %input, i64 3
%a4 = extractelement <8 x i8> %input, i64 4
%a5 = extractelement <8 x i8> %input, i64 5
%a6 = extractelement <8 x i8> %input, i64 6
%a7 = extractelement <8 x i8> %input, i64 7
%c1 = icmp ugt i8 %a0, %a1
%m1 = select i1 %c1, i8 %a0, i8 %a1
%c2 = icmp ugt i8 %m1, %a2
%m2 = select i1 %c2, i8 %m1, i8 %a2
%c3 = icmp ugt i8 %m2, %a3
%m3 = select i1 %c3, i8 %m2, i8 %a3
%c4 = icmp ugt i8 %m3, %a4
%m4 = select i1 %c4, i8 %m3, i8 %a4
%c5 = icmp ugt i8 %m4, %a5
%m5 = select i1 %c5, i8 %m4, i8 %a5
%c6 = icmp ugt i8 %m5, %a6
%m6 = select i1 %c6, i8 %m5, i8 %a6
%c7 = icmp ugt i8 %m6, %a7
%m7 = select i1 %c7, i8 %m6, i8 %a7
%cmp = icmp eq i8 0, %m7
%result = zext i1 %cmp to i32
ret i32 %result
}