blob: 34ab34d8a2538b2771037ee036219e6853c6c219 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -mtriple=wasm32 -mattr=+simd128 -passes=slp-vectorizer -S < %s | FileCheck %s
define i1 @or_reduction_nonzero(ptr %p) {
; CHECK-LABEL: define i1 @or_reduction_nonzero(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 0, i32 8>
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 1, i32 9>
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i8> [[TMP18]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 2, i32 10>
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 3, i32 11>
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i8> [[TMP4]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 4, i32 12>
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 5, i32 13>
; CHECK-NEXT: [[TMP9:%.*]] = or <2 x i8> [[TMP7]], [[TMP8]]
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 6, i32 14>
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 7, i32 15>
; CHECK-NEXT: [[TMP12:%.*]] = or <2 x i8> [[TMP10]], [[TMP11]]
; CHECK-NEXT: [[TMP13:%.*]] = or <2 x i8> [[TMP3]], [[TMP6]]
; CHECK-NEXT: [[TMP14:%.*]] = or <2 x i8> [[TMP9]], [[TMP12]]
; CHECK-NEXT: [[TMP15:%.*]] = or <2 x i8> [[TMP13]], [[TMP14]]
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x i8> [[TMP15]], i64 0
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x i8> [[TMP15]], i64 1
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[TMP16]], [[TMP17]]
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[TMP1]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
entry:
%v0 = load i8, ptr %p, align 1
%p1 = getelementptr inbounds i8, ptr %p, i32 1
%v1 = load i8, ptr %p1, align 1
%p2 = getelementptr inbounds i8, ptr %p, i32 2
%v2 = load i8, ptr %p2, align 1
%p3 = getelementptr inbounds i8, ptr %p, i32 3
%v3 = load i8, ptr %p3, align 1
%p4 = getelementptr inbounds i8, ptr %p, i32 4
%v4 = load i8, ptr %p4, align 1
%p5 = getelementptr inbounds i8, ptr %p, i32 5
%v5 = load i8, ptr %p5, align 1
%p6 = getelementptr inbounds i8, ptr %p, i32 6
%v6 = load i8, ptr %p6, align 1
%p7 = getelementptr inbounds i8, ptr %p, i32 7
%v7 = load i8, ptr %p7, align 1
%p8 = getelementptr inbounds i8, ptr %p, i32 8
%v8 = load i8, ptr %p8, align 1
%p9 = getelementptr inbounds i8, ptr %p, i32 9
%v9 = load i8, ptr %p9, align 1
%p10 = getelementptr inbounds i8, ptr %p, i32 10
%v10 = load i8, ptr %p10, align 1
%p11 = getelementptr inbounds i8, ptr %p, i32 11
%v11 = load i8, ptr %p11, align 1
%p12 = getelementptr inbounds i8, ptr %p, i32 12
%v12 = load i8, ptr %p12, align 1
%p13 = getelementptr inbounds i8, ptr %p, i32 13
%v13 = load i8, ptr %p13, align 1
%p14 = getelementptr inbounds i8, ptr %p, i32 14
%v14 = load i8, ptr %p14, align 1
%p15 = getelementptr inbounds i8, ptr %p, i32 15
%v15 = load i8, ptr %p15, align 1
%o01 = or i8 %v0, %v1
%o23 = or i8 %v2, %v3
%o45 = or i8 %v4, %v5
%o67 = or i8 %v6, %v7
%o89 = or i8 %v8, %v9
%o1011 = or i8 %v10, %v11
%o1213 = or i8 %v12, %v13
%o1415 = or i8 %v14, %v15
%o0123 = or i8 %o01, %o23
%o4567 = or i8 %o45, %o67
%o891011 = or i8 %o89, %o1011
%o12131415 = or i8 %o1213, %o1415
%o07 = or i8 %o0123, %o4567
%o815 = or i8 %o891011, %o12131415
%o = or i8 %o07, %o815
%cmp = icmp ne i8 %o, 0
ret i1 %cmp
}
define i1 @or_reduction_zero(ptr %p) {
; CHECK-LABEL: define i1 @or_reduction_zero(
; CHECK-SAME: ptr [[P:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 0, i32 8>
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 1, i32 9>
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i8> [[TMP18]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 2, i32 10>
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 3, i32 11>
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i8> [[TMP4]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 4, i32 12>
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 5, i32 13>
; CHECK-NEXT: [[TMP9:%.*]] = or <2 x i8> [[TMP7]], [[TMP8]]
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 6, i32 14>
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 7, i32 15>
; CHECK-NEXT: [[TMP12:%.*]] = or <2 x i8> [[TMP10]], [[TMP11]]
; CHECK-NEXT: [[TMP13:%.*]] = or <2 x i8> [[TMP3]], [[TMP6]]
; CHECK-NEXT: [[TMP14:%.*]] = or <2 x i8> [[TMP9]], [[TMP12]]
; CHECK-NEXT: [[TMP15:%.*]] = or <2 x i8> [[TMP13]], [[TMP14]]
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x i8> [[TMP15]], i64 0
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x i8> [[TMP15]], i64 1
; CHECK-NEXT: [[TMP1:%.*]] = or i8 [[TMP16]], [[TMP17]]
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i8 [[TMP1]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
entry:
%v0 = load i8, ptr %p, align 1
%p1 = getelementptr inbounds i8, ptr %p, i32 1
%v1 = load i8, ptr %p1, align 1
%p2 = getelementptr inbounds i8, ptr %p, i32 2
%v2 = load i8, ptr %p2, align 1
%p3 = getelementptr inbounds i8, ptr %p, i32 3
%v3 = load i8, ptr %p3, align 1
%p4 = getelementptr inbounds i8, ptr %p, i32 4
%v4 = load i8, ptr %p4, align 1
%p5 = getelementptr inbounds i8, ptr %p, i32 5
%v5 = load i8, ptr %p5, align 1
%p6 = getelementptr inbounds i8, ptr %p, i32 6
%v6 = load i8, ptr %p6, align 1
%p7 = getelementptr inbounds i8, ptr %p, i32 7
%v7 = load i8, ptr %p7, align 1
%p8 = getelementptr inbounds i8, ptr %p, i32 8
%v8 = load i8, ptr %p8, align 1
%p9 = getelementptr inbounds i8, ptr %p, i32 9
%v9 = load i8, ptr %p9, align 1
%p10 = getelementptr inbounds i8, ptr %p, i32 10
%v10 = load i8, ptr %p10, align 1
%p11 = getelementptr inbounds i8, ptr %p, i32 11
%v11 = load i8, ptr %p11, align 1
%p12 = getelementptr inbounds i8, ptr %p, i32 12
%v12 = load i8, ptr %p12, align 1
%p13 = getelementptr inbounds i8, ptr %p, i32 13
%v13 = load i8, ptr %p13, align 1
%p14 = getelementptr inbounds i8, ptr %p, i32 14
%v14 = load i8, ptr %p14, align 1
%p15 = getelementptr inbounds i8, ptr %p, i32 15
%v15 = load i8, ptr %p15, align 1
%o01 = or i8 %v0, %v1
%o23 = or i8 %v2, %v3
%o45 = or i8 %v4, %v5
%o67 = or i8 %v6, %v7
%o89 = or i8 %v8, %v9
%o1011 = or i8 %v10, %v11
%o1213 = or i8 %v12, %v13
%o1415 = or i8 %v14, %v15
%o0123 = or i8 %o01, %o23
%o4567 = or i8 %o45, %o67
%o891011 = or i8 %o89, %o1011
%o12131415 = or i8 %o1213, %o1415
%o07 = or i8 %o0123, %o4567
%o815 = or i8 %o891011, %o12131415
%o = or i8 %o07, %o815
%cmp = icmp eq i8 %o, 0
ret i1 %cmp
}
define i1 @or_reduction_nonzero_multiuse(ptr %p, ptr %out) {
; CHECK-LABEL: define i1 @or_reduction_nonzero_multiuse(
; CHECK-SAME: ptr [[P:%.*]], ptr [[OUT:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[TMP0:%.*]] = load <16 x i8>, ptr [[P]], align 1
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 0, i32 8>
; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 1, i32 9>
; CHECK-NEXT: [[TMP3:%.*]] = or <2 x i8> [[TMP1]], [[TMP2]]
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 2, i32 10>
; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 3, i32 11>
; CHECK-NEXT: [[TMP6:%.*]] = or <2 x i8> [[TMP4]], [[TMP5]]
; CHECK-NEXT: [[TMP7:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 4, i32 12>
; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 5, i32 13>
; CHECK-NEXT: [[TMP9:%.*]] = or <2 x i8> [[TMP7]], [[TMP8]]
; CHECK-NEXT: [[TMP10:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 6, i32 14>
; CHECK-NEXT: [[TMP11:%.*]] = shufflevector <16 x i8> [[TMP0]], <16 x i8> poison, <2 x i32> <i32 7, i32 15>
; CHECK-NEXT: [[TMP12:%.*]] = or <2 x i8> [[TMP10]], [[TMP11]]
; CHECK-NEXT: [[TMP13:%.*]] = or <2 x i8> [[TMP3]], [[TMP6]]
; CHECK-NEXT: [[TMP14:%.*]] = or <2 x i8> [[TMP9]], [[TMP12]]
; CHECK-NEXT: [[TMP15:%.*]] = or <2 x i8> [[TMP13]], [[TMP14]]
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x i8> [[TMP15]], i64 0
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x i8> [[TMP15]], i64 1
; CHECK-NEXT: [[O:%.*]] = or i8 [[TMP16]], [[TMP17]]
; CHECK-NEXT: store i8 [[O]], ptr [[OUT]], align 1
; CHECK-NEXT: [[CMP:%.*]] = icmp ne i8 [[O]], 0
; CHECK-NEXT: ret i1 [[CMP]]
;
entry:
%v0 = load i8, ptr %p, align 1
%p1 = getelementptr inbounds i8, ptr %p, i32 1
%v1 = load i8, ptr %p1, align 1
%p2 = getelementptr inbounds i8, ptr %p, i32 2
%v2 = load i8, ptr %p2, align 1
%p3 = getelementptr inbounds i8, ptr %p, i32 3
%v3 = load i8, ptr %p3, align 1
%p4 = getelementptr inbounds i8, ptr %p, i32 4
%v4 = load i8, ptr %p4, align 1
%p5 = getelementptr inbounds i8, ptr %p, i32 5
%v5 = load i8, ptr %p5, align 1
%p6 = getelementptr inbounds i8, ptr %p, i32 6
%v6 = load i8, ptr %p6, align 1
%p7 = getelementptr inbounds i8, ptr %p, i32 7
%v7 = load i8, ptr %p7, align 1
%p8 = getelementptr inbounds i8, ptr %p, i32 8
%v8 = load i8, ptr %p8, align 1
%p9 = getelementptr inbounds i8, ptr %p, i32 9
%v9 = load i8, ptr %p9, align 1
%p10 = getelementptr inbounds i8, ptr %p, i32 10
%v10 = load i8, ptr %p10, align 1
%p11 = getelementptr inbounds i8, ptr %p, i32 11
%v11 = load i8, ptr %p11, align 1
%p12 = getelementptr inbounds i8, ptr %p, i32 12
%v12 = load i8, ptr %p12, align 1
%p13 = getelementptr inbounds i8, ptr %p, i32 13
%v13 = load i8, ptr %p13, align 1
%p14 = getelementptr inbounds i8, ptr %p, i32 14
%v14 = load i8, ptr %p14, align 1
%p15 = getelementptr inbounds i8, ptr %p, i32 15
%v15 = load i8, ptr %p15, align 1
%o01 = or i8 %v0, %v1
%o23 = or i8 %v2, %v3
%o45 = or i8 %v4, %v5
%o67 = or i8 %v6, %v7
%o89 = or i8 %v8, %v9
%o1011 = or i8 %v10, %v11
%o1213 = or i8 %v12, %v13
%o1415 = or i8 %v14, %v15
%o0123 = or i8 %o01, %o23
%o4567 = or i8 %o45, %o67
%o891011 = or i8 %o89, %o1011
%o12131415 = or i8 %o1213, %o1415
%o07 = or i8 %o0123, %o4567
%o815 = or i8 %o891011, %o12131415
%o = or i8 %o07, %o815
store i8 %o, ptr %out, align 1
%cmp = icmp ne i8 %o, 0
ret i1 %cmp
}