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