| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: opt -S --passes=slp-vectorizer -mtriple=riscv32-unknown-linux-gnu -mattr=+v -slp-threshold=-1000 < %s | FileCheck %s | |
| define i8 @test(ptr %pp, | |
| ; CHECK-LABEL: define i8 @test( | |
| ; CHECK-SAME: ptr [[PP:%.*]], i1 [[ARG0:%.*]], i1 [[ARG1:%.*]], i1 [[ARG2:%.*]], i1 [[ARG3:%.*]], i1 [[ARG4:%.*]], i1 [[ARG5:%.*]], i1 [[ARG6:%.*]], i1 [[ARG7:%.*]], i1 [[ARG8:%.*]], i1 [[ARG9:%.*]], i1 [[ARG10:%.*]], i1 [[ARG11:%.*]], i1 [[ARG12:%.*]], i1 [[ARG13:%.*]], i1 [[ARG14:%.*]], i1 [[ARG15:%.*]], i256 [[ARG16:%.*]], i256 [[ARG17:%.*]], i256 [[ARG18:%.*]], i256 [[ARG19:%.*]], i256 [[ARG20:%.*]], i256 [[ARG21:%.*]], i256 [[ARG22:%.*]], i256 [[ARG23:%.*]], i256 [[ARG24:%.*]], i256 [[ARG25:%.*]], i256 [[ARG26:%.*]], i256 [[ARG27:%.*]], i256 [[ARG28:%.*]], i256 [[ARG29:%.*]], i256 [[ARG30:%.*]], i256 [[ARG31:%.*]]) #[[ATTR0:[0-9]+]] { | |
| ; CHECK-NEXT: [[ENTRY:.*:]] | |
| ; CHECK-NEXT: [[GEP0:%.*]] = getelementptr inbounds i32, ptr [[PP]], i64 0 | |
| ; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x i32> poison, i32 0, i64 0 | |
| ; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> [[TMP0]], <4 x i32> poison, <4 x i32> zeroinitializer | |
| ; CHECK-NEXT: store <4 x i32> [[TMP1]], ptr [[GEP0]], align 4 | |
| ; CHECK-NEXT: [[TMP2:%.*]] = insertelement <16 x i1> poison, i1 [[ARG0]], i64 0 | |
| ; CHECK-NEXT: [[TMP3:%.*]] = insertelement <16 x i1> [[TMP2]], i1 [[ARG1]], i64 1 | |
| ; CHECK-NEXT: [[TMP4:%.*]] = insertelement <16 x i1> [[TMP3]], i1 [[ARG2]], i64 2 | |
| ; CHECK-NEXT: [[TMP5:%.*]] = insertelement <16 x i1> [[TMP4]], i1 [[ARG3]], i64 3 | |
| ; CHECK-NEXT: [[TMP6:%.*]] = insertelement <16 x i1> [[TMP5]], i1 [[ARG4]], i64 4 | |
| ; CHECK-NEXT: [[TMP7:%.*]] = insertelement <16 x i1> [[TMP6]], i1 [[ARG5]], i64 5 | |
| ; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x i1> [[TMP7]], i1 [[ARG6]], i64 6 | |
| ; CHECK-NEXT: [[TMP9:%.*]] = insertelement <16 x i1> [[TMP8]], i1 [[ARG7]], i64 7 | |
| ; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x i1> [[TMP9]], i1 [[ARG8]], i64 8 | |
| ; CHECK-NEXT: [[TMP11:%.*]] = insertelement <16 x i1> [[TMP10]], i1 [[ARG9]], i64 9 | |
| ; CHECK-NEXT: [[TMP12:%.*]] = insertelement <16 x i1> [[TMP11]], i1 [[ARG10]], i64 10 | |
| ; CHECK-NEXT: [[TMP13:%.*]] = insertelement <16 x i1> [[TMP12]], i1 [[ARG11]], i64 11 | |
| ; CHECK-NEXT: [[TMP14:%.*]] = insertelement <16 x i1> [[TMP13]], i1 [[ARG12]], i64 12 | |
| ; CHECK-NEXT: [[TMP15:%.*]] = insertelement <16 x i1> [[TMP14]], i1 [[ARG13]], i64 13 | |
| ; CHECK-NEXT: [[TMP16:%.*]] = insertelement <16 x i1> [[TMP15]], i1 [[ARG14]], i64 14 | |
| ; CHECK-NEXT: [[TMP17:%.*]] = insertelement <16 x i1> [[TMP16]], i1 [[ARG15]], i64 15 | |
| ; CHECK-NEXT: [[TMP18:%.*]] = add <16 x i1> [[TMP17]], splat (i1 true) | |
| ; CHECK-NEXT: [[TMP19:%.*]] = insertelement <16 x i256> poison, i256 [[ARG16]], i64 0 | |
| ; CHECK-NEXT: [[TMP20:%.*]] = insertelement <16 x i256> [[TMP19]], i256 [[ARG17]], i64 1 | |
| ; CHECK-NEXT: [[TMP21:%.*]] = insertelement <16 x i256> [[TMP20]], i256 [[ARG18]], i64 2 | |
| ; CHECK-NEXT: [[TMP22:%.*]] = insertelement <16 x i256> [[TMP21]], i256 [[ARG19]], i64 3 | |
| ; CHECK-NEXT: [[TMP23:%.*]] = insertelement <16 x i256> [[TMP22]], i256 [[ARG20]], i64 4 | |
| ; CHECK-NEXT: [[TMP24:%.*]] = insertelement <16 x i256> [[TMP23]], i256 [[ARG21]], i64 5 | |
| ; CHECK-NEXT: [[TMP25:%.*]] = insertelement <16 x i256> [[TMP24]], i256 [[ARG22]], i64 6 | |
| ; CHECK-NEXT: [[TMP26:%.*]] = insertelement <16 x i256> [[TMP25]], i256 [[ARG23]], i64 7 | |
| ; CHECK-NEXT: [[TMP27:%.*]] = insertelement <16 x i256> [[TMP26]], i256 [[ARG24]], i64 8 | |
| ; CHECK-NEXT: [[TMP28:%.*]] = insertelement <16 x i256> [[TMP27]], i256 [[ARG25]], i64 9 | |
| ; CHECK-NEXT: [[TMP29:%.*]] = insertelement <16 x i256> [[TMP28]], i256 [[ARG26]], i64 10 | |
| ; CHECK-NEXT: [[TMP30:%.*]] = insertelement <16 x i256> [[TMP29]], i256 [[ARG27]], i64 11 | |
| ; CHECK-NEXT: [[TMP31:%.*]] = insertelement <16 x i256> [[TMP30]], i256 [[ARG28]], i64 12 | |
| ; CHECK-NEXT: [[TMP32:%.*]] = insertelement <16 x i256> [[TMP31]], i256 [[ARG29]], i64 13 | |
| ; CHECK-NEXT: [[TMP33:%.*]] = insertelement <16 x i256> [[TMP32]], i256 [[ARG30]], i64 14 | |
| ; CHECK-NEXT: [[TMP34:%.*]] = insertelement <16 x i256> [[TMP33]], i256 [[ARG31]], i64 15 | |
| ; CHECK-NEXT: [[TMP35:%.*]] = add <16 x i256> [[TMP34]], splat (i256 3) | |
| ; CHECK-NEXT: [[TMP36:%.*]] = zext <16 x i1> [[TMP18]] to <16 x i8> | |
| ; CHECK-NEXT: [[TMP37:%.*]] = trunc <16 x i256> [[TMP35]] to <16 x i8> | |
| ; CHECK-NEXT: [[TMP38:%.*]] = shufflevector <16 x i8> [[TMP37]], <16 x i8> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> | |
| ; CHECK-NEXT: [[TMP39:%.*]] = shufflevector <16 x i8> [[TMP36]], <16 x i8> poison, <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison> | |
| ; CHECK-NEXT: [[TMP40:%.*]] = shufflevector <32 x i8> [[TMP38]], <32 x i8> [[TMP39]], <32 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 32, i32 33, i32 34, i32 35, i32 36, i32 37, i32 38, i32 39, i32 40, i32 41, i32 42, i32 43, i32 44, i32 45, i32 46, i32 47> | |
| ; CHECK-NEXT: [[TMP41:%.*]] = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> [[TMP40]]) | |
| ; CHECK-NEXT: [[TMP42:%.*]] = sext i8 [[TMP41]] to i64 | |
| ; CHECK-NEXT: [[RET:%.*]] = trunc i64 [[TMP42]] to i8 | |
| ; CHECK-NEXT: ret i8 [[RET]] | |
| ; | |
| i1 %arg0, | |
| i1 %arg1, | |
| i1 %arg2, | |
| i1 %arg3, | |
| i1 %arg4, | |
| i1 %arg5, | |
| i1 %arg6, | |
| i1 %arg7, | |
| i1 %arg8, | |
| i1 %arg9, | |
| i1 %arg10, | |
| i1 %arg11, | |
| i1 %arg12, | |
| i1 %arg13, | |
| i1 %arg14, | |
| i1 %arg15, | |
| i256 %arg16, | |
| i256 %arg17, | |
| i256 %arg18, | |
| i256 %arg19, | |
| i256 %arg20, | |
| i256 %arg21, | |
| i256 %arg22, | |
| i256 %arg23, | |
| i256 %arg24, | |
| i256 %arg25, | |
| i256 %arg26, | |
| i256 %arg27, | |
| i256 %arg28, | |
| i256 %arg29, | |
| i256 %arg30, | |
| i256 %arg31) #0 { | |
| entry: | |
| ; store chain to be vectorized first | |
| %gep0 = getelementptr inbounds i32, ptr %pp, i64 0 | |
| %gep1 = getelementptr inbounds i32, ptr %pp, i64 1 | |
| %gep2 = getelementptr inbounds i32, ptr %pp, i64 2 | |
| %gep3 = getelementptr inbounds i32, ptr %pp, i64 3 | |
| %store_data = add i32 0, 0 | |
| store i32 %store_data, ptr %gep0 | |
| store i32 %store_data, ptr %gep1 | |
| store i32 %store_data, ptr %gep2 | |
| store i32 %store_data, ptr %gep3 | |
| %add0 = add i1 %arg0, 3 | |
| %add1 = add i1 %arg1, 3 | |
| %add2 = add i1 %arg2, 3 | |
| %add3 = add i1 %arg3, 3 | |
| %add4 = add i1 %arg4, 3 | |
| %add5 = add i1 %arg5, 3 | |
| %add6 = add i1 %arg6, 3 | |
| %add7 = add i1 %arg7, 3 | |
| %add8 = add i1 %arg8, 3 | |
| %add9 = add i1 %arg9, 3 | |
| %add10 = add i1 %arg10, 3 | |
| %add11 = add i1 %arg11, 3 | |
| %add12 = add i1 %arg12, 3 | |
| %add13 = add i1 %arg13, 3 | |
| %add14 = add i1 %arg14, 3 | |
| %add15 = add i1 %arg15, 3 | |
| %add16 = add i256 %arg16, 3 | |
| %add17 = add i256 %arg17, 3 | |
| %add18 = add i256 %arg18, 3 | |
| %add19 = add i256 %arg19, 3 | |
| %add20 = add i256 %arg20, 3 | |
| %add21 = add i256 %arg21, 3 | |
| %add22 = add i256 %arg22, 3 | |
| %add23 = add i256 %arg23, 3 | |
| %add24 = add i256 %arg24, 3 | |
| %add25 = add i256 %arg25, 3 | |
| %add26 = add i256 %arg26, 3 | |
| %add27 = add i256 %arg27, 3 | |
| %add28 = add i256 %arg28, 3 | |
| %add29 = add i256 %arg29, 3 | |
| %add30 = add i256 %arg30, 3 | |
| %add31 = add i256 %arg31, 3 | |
| %zext0 = zext i1 %add0 to i64 | |
| %zext1 = zext i1 %add1 to i64 | |
| %zext2 = zext i1 %add2 to i64 | |
| %zext3 = zext i1 %add3 to i64 | |
| %zext4 = zext i1 %add4 to i64 | |
| %zext5 = zext i1 %add5 to i64 | |
| %zext6 = zext i1 %add6 to i64 | |
| %zext7 = zext i1 %add7 to i64 | |
| %zext8 = zext i1 %add8 to i64 | |
| %zext9 = zext i1 %add9 to i64 | |
| %zext10 = zext i1 %add10 to i64 | |
| %zext11 = zext i1 %add11 to i64 | |
| %zext12 = zext i1 %add12 to i64 | |
| %zext13 = zext i1 %add13 to i64 | |
| %zext14 = zext i1 %add14 to i64 | |
| %zext15 = zext i1 %add15 to i64 | |
| %trunc16 = trunc i256 %add16 to i64 | |
| %trunc17 = trunc i256 %add17 to i64 | |
| %trunc18 = trunc i256 %add18 to i64 | |
| %trunc19 = trunc i256 %add19 to i64 | |
| %trunc20 = trunc i256 %add20 to i64 | |
| %trunc21 = trunc i256 %add21 to i64 | |
| %trunc22 = trunc i256 %add22 to i64 | |
| %trunc23 = trunc i256 %add23 to i64 | |
| %trunc24 = trunc i256 %add24 to i64 | |
| %trunc25 = trunc i256 %add25 to i64 | |
| %trunc26 = trunc i256 %add26 to i64 | |
| %trunc27 = trunc i256 %add27 to i64 | |
| %trunc28 = trunc i256 %add28 to i64 | |
| %trunc29 = trunc i256 %add29 to i64 | |
| %trunc30 = trunc i256 %add30 to i64 | |
| %trunc31 = trunc i256 %add31 to i64 | |
| %or0 = or i64 %zext0, %zext1 | |
| %or1 = or i64 %or0, %zext2 | |
| %or2 = or i64 %or1, %zext3 | |
| %or3 = or i64 %or2, %zext4 | |
| %or4 = or i64 %or3, %zext5 | |
| %or5 = or i64 %or4, %zext6 | |
| %or6 = or i64 %or5, %zext7 | |
| %or7 = or i64 %or6, %zext8 | |
| %or8 = or i64 %or7, %zext9 | |
| %or9 = or i64 %or8, %zext10 | |
| %or10 = or i64 %or9, %zext11 | |
| %or11 = or i64 %or10, %zext12 | |
| %or12 = or i64 %or11, %zext13 | |
| %or13 = or i64 %or12, %zext14 | |
| %or14 = or i64 %or13, %zext15 | |
| %or15 = or i64 %or14, %trunc16 | |
| %or16 = or i64 %or15, %trunc17 | |
| %or17 = or i64 %or16, %trunc18 | |
| %or18 = or i64 %or17, %trunc19 | |
| %or19 = or i64 %or18, %trunc20 | |
| %or20 = or i64 %or19, %trunc21 | |
| %or21 = or i64 %or20, %trunc22 | |
| %or22 = or i64 %or21, %trunc23 | |
| %or23 = or i64 %or22, %trunc24 | |
| %or24 = or i64 %or23, %trunc25 | |
| %or25 = or i64 %or24, %trunc26 | |
| %or26 = or i64 %or25, %trunc27 | |
| %or27 = or i64 %or26, %trunc28 | |
| %or28 = or i64 %or27, %trunc29 | |
| %or29 = or i64 %or28, %trunc30 | |
| %or30 = or i64 %or29, %trunc31 | |
| %ret = trunc i64 %or30 to i8 | |
| ret i8 %ret | |
| } |