| ; 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 |
| } |