blob: bc483e173082398eb7526ca61295d729f226a27e [file]
; 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-gnu -mattr=+avx2 < %s | FileCheck %s
define i32 @test(i8 %a0, i8 %b0) {
; CHECK-LABEL: define i32 @test(
; CHECK-SAME: i8 [[A0:%.*]], i8 [[B0:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[TMP1:%.*]] = insertelement <8 x i8> poison, i8 [[A0]], i64 0
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> [[TMP1]], <8 x i8> poison, <8 x i32> zeroinitializer
; CHECK-NEXT: [[TMP3:%.*]] = sext <8 x i8> [[TMP2]] to <8 x i16>
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <8 x i8> [[TMP2]], <8 x i8> poison, <2 x i32> <i32 poison, i32 0>
; CHECK-NEXT: [[TMP5:%.*]] = insertelement <2 x i8> [[TMP4]], i8 [[B0]], i64 0
; CHECK-NEXT: [[TMP6:%.*]] = shufflevector <2 x i8> [[TMP5]], <2 x i8> poison, <8 x i32> <i32 0, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1>
; CHECK-NEXT: [[TMP7:%.*]] = zext <8 x i8> [[TMP6]] to <8 x i16>
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <8 x i16> [[TMP7]], <8 x i16> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
; CHECK-NEXT: [[TMP9:%.*]] = shufflevector <8 x i16> [[TMP3]], <8 x i16> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i16> [[TMP8]], <16 x i16> [[TMP9]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>
; CHECK-NEXT: [[TMP11:%.*]] = sext <16 x i16> [[TMP10]] to <16 x i32>
; CHECK-NEXT: [[TMP12:%.*]] = call i32 @llvm.vector.reduce.smin.v16i32(<16 x i32> [[TMP11]])
; CHECK-NEXT: ret i32 [[TMP12]]
;
%x0 = sext i8 %a0 to i32
%y0 = zext i8 %b0 to i32
%s0 = call i32 @llvm.smin.i32(i32 %x0, i32 %y0)
%x1 = sext i8 %a0 to i32
%s1 = call i32 @llvm.smin.i32(i32 %s0, i32 %x1)
%y1 = zext i8 %a0 to i32
%s2 = call i32 @llvm.smin.i32(i32 %s1, i32 %y1)
%x2 = sext i8 %a0 to i32
%s3 = call i32 @llvm.smin.i32(i32 %s2, i32 %x2)
%y2 = zext i8 %a0 to i32
%s4 = call i32 @llvm.smin.i32(i32 %s3, i32 %y2)
%x3 = sext i8 %a0 to i32
%s5 = call i32 @llvm.smin.i32(i32 %s4, i32 %x3)
%y3 = zext i8 %a0 to i32
%s6 = call i32 @llvm.smin.i32(i32 %s5, i32 %y3)
%x4 = sext i8 %a0 to i32
%s7 = call i32 @llvm.smin.i32(i32 %s6, i32 %x4)
%y4 = zext i8 %a0 to i32
%s8 = call i32 @llvm.smin.i32(i32 %s7, i32 %y4)
%x5 = sext i8 %a0 to i32
%s9 = call i32 @llvm.smin.i32(i32 %s8, i32 %x5)
%y5 = zext i8 %a0 to i32
%s10 = call i32 @llvm.smin.i32(i32 %s9, i32 %y5)
%x6 = sext i8 %a0 to i32
%s11 = call i32 @llvm.smin.i32(i32 %s10, i32 %x6)
%y6 = zext i8 %a0 to i32
%s12 = call i32 @llvm.smin.i32(i32 %s11, i32 %y6)
%x7 = sext i8 %a0 to i32
%s13 = call i32 @llvm.smin.i32(i32 %s12, i32 %x7)
%y7 = zext i8 %a0 to i32
%s14 = call i32 @llvm.smin.i32(i32 %s13, i32 %y7)
ret i32 %s14
}
define i32 @gather_root(i64 %x) {
; CHECK-LABEL: define i32 @gather_root(
; CHECK-SAME: i64 [[X:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i64 [[X]] to <8 x i8>
; CHECK-NEXT: [[TMP2:%.*]] = zext <8 x i8> [[TMP1]] to <8 x i32>
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> [[TMP2]])
; CHECK-NEXT: ret i32 [[TMP3]]
;
%t0 = trunc i64 %x to i8
%s1 = lshr i64 %x, 8
%t1 = trunc i64 %s1 to i8
%s2 = lshr i64 %x, 16
%t2 = trunc i64 %s2 to i8
%s3 = lshr i64 %x, 24
%t3 = trunc i64 %s3 to i8
%s4 = lshr i64 %x, 32
%t4 = trunc i64 %s4 to i8
%s5 = lshr i64 %x, 40
%t5 = trunc i64 %s5 to i8
%s6 = lshr i64 %x, 48
%t6 = trunc i64 %s6 to i8
%s7 = lshr i64 %x, 56
%t7 = trunc i64 %s7 to i8
%z0 = zext i8 %t0 to i32
%z1 = zext i8 %t1 to i32
%z2 = zext i8 %t2 to i32
%z3 = zext i8 %t3 to i32
%z4 = zext i8 %t4 to i32
%z5 = zext i8 %t5 to i32
%z6 = zext i8 %t6 to i32
%z7 = zext i8 %t7 to i32
%m0 = call i32 @llvm.umax.i32(i32 %z0, i32 %z1)
%m1 = call i32 @llvm.umax.i32(i32 %m0, i32 %z2)
%m2 = call i32 @llvm.umax.i32(i32 %m1, i32 %z3)
%m3 = call i32 @llvm.umax.i32(i32 %m2, i32 %z4)
%m4 = call i32 @llvm.umax.i32(i32 %m3, i32 %z5)
%m5 = call i32 @llvm.umax.i32(i32 %m4, i32 %z6)
%m6 = call i32 @llvm.umax.i32(i32 %m5, i32 %z7)
ret i32 %m6
}
declare i32 @llvm.smin.i32(i32, i32)
declare i32 @llvm.umax.i32(i32, i32)