brintos

brintos / llvm-project-archived public Read only

0
0
Text · 53.1 KiB · 5bc2e94 Raw
1243 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 \3; RUN: -mattr=+v,+zvfhmin,+zvfbfmin -riscv-v-slp-max-vf=0 -S \4; RUN: | FileCheck %s --check-prefixes=CHECK,ZVFHMIN5; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 \6; RUN: -mattr=+v,+zvfh,+zvfbfmin -riscv-v-slp-max-vf=0 -S \7; RUN: | FileCheck %s --check-prefixes=CHECK,ZVFH8; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 \9; RUN: -mattr=+v,+zvl256b,+zvfh,+zvfbfmin -riscv-v-slp-max-vf=0 -S \10; RUN: | FileCheck %s --check-prefixes=CHECK,ZVFH11; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 \12; RUN: -mattr=+v,+zvl512b,+zvfh,+zvfbfmin -riscv-v-slp-max-vf=0 -S \13; RUN: | FileCheck %s --check-prefixes=CHECK,ZVFH14 15target datalayout = "e-m:e-p:64:64-i64:64-i128:128-n64-S128"16target triple = "riscv64"17 18; First batch of tests are simple reductions of various widths19 20define i64 @red_ld_2xi64(ptr %ptr) {21; CHECK-LABEL: @red_ld_2xi64(22; CHECK-NEXT:  entry:23; CHECK-NEXT:    [[LD0:%.*]] = load i64, ptr [[PTR:%.*]], align 824; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 125; CHECK-NEXT:    [[LD1:%.*]] = load i64, ptr [[GEP]], align 826; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw nsw i64 [[LD0]], [[LD1]]27; CHECK-NEXT:    ret i64 [[ADD_1]]28;29entry:30  %ld0 = load i64, ptr %ptr31  %gep = getelementptr inbounds i64, ptr %ptr, i64 132  %ld1 = load i64, ptr %gep33  %add.1 = add nuw nsw i64 %ld0, %ld134  ret i64 %add.135}36 37define i64 @red_ld_4xi64(ptr %ptr) {38; CHECK-LABEL: @red_ld_4xi64(39; CHECK-NEXT:  entry:40; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i64>, ptr [[PTR:%.*]], align 841; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP0]])42; CHECK-NEXT:    ret i64 [[TMP1]]43;44entry:45  %ld0 = load i64, ptr %ptr46  %gep = getelementptr inbounds i64, ptr %ptr, i64 147  %ld1 = load i64, ptr %gep48  %add.1 = add nuw nsw i64 %ld0, %ld149  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 250  %ld2 = load i64, ptr %gep.151  %add.2 = add nuw nsw i64 %add.1, %ld252  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 353  %ld3 = load i64, ptr %gep.254  %add.3 = add nuw nsw i64 %add.2, %ld355  ret i64 %add.356}57 58define i64 @red_ld_8xi64(ptr %ptr) {59; CHECK-LABEL: @red_ld_8xi64(60; CHECK-NEXT:  entry:61; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, ptr [[PTR:%.*]], align 862; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP0]])63; CHECK-NEXT:    ret i64 [[TMP1]]64;65entry:66  %ld0 = load i64, ptr %ptr67  %gep = getelementptr inbounds i64, ptr %ptr, i64 168  %ld1 = load i64, ptr %gep69  %add.1 = add nuw nsw i64 %ld0, %ld170  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 271  %ld2 = load i64, ptr %gep.172  %add.2 = add nuw nsw i64 %add.1, %ld273  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 374  %ld3 = load i64, ptr %gep.275  %add.3 = add nuw nsw i64 %add.2, %ld376  %gep.3 = getelementptr inbounds i64, ptr %ptr, i64 477  %ld4 = load i64, ptr %gep.378  %add.4 = add nuw nsw i64 %add.3, %ld479  %gep.4 = getelementptr inbounds i64, ptr %ptr, i64 580  %ld5 = load i64, ptr %gep.481  %add.5 = add nuw nsw i64 %add.4, %ld582  %gep.5 = getelementptr inbounds i64, ptr %ptr, i64 683  %ld6 = load i64, ptr %gep.584  %add.6 = add nuw nsw i64 %add.5, %ld685  %gep.6 = getelementptr inbounds i64, ptr %ptr, i64 786  %ld7 = load i64, ptr %gep.687  %add.7 = add nuw nsw i64 %add.6, %ld788  ret i64 %add.789}90 91define i64 @red_ld_16xi64(ptr %ptr) {92; CHECK-LABEL: @red_ld_16xi64(93; CHECK-NEXT:  entry:94; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x i64>, ptr [[PTR:%.*]], align 895; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP0]])96; CHECK-NEXT:    ret i64 [[TMP1]]97;98entry:99  %ld0 = load i64, ptr %ptr100  %gep = getelementptr inbounds i64, ptr %ptr, i64 1101  %ld1 = load i64, ptr %gep102  %add.1 = add nuw nsw i64 %ld0, %ld1103  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 2104  %ld2 = load i64, ptr %gep.1105  %add.2 = add nuw nsw i64 %add.1, %ld2106  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 3107  %ld3 = load i64, ptr %gep.2108  %add.3 = add nuw nsw i64 %add.2, %ld3109  %gep.3 = getelementptr inbounds i64, ptr %ptr, i64 4110  %ld4 = load i64, ptr %gep.3111  %add.4 = add nuw nsw i64 %add.3, %ld4112  %gep.4 = getelementptr inbounds i64, ptr %ptr, i64 5113  %ld5 = load i64, ptr %gep.4114  %add.5 = add nuw nsw i64 %add.4, %ld5115  %gep.5 = getelementptr inbounds i64, ptr %ptr, i64 6116  %ld6 = load i64, ptr %gep.5117  %add.6 = add nuw nsw i64 %add.5, %ld6118  %gep.6 = getelementptr inbounds i64, ptr %ptr, i64 7119  %ld7 = load i64, ptr %gep.6120  %add.7 = add nuw nsw i64 %add.6, %ld7121  %gep.7 = getelementptr inbounds i64, ptr %ptr, i64 8122  %ld8 = load i64, ptr %gep.7123  %add.8 = add nuw nsw i64 %add.7, %ld8124  %gep.8 = getelementptr inbounds i64, ptr %ptr, i64 9125  %ld9 = load i64, ptr %gep.8126  %add.9 = add nuw nsw i64 %add.8, %ld9127  %gep.9 = getelementptr inbounds i64, ptr %ptr, i64 10128  %ld10 = load i64, ptr %gep.9129  %add.10 = add nuw nsw i64 %add.9, %ld10130  %gep.10 = getelementptr inbounds i64, ptr %ptr, i64 11131  %ld11 = load i64, ptr %gep.10132  %add.11 = add nuw nsw i64 %add.10, %ld11133  %gep.11 = getelementptr inbounds i64, ptr %ptr, i64 12134  %ld12 = load i64, ptr %gep.11135  %add.12 = add nuw nsw i64 %add.11, %ld12136  %gep.12 = getelementptr inbounds i64, ptr %ptr, i64 13137  %ld13 = load i64, ptr %gep.12138  %add.13 = add nuw nsw i64 %add.12, %ld13139  %gep.13 = getelementptr inbounds i64, ptr %ptr, i64 14140  %ld14 = load i64, ptr %gep.13141  %add.14 = add nuw nsw i64 %add.13, %ld14142  %gep.14 = getelementptr inbounds i64, ptr %ptr, i64 15143  %ld15 = load i64, ptr %gep.14144  %add.15 = add nuw nsw i64 %add.14, %ld15145  ret i64 %add.15146}147 148 149define i64 @red_strided_ld_16xi64(ptr %ptr) {150; CHECK-LABEL: @red_strided_ld_16xi64(151; CHECK-NEXT:  entry:152; CHECK-NEXT:    [[TMP0:%.*]] = call <16 x i64> @llvm.experimental.vp.strided.load.v16i64.p0.i64(ptr align 8 [[PTR:%.*]], i64 16, <16 x i1> splat (i1 true), i32 16)153; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP0]])154; CHECK-NEXT:    ret i64 [[TMP1]]155;156entry:157  %ld0 = load i64, ptr %ptr158  %gep = getelementptr inbounds i64, ptr %ptr, i64 2159  %ld1 = load i64, ptr %gep160  %add.1 = add nuw nsw i64 %ld0, %ld1161  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 4162  %ld2 = load i64, ptr %gep.1163  %add.2 = add nuw nsw i64 %add.1, %ld2164  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 6165  %ld3 = load i64, ptr %gep.2166  %add.3 = add nuw nsw i64 %add.2, %ld3167  %gep.3 = getelementptr inbounds i64, ptr %ptr, i64 8168  %ld4 = load i64, ptr %gep.3169  %add.4 = add nuw nsw i64 %add.3, %ld4170  %gep.4 = getelementptr inbounds i64, ptr %ptr, i64 10171  %ld5 = load i64, ptr %gep.4172  %add.5 = add nuw nsw i64 %add.4, %ld5173  %gep.5 = getelementptr inbounds i64, ptr %ptr, i64 12174  %ld6 = load i64, ptr %gep.5175  %add.6 = add nuw nsw i64 %add.5, %ld6176  %gep.6 = getelementptr inbounds i64, ptr %ptr, i64 14177  %ld7 = load i64, ptr %gep.6178  %add.7 = add nuw nsw i64 %add.6, %ld7179  %gep.7 = getelementptr inbounds i64, ptr %ptr, i64 16180  %ld8 = load i64, ptr %gep.7181  %add.8 = add nuw nsw i64 %add.7, %ld8182  %gep.8 = getelementptr inbounds i64, ptr %ptr, i64 18183  %ld9 = load i64, ptr %gep.8184  %add.9 = add nuw nsw i64 %add.8, %ld9185  %gep.9 = getelementptr inbounds i64, ptr %ptr, i64 20186  %ld10 = load i64, ptr %gep.9187  %add.10 = add nuw nsw i64 %add.9, %ld10188  %gep.10 = getelementptr inbounds i64, ptr %ptr, i64 22189  %ld11 = load i64, ptr %gep.10190  %add.11 = add nuw nsw i64 %add.10, %ld11191  %gep.11 = getelementptr inbounds i64, ptr %ptr, i64 24192  %ld12 = load i64, ptr %gep.11193  %add.12 = add nuw nsw i64 %add.11, %ld12194  %gep.12 = getelementptr inbounds i64, ptr %ptr, i64 26195  %ld13 = load i64, ptr %gep.12196  %add.13 = add nuw nsw i64 %add.12, %ld13197  %gep.13 = getelementptr inbounds i64, ptr %ptr, i64 28198  %ld14 = load i64, ptr %gep.13199  %add.14 = add nuw nsw i64 %add.13, %ld14200  %gep.14 = getelementptr inbounds i64, ptr %ptr, i64 30201  %ld15 = load i64, ptr %gep.14202  %add.15 = add nuw nsw i64 %add.14, %ld15203  ret i64 %add.15204}205 206; Next batch test differen reductions kinds207 208%struct.buf = type { [8 x i8] }209 210define i8 @reduce_and(ptr %a, ptr %b) {211; CHECK-LABEL: @reduce_and(212; CHECK-NEXT:  entry:213; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0214; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0215; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1216; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1217; CHECK-NEXT:    [[TMP2:%.*]] = xor <8 x i8> [[TMP1]], [[TMP0]]218; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> [[TMP2]])219; CHECK-NEXT:    [[OP_RDX:%.*]] = and i8 [[TMP3]], 1220; CHECK-NEXT:    ret i8 [[OP_RDX]]221;222entry:223  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0224  %0 = load i8, ptr %arrayidx, align 1225  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0226  %1 = load i8, ptr %arrayidx3, align 1227  %xor12 = xor i8 %1, %0228  %and13 = and i8 %xor12, 1229  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1230  %2 = load i8, ptr %arrayidx.1, align 1231  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1232  %3 = load i8, ptr %arrayidx3.1, align 1233  %xor12.1 = xor i8 %3, %2234  %and13.1 = and i8 %xor12.1, %and13235  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2236  %4 = load i8, ptr %arrayidx.2, align 1237  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2238  %5 = load i8, ptr %arrayidx3.2, align 1239  %xor12.2 = xor i8 %5, %4240  %and13.2 = and i8 %xor12.2, %and13.1241  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3242  %6 = load i8, ptr %arrayidx.3, align 1243  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3244  %7 = load i8, ptr %arrayidx3.3, align 1245  %xor12.3 = xor i8 %7, %6246  %and13.3 = and i8 %xor12.3, %and13.2247  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4248  %8 = load i8, ptr %arrayidx.4, align 1249  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4250  %9 = load i8, ptr %arrayidx3.4, align 1251  %xor12.4 = xor i8 %9, %8252  %and13.4 = and i8 %xor12.4, %and13.3253  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5254  %10 = load i8, ptr %arrayidx.5, align 1255  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5256  %11 = load i8, ptr %arrayidx3.5, align 1257  %xor12.5 = xor i8 %11, %10258  %and13.5 = and i8 %xor12.5, %and13.4259  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6260  %12 = load i8, ptr %arrayidx.6, align 1261  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6262  %13 = load i8, ptr %arrayidx3.6, align 1263  %xor12.6 = xor i8 %13, %12264  %and13.6 = and i8 %xor12.6, %and13.5265  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7266  %14 = load i8, ptr %arrayidx.7, align 1267  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7268  %15 = load i8, ptr %arrayidx3.7, align 1269  %xor12.7 = xor i8 %15, %14270  %and13.7 = and i8 %xor12.7, %and13.6271  ret i8 %and13.7272}273 274define i8 @reduce_or_1(ptr %a, ptr %b) {275; CHECK-LABEL: @reduce_or_1(276; CHECK-NEXT:  entry:277; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0278; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0279; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1280; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1281; CHECK-NEXT:    [[TMP2:%.*]] = xor <8 x i8> [[TMP1]], [[TMP0]]282; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> [[TMP2]])283; CHECK-NEXT:    ret i8 [[TMP3]]284;285 286entry:287  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0288  %0 = load i8, ptr %arrayidx, align 1289  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0290  %1 = load i8, ptr %arrayidx3, align 1291  %xor12 = xor i8 %1, %0292  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1293  %2 = load i8, ptr %arrayidx.1, align 1294  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1295  %3 = load i8, ptr %arrayidx3.1, align 1296  %xor12.1 = xor i8 %3, %2297  %or13.1 = or i8 %xor12.1, %xor12298  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2299  %4 = load i8, ptr %arrayidx.2, align 1300  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2301  %5 = load i8, ptr %arrayidx3.2, align 1302  %xor12.2 = xor i8 %5, %4303  %or13.2 = or i8 %xor12.2, %or13.1304  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3305  %6 = load i8, ptr %arrayidx.3, align 1306  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3307  %7 = load i8, ptr %arrayidx3.3, align 1308  %xor12.3 = xor i8 %7, %6309  %or13.3 = or i8 %xor12.3, %or13.2310  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4311  %8 = load i8, ptr %arrayidx.4, align 1312  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4313  %9 = load i8, ptr %arrayidx3.4, align 1314  %xor12.4 = xor i8 %9, %8315  %or13.4 = or i8 %xor12.4, %or13.3316  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5317  %10 = load i8, ptr %arrayidx.5, align 1318  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5319  %11 = load i8, ptr %arrayidx3.5, align 1320  %xor12.5 = xor i8 %11, %10321  %or13.5 = or i8 %xor12.5, %or13.4322  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6323  %12 = load i8, ptr %arrayidx.6, align 1324  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6325  %13 = load i8, ptr %arrayidx3.6, align 1326  %xor12.6 = xor i8 %13, %12327  %or13.6 = or i8 %xor12.6, %or13.5328  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7329  %14 = load i8, ptr %arrayidx.7, align 1330  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7331  %15 = load i8, ptr %arrayidx3.7, align 1332  %xor12.7 = xor i8 %15, %14333  %or13.7 = or i8 %xor12.7, %or13.6334  ret i8 %or13.7335}336 337define void @reduce_or_2() {338; CHECK-LABEL: @reduce_or_2(339; CHECK-NEXT:    [[TMP1:%.*]] = shl i64 0, 0340; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <32 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 poison, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 poison, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0>, i64 [[TMP1]], i32 15341; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <32 x i64> [[TMP2]], <32 x i64> 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 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 15, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31>342; CHECK-NEXT:    [[TMP4:%.*]] = icmp ult <32 x i64> [[TMP3]], zeroinitializer343; CHECK-NEXT:    [[TMP5:%.*]] = call i1 @llvm.vector.reduce.or.v32i1(<32 x i1> [[TMP4]])344; CHECK-NEXT:    br i1 [[TMP5]], label [[TMP7:%.*]], label [[TMP6:%.*]]345; CHECK:       6:346; CHECK-NEXT:    ret void347; CHECK:       7:348; CHECK-NEXT:    ret void349;350  %1 = shl i64 0, 0351  %2 = icmp ult i64 0, 0352  %3 = icmp ult i64 0, 0353  %4 = or i1 %2, %3354  %5 = icmp ult i64 0, 0355  %6 = or i1 %4, %5356  %7 = icmp ult i64 0, 0357  %8 = or i1 %6, %7358  %9 = icmp ult i64 0, 0359  %10 = or i1 %8, %9360  %11 = icmp ult i64 0, 0361  %12 = or i1 %10, %11362  %13 = icmp ult i64 0, 0363  %14 = or i1 %12, %13364  %15 = icmp ult i64 0, 0365  %16 = or i1 %14, %15366  %17 = icmp ult i64 0, 0367  %18 = or i1 %16, %17368  %19 = icmp ult i64 0, 0369  %20 = or i1 %18, %19370  %21 = icmp ult i64 0, 0371  %22 = or i1 %20, %21372  %23 = icmp ult i64 0, 0373  %24 = or i1 %22, %23374  %25 = icmp ult i64 0, 0375  %26 = or i1 %24, %25376  %27 = icmp ult i64 0, 0377  %28 = or i1 %26, %27378  %29 = icmp ult i64 0, 0379  %30 = or i1 %28, %29380  %31 = icmp ult i64 %1, 0381  %32 = or i1 %30, %31382  %33 = icmp ult i64 0, 0383  %34 = or i1 %32, %33384  %35 = icmp ult i64 0, 0385  %36 = or i1 %34, %35386  %37 = icmp ult i64 0, 0387  %38 = or i1 %36, %37388  %39 = icmp ult i64 0, 0389  %40 = or i1 %38, %39390  %41 = icmp ult i64 0, 0391  %42 = or i1 %40, %41392  %43 = icmp ult i64 0, 0393  %44 = or i1 %42, %43394  %45 = icmp ult i64 %1, 0395  %46 = or i1 %44, %45396  %47 = icmp ult i64 0, 0397  %48 = or i1 %46, %47398  %49 = icmp ult i64 0, 0399  %50 = or i1 %48, %49400  %51 = icmp ult i64 0, 0401  %52 = or i1 %50, %51402  %53 = icmp ult i64 0, 0403  %54 = or i1 %52, %53404  %55 = icmp ult i64 0, 0405  %56 = or i1 %54, %55406  %57 = icmp ult i64 0, 0407  %58 = or i1 %56, %57408  %59 = icmp ult i64 0, 0409  %60 = or i1 %58, %59410  %61 = icmp ult i64 0, 0411  %62 = or i1 %60, %61412  %63 = icmp ult i64 0, 0413  %64 = or i1 %62, %63414  br i1 %64, label %66, label %65415 41665:                                               ; preds = %0417  ret void418 41966:                                               ; preds = %0420  ret void421}422 423define i8 @reduce_xor(ptr %a, ptr %b) {424; CHECK-LABEL: @reduce_xor(425; CHECK-NEXT:  entry:426; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0427; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0428; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1429; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1430; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]431; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> [[TMP2]])432; CHECK-NEXT:    [[OP_RDX:%.*]] = xor i8 [[TMP3]], 1433; CHECK-NEXT:    ret i8 [[OP_RDX]]434;435entry:436  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0437  %0 = load i8, ptr %arrayidx, align 1438  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0439  %1 = load i8, ptr %arrayidx3, align 1440  %and12 = and i8 %1, %0441  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1442  %2 = load i8, ptr %arrayidx.1, align 1443  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1444  %3 = load i8, ptr %arrayidx3.1, align 1445  %and12.1 = and i8 %3, %2446  %4 = xor i8 %and12, %and12.1447  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2448  %5 = load i8, ptr %arrayidx.2, align 1449  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2450  %6 = load i8, ptr %arrayidx3.2, align 1451  %and12.2 = and i8 %6, %5452  %7 = xor i8 %4, %and12.2453  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3454  %8 = load i8, ptr %arrayidx.3, align 1455  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3456  %9 = load i8, ptr %arrayidx3.3, align 1457  %and12.3 = and i8 %9, %8458  %10 = xor i8 %7, %and12.3459  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4460  %11 = load i8, ptr %arrayidx.4, align 1461  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4462  %12 = load i8, ptr %arrayidx3.4, align 1463  %and12.4 = and i8 %12, %11464  %13 = xor i8 %10, %and12.4465  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5466  %14 = load i8, ptr %arrayidx.5, align 1467  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5468  %15 = load i8, ptr %arrayidx3.5, align 1469  %and12.5 = and i8 %15, %14470  %16 = xor i8 %13, %and12.5471  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6472  %17 = load i8, ptr %arrayidx.6, align 1473  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6474  %18 = load i8, ptr %arrayidx3.6, align 1475  %and12.6 = and i8 %18, %17476  %19 = xor i8 %16, %and12.6477  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7478  %20 = load i8, ptr %arrayidx.7, align 1479  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7480  %21 = load i8, ptr %arrayidx3.7, align 1481  %and12.7 = and i8 %21, %20482  %22 = xor i8 %19, %and12.7483  %xor13.7 = xor i8 %22, 1484  ret i8 %xor13.7485}486 487 488 489define i8 @reduce_add(ptr %a, ptr %b) {490; CHECK-LABEL: @reduce_add(491; CHECK-NEXT:  entry:492; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0493; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0494; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1495; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1496; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]497; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> [[TMP2]])498; CHECK-NEXT:    [[OP_RDX:%.*]] = add i8 [[TMP3]], 1499; CHECK-NEXT:    ret i8 [[OP_RDX]]500;501entry:502  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0503  %0 = load i8, ptr %arrayidx, align 1504  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0505  %1 = load i8, ptr %arrayidx3, align 1506  %and12 = and i8 %1, %0507  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1508  %2 = load i8, ptr %arrayidx.1, align 1509  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1510  %3 = load i8, ptr %arrayidx3.1, align 1511  %and12.1 = and i8 %3, %2512  %4 = add i8 %and12, %and12.1513  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2514  %5 = load i8, ptr %arrayidx.2, align 1515  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2516  %6 = load i8, ptr %arrayidx3.2, align 1517  %and12.2 = and i8 %6, %5518  %7 = add i8 %4, %and12.2519  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3520  %8 = load i8, ptr %arrayidx.3, align 1521  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3522  %9 = load i8, ptr %arrayidx3.3, align 1523  %and12.3 = and i8 %9, %8524  %10 = add i8 %7, %and12.3525  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4526  %11 = load i8, ptr %arrayidx.4, align 1527  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4528  %12 = load i8, ptr %arrayidx3.4, align 1529  %and12.4 = and i8 %12, %11530  %13 = add i8 %10, %and12.4531  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5532  %14 = load i8, ptr %arrayidx.5, align 1533  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5534  %15 = load i8, ptr %arrayidx3.5, align 1535  %and12.5 = and i8 %15, %14536  %16 = add i8 %13, %and12.5537  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6538  %17 = load i8, ptr %arrayidx.6, align 1539  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6540  %18 = load i8, ptr %arrayidx3.6, align 1541  %and12.6 = and i8 %18, %17542  %19 = add i8 %16, %and12.6543  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7544  %20 = load i8, ptr %arrayidx.7, align 1545  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7546  %21 = load i8, ptr %arrayidx3.7, align 1547  %and12.7 = and i8 %21, %20548  %22 = add i8 %19, %and12.7549  %add13.7 = add i8 %22, 1550  ret i8 %add13.7551}552 553declare i8 @llvm.smin.i8(i8, i8)554 555define i8 @reduce_smin(ptr %a, ptr %b) {556; CHECK-LABEL: @reduce_smin(557; CHECK-NEXT:  entry:558; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0559; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0560; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1561; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1562; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]563; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.smin.v8i8(<8 x i8> [[TMP2]])564; CHECK-NEXT:    ret i8 [[TMP3]]565;566entry:567  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0568  %0 = load i8, ptr %arrayidx, align 1569  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0570  %1 = load i8, ptr %arrayidx3, align 1571  %and12 = and i8 %1, %0572  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1573  %2 = load i8, ptr %arrayidx.1, align 1574  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1575  %3 = load i8, ptr %arrayidx3.1, align 1576  %and12.1 = and i8 %3, %2577  %4 = tail call i8 @llvm.smin.i8(i8 %and12, i8 %and12.1)578  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2579  %5 = load i8, ptr %arrayidx.2, align 1580  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2581  %6 = load i8, ptr %arrayidx3.2, align 1582  %and12.2 = and i8 %6, %5583  %7 = tail call i8 @llvm.smin.i8(i8 %4, i8 %and12.2)584  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3585  %8 = load i8, ptr %arrayidx.3, align 1586  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3587  %9 = load i8, ptr %arrayidx3.3, align 1588  %and12.3 = and i8 %9, %8589  %10 = tail call i8 @llvm.smin.i8(i8 %7, i8 %and12.3)590  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4591  %11 = load i8, ptr %arrayidx.4, align 1592  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4593  %12 = load i8, ptr %arrayidx3.4, align 1594  %and12.4 = and i8 %12, %11595  %13 = tail call i8 @llvm.smin.i8(i8 %10, i8 %and12.4)596  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5597  %14 = load i8, ptr %arrayidx.5, align 1598  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5599  %15 = load i8, ptr %arrayidx3.5, align 1600  %and12.5 = and i8 %15, %14601  %16 = tail call i8 @llvm.smin.i8(i8 %13, i8 %and12.5)602  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6603  %17 = load i8, ptr %arrayidx.6, align 1604  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6605  %18 = load i8, ptr %arrayidx3.6, align 1606  %and12.6 = and i8 %18, %17607  %19 = tail call i8 @llvm.smin.i8(i8 %16, i8 %and12.6)608  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7609  %20 = load i8, ptr %arrayidx.7, align 1610  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7611  %21 = load i8, ptr %arrayidx3.7, align 1612  %and12.7 = and i8 %21, %20613  %22 = tail call i8 @llvm.smin.i8(i8 %19, i8 %and12.7)614  ret i8 %22615}616 617declare i8 @llvm.smax.i8(i8, i8)618 619define i8 @reduce_smax(ptr %a, ptr %b) {620; CHECK-LABEL: @reduce_smax(621; CHECK-NEXT:  entry:622; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0623; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0624; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1625; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1626; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]627; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> [[TMP2]])628; CHECK-NEXT:    ret i8 [[TMP3]]629;630entry:631  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0632  %0 = load i8, ptr %arrayidx, align 1633  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0634  %1 = load i8, ptr %arrayidx3, align 1635  %and12 = and i8 %1, %0636  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1637  %2 = load i8, ptr %arrayidx.1, align 1638  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1639  %3 = load i8, ptr %arrayidx3.1, align 1640  %and12.1 = and i8 %3, %2641  %4 = tail call i8 @llvm.smax.i8(i8 %and12, i8 %and12.1)642  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2643  %5 = load i8, ptr %arrayidx.2, align 1644  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2645  %6 = load i8, ptr %arrayidx3.2, align 1646  %and12.2 = and i8 %6, %5647  %7 = tail call i8 @llvm.smax.i8(i8 %4, i8 %and12.2)648  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3649  %8 = load i8, ptr %arrayidx.3, align 1650  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3651  %9 = load i8, ptr %arrayidx3.3, align 1652  %and12.3 = and i8 %9, %8653  %10 = tail call i8 @llvm.smax.i8(i8 %7, i8 %and12.3)654  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4655  %11 = load i8, ptr %arrayidx.4, align 1656  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4657  %12 = load i8, ptr %arrayidx3.4, align 1658  %and12.4 = and i8 %12, %11659  %13 = tail call i8 @llvm.smax.i8(i8 %10, i8 %and12.4)660  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5661  %14 = load i8, ptr %arrayidx.5, align 1662  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5663  %15 = load i8, ptr %arrayidx3.5, align 1664  %and12.5 = and i8 %15, %14665  %16 = tail call i8 @llvm.smax.i8(i8 %13, i8 %and12.5)666  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6667  %17 = load i8, ptr %arrayidx.6, align 1668  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6669  %18 = load i8, ptr %arrayidx3.6, align 1670  %and12.6 = and i8 %18, %17671  %19 = tail call i8 @llvm.smax.i8(i8 %16, i8 %and12.6)672  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7673  %20 = load i8, ptr %arrayidx.7, align 1674  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7675  %21 = load i8, ptr %arrayidx3.7, align 1676  %and12.7 = and i8 %21, %20677  %22 = tail call i8 @llvm.smax.i8(i8 %19, i8 %and12.7)678  ret i8 %22679}680 681declare i8 @llvm.umax.i8(i8, i8)682 683define i8 @reduce_umax(ptr %a, ptr %b) {684; CHECK-LABEL: @reduce_umax(685; CHECK-NEXT:  entry:686; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0687; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0688; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1689; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1690; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]691; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> [[TMP2]])692; CHECK-NEXT:    ret i8 [[TMP3]]693;694entry:695  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0696  %0 = load i8, ptr %arrayidx, align 1697  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0698  %1 = load i8, ptr %arrayidx3, align 1699  %and12 = and i8 %1, %0700  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1701  %2 = load i8, ptr %arrayidx.1, align 1702  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1703  %3 = load i8, ptr %arrayidx3.1, align 1704  %and12.1 = and i8 %3, %2705  %4 = tail call i8 @llvm.umax.i8(i8 %and12, i8 %and12.1)706  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2707  %5 = load i8, ptr %arrayidx.2, align 1708  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2709  %6 = load i8, ptr %arrayidx3.2, align 1710  %and12.2 = and i8 %6, %5711  %7 = tail call i8 @llvm.umax.i8(i8 %4, i8 %and12.2)712  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3713  %8 = load i8, ptr %arrayidx.3, align 1714  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3715  %9 = load i8, ptr %arrayidx3.3, align 1716  %and12.3 = and i8 %9, %8717  %10 = tail call i8 @llvm.umax.i8(i8 %7, i8 %and12.3)718  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4719  %11 = load i8, ptr %arrayidx.4, align 1720  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4721  %12 = load i8, ptr %arrayidx3.4, align 1722  %and12.4 = and i8 %12, %11723  %13 = tail call i8 @llvm.umax.i8(i8 %10, i8 %and12.4)724  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5725  %14 = load i8, ptr %arrayidx.5, align 1726  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5727  %15 = load i8, ptr %arrayidx3.5, align 1728  %and12.5 = and i8 %15, %14729  %16 = tail call i8 @llvm.umax.i8(i8 %13, i8 %and12.5)730  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6731  %17 = load i8, ptr %arrayidx.6, align 1732  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6733  %18 = load i8, ptr %arrayidx3.6, align 1734  %and12.6 = and i8 %18, %17735  %19 = tail call i8 @llvm.umax.i8(i8 %16, i8 %and12.6)736  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7737  %20 = load i8, ptr %arrayidx.7, align 1738  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7739  %21 = load i8, ptr %arrayidx3.7, align 1740  %and12.7 = and i8 %21, %20741  %22 = tail call i8 @llvm.umax.i8(i8 %19, i8 %and12.7)742  ret i8 %22743}744 745declare i8 @llvm.umin.i8(i8, i8)746 747define i8 @reduce_umin(ptr %a, ptr %b) {748; CHECK-LABEL: @reduce_umin(749; CHECK-NEXT:  entry:750; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds [[STRUCT_BUF:%.*]], ptr [[A:%.*]], i64 0, i32 0, i64 0751; CHECK-NEXT:    [[ARRAYIDX3:%.*]] = getelementptr inbounds [[STRUCT_BUF]], ptr [[B:%.*]], i64 0, i32 0, i64 0752; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[ARRAYIDX]], align 1753; CHECK-NEXT:    [[TMP1:%.*]] = load <8 x i8>, ptr [[ARRAYIDX3]], align 1754; CHECK-NEXT:    [[TMP2:%.*]] = and <8 x i8> [[TMP1]], [[TMP0]]755; CHECK-NEXT:    [[TMP3:%.*]] = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> [[TMP2]])756; CHECK-NEXT:    ret i8 [[TMP3]]757;758entry:759  %arrayidx = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 0760  %0 = load i8, ptr %arrayidx, align 1761  %arrayidx3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 0762  %1 = load i8, ptr %arrayidx3, align 1763  %and12 = and i8 %1, %0764  %arrayidx.1 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 1765  %2 = load i8, ptr %arrayidx.1, align 1766  %arrayidx3.1 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 1767  %3 = load i8, ptr %arrayidx3.1, align 1768  %and12.1 = and i8 %3, %2769  %4 = tail call i8 @llvm.umin.i8(i8 %and12, i8 %and12.1)770  %arrayidx.2 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 2771  %5 = load i8, ptr %arrayidx.2, align 1772  %arrayidx3.2 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 2773  %6 = load i8, ptr %arrayidx3.2, align 1774  %and12.2 = and i8 %6, %5775  %7 = tail call i8 @llvm.umin.i8(i8 %4, i8 %and12.2)776  %arrayidx.3 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 3777  %8 = load i8, ptr %arrayidx.3, align 1778  %arrayidx3.3 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 3779  %9 = load i8, ptr %arrayidx3.3, align 1780  %and12.3 = and i8 %9, %8781  %10 = tail call i8 @llvm.umin.i8(i8 %7, i8 %and12.3)782  %arrayidx.4 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 4783  %11 = load i8, ptr %arrayidx.4, align 1784  %arrayidx3.4 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 4785  %12 = load i8, ptr %arrayidx3.4, align 1786  %and12.4 = and i8 %12, %11787  %13 = tail call i8 @llvm.umin.i8(i8 %10, i8 %and12.4)788  %arrayidx.5 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 5789  %14 = load i8, ptr %arrayidx.5, align 1790  %arrayidx3.5 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 5791  %15 = load i8, ptr %arrayidx3.5, align 1792  %and12.5 = and i8 %15, %14793  %16 = tail call i8 @llvm.umin.i8(i8 %13, i8 %and12.5)794  %arrayidx.6 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 6795  %17 = load i8, ptr %arrayidx.6, align 1796  %arrayidx3.6 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 6797  %18 = load i8, ptr %arrayidx3.6, align 1798  %and12.6 = and i8 %18, %17799  %19 = tail call i8 @llvm.umin.i8(i8 %16, i8 %and12.6)800  %arrayidx.7 = getelementptr inbounds %struct.buf, ptr %a, i64 0, i32 0, i64 7801  %20 = load i8, ptr %arrayidx.7, align 1802  %arrayidx3.7 = getelementptr inbounds %struct.buf, ptr %b, i64 0, i32 0, i64 7803  %21 = load i8, ptr %arrayidx3.7, align 1804  %and12.7 = and i8 %21, %20805  %22 = tail call i8 @llvm.umin.i8(i8 %19, i8 %and12.7)806  ret i8 %22807}808 809; Next batch exercise reductions involing zext of narrower loads810 811define i64 @red_zext_ld_2xi64(ptr %ptr) {812; CHECK-LABEL: @red_zext_ld_2xi64(813; CHECK-NEXT:  entry:814; CHECK-NEXT:    [[LD0:%.*]] = load i8, ptr [[PTR:%.*]], align 1815; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[LD0]] to i64816; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 1817; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[GEP]], align 1818; CHECK-NEXT:    [[ZEXT_1:%.*]] = zext i8 [[LD1]] to i64819; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw nsw i64 [[ZEXT]], [[ZEXT_1]]820; CHECK-NEXT:    ret i64 [[ADD_1]]821;822entry:823  %ld0 = load i8, ptr %ptr824  %zext = zext i8 %ld0 to i64825  %gep = getelementptr inbounds i8, ptr %ptr, i64 1826  %ld1 = load i8, ptr %gep827  %zext.1 = zext i8 %ld1 to i64828  %add.1 = add nuw nsw i64 %zext, %zext.1829  ret i64 %add.1830}831 832define i64 @red_zext_ld_4xi64(ptr %ptr) {833; CHECK-LABEL: @red_zext_ld_4xi64(834; CHECK-NEXT:  entry:835; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[PTR:%.*]], align 1836; CHECK-NEXT:    [[TMP1:%.*]] = zext <4 x i8> [[TMP0]] to <4 x i16>837; CHECK-NEXT:    [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> [[TMP1]])838; CHECK-NEXT:    [[ADD_3:%.*]] = zext i16 [[TMP2]] to i64839; CHECK-NEXT:    ret i64 [[ADD_3]]840;841entry:842  %ld0 = load i8, ptr %ptr843  %zext = zext i8 %ld0 to i64844  %gep = getelementptr inbounds i8, ptr %ptr, i64 1845  %ld1 = load i8, ptr %gep846  %zext.1 = zext i8 %ld1 to i64847  %add.1 = add nuw nsw i64 %zext, %zext.1848  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 2849  %ld2 = load i8, ptr %gep.1850  %zext.2 = zext i8 %ld2 to i64851  %add.2 = add nuw nsw i64 %add.1, %zext.2852  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 3853  %ld3 = load i8, ptr %gep.2854  %zext.3 = zext i8 %ld3 to i64855  %add.3 = add nuw nsw i64 %add.2, %zext.3856  ret i64 %add.3857}858 859define i64 @red_zext_ld_8xi64(ptr %ptr) {860; CHECK-LABEL: @red_zext_ld_8xi64(861; CHECK-NEXT:  entry:862; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR:%.*]], align 1863; CHECK-NEXT:    [[TMP1:%.*]] = zext <8 x i8> [[TMP0]] to <8 x i64>864; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP1]])865; CHECK-NEXT:    ret i64 [[TMP2]]866;867entry:868  %ld0 = load i8, ptr %ptr869  %zext = zext i8 %ld0 to i64870  %gep = getelementptr inbounds i8, ptr %ptr, i64 1871  %ld1 = load i8, ptr %gep872  %zext.1 = zext i8 %ld1 to i64873  %add.1 = add nuw nsw i64 %zext, %zext.1874  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 2875  %ld2 = load i8, ptr %gep.1876  %zext.2 = zext i8 %ld2 to i64877  %add.2 = add nuw nsw i64 %add.1, %zext.2878  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 3879  %ld3 = load i8, ptr %gep.2880  %zext.3 = zext i8 %ld3 to i64881  %add.3 = add nuw nsw i64 %add.2, %zext.3882  %gep.3 = getelementptr inbounds i8, ptr %ptr, i64 4883  %ld4 = load i8, ptr %gep.3884  %zext.4 = zext i8 %ld4 to i64885  %add.4 = add nuw nsw i64 %add.3, %zext.4886  %gep.4 = getelementptr inbounds i8, ptr %ptr, i64 5887  %ld5 = load i8, ptr %gep.4888  %zext.5 = zext i8 %ld5 to i64889  %add.5 = add nuw nsw i64 %add.4, %zext.5890  %gep.5 = getelementptr inbounds i8, ptr %ptr, i64 6891  %ld6 = load i8, ptr %gep.5892  %zext.6 = zext i8 %ld6 to i64893  %add.6 = add nuw nsw i64 %add.5, %zext.6894  %gep.6 = getelementptr inbounds i8, ptr %ptr, i64 7895  %ld7 = load i8, ptr %gep.6896  %zext.7 = zext i8 %ld7 to i64897  %add.7 = add nuw nsw i64 %add.6, %zext.7898  ret i64 %add.7899}900 901define i64 @red_zext_ld_16xi64(ptr %ptr) {902; CHECK-LABEL: @red_zext_ld_16xi64(903; CHECK-NEXT:  entry:904; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x i8>, ptr [[PTR:%.*]], align 1905; CHECK-NEXT:    [[TMP1:%.*]] = zext <16 x i8> [[TMP0]] to <16 x i64>906; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP1]])907; CHECK-NEXT:    ret i64 [[TMP2]]908;909entry:910  %ld0 = load i8, ptr %ptr911  %zext = zext i8 %ld0 to i64912  %gep = getelementptr inbounds i8, ptr %ptr, i64 1913  %ld1 = load i8, ptr %gep914  %zext.1 = zext i8 %ld1 to i64915  %add.1 = add nuw nsw i64 %zext, %zext.1916  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 2917  %ld2 = load i8, ptr %gep.1918  %zext.2 = zext i8 %ld2 to i64919  %add.2 = add nuw nsw i64 %add.1, %zext.2920  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 3921  %ld3 = load i8, ptr %gep.2922  %zext.3 = zext i8 %ld3 to i64923  %add.3 = add nuw nsw i64 %add.2, %zext.3924  %gep.3 = getelementptr inbounds i8, ptr %ptr, i64 4925  %ld4 = load i8, ptr %gep.3926  %zext.4 = zext i8 %ld4 to i64927  %add.4 = add nuw nsw i64 %add.3, %zext.4928  %gep.4 = getelementptr inbounds i8, ptr %ptr, i64 5929  %ld5 = load i8, ptr %gep.4930  %zext.5 = zext i8 %ld5 to i64931  %add.5 = add nuw nsw i64 %add.4, %zext.5932  %gep.5 = getelementptr inbounds i8, ptr %ptr, i64 6933  %ld6 = load i8, ptr %gep.5934  %zext.6 = zext i8 %ld6 to i64935  %add.6 = add nuw nsw i64 %add.5, %zext.6936  %gep.6 = getelementptr inbounds i8, ptr %ptr, i64 7937  %ld7 = load i8, ptr %gep.6938  %zext.7 = zext i8 %ld7 to i64939  %add.7 = add nuw nsw i64 %add.6, %zext.7940  %gep.7 = getelementptr inbounds i8, ptr %ptr, i64 8941  %ld8 = load i8, ptr %gep.7942  %zext.8 = zext i8 %ld8 to i64943  %add.8 = add nuw nsw i64 %add.7, %zext.8944  %gep.8 = getelementptr inbounds i8, ptr %ptr, i64 9945  %ld9 = load i8, ptr %gep.8946  %zext.9 = zext i8 %ld9 to i64947  %add.9 = add nuw nsw i64 %add.8, %zext.9948  %gep.9 = getelementptr inbounds i8, ptr %ptr, i64 10949  %ld10 = load i8, ptr %gep.9950  %zext.10 = zext i8 %ld10 to i64951  %add.10 = add nuw nsw i64 %add.9, %zext.10952  %gep.10 = getelementptr inbounds i8, ptr %ptr, i64 11953  %ld11 = load i8, ptr %gep.10954  %zext.11 = zext i8 %ld11 to i64955  %add.11 = add nuw nsw i64 %add.10, %zext.11956  %gep.11 = getelementptr inbounds i8, ptr %ptr, i64 12957  %ld12 = load i8, ptr %gep.11958  %zext.12 = zext i8 %ld12 to i64959  %add.12 = add nuw nsw i64 %add.11, %zext.12960  %gep.12 = getelementptr inbounds i8, ptr %ptr, i64 13961  %ld13 = load i8, ptr %gep.12962  %zext.13 = zext i8 %ld13 to i64963  %add.13 = add nuw nsw i64 %add.12, %zext.13964  %gep.13 = getelementptr inbounds i8, ptr %ptr, i64 14965  %ld14 = load i8, ptr %gep.13966  %zext.14 = zext i8 %ld14 to i64967  %add.14 = add nuw nsw i64 %add.13, %zext.14968  %gep.14 = getelementptr inbounds i8, ptr %ptr, i64 15969  %ld15 = load i8, ptr %gep.14970  %zext.15 = zext i8 %ld15 to i64971  %add.15 = add nuw nsw i64 %add.14, %zext.15972  ret i64 %add.15973}974 975declare i32 @llvm.abs.i32(i32, i1)976 977define i32 @stride_sum_abs_diff(ptr %p, ptr %q, i64 %stride) {978; CHECK-LABEL: @stride_sum_abs_diff(979; CHECK-NEXT:    [[P_2:%.*]] = getelementptr inbounds i32, ptr [[P:%.*]], i64 [[STRIDE:%.*]]980; CHECK-NEXT:    [[Q_2:%.*]] = getelementptr inbounds i32, ptr [[Q:%.*]], i64 [[STRIDE]]981; CHECK-NEXT:    [[TMP1:%.*]] = load <2 x i32>, ptr [[P]], align 4982; CHECK-NEXT:    [[TMP2:%.*]] = load <2 x i32>, ptr [[Q]], align 4983; CHECK-NEXT:    [[TMP3:%.*]] = load <2 x i32>, ptr [[P_2]], align 4984; CHECK-NEXT:    [[TMP4:%.*]] = load <2 x i32>, ptr [[Q_2]], align 4985; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> [[TMP3]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>986; CHECK-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>987; CHECK-NEXT:    [[TMP9:%.*]] = sub <4 x i32> [[TMP6]], [[TMP8]]988; CHECK-NEXT:    [[TMP10:%.*]] = call <4 x i32> @llvm.abs.v4i32(<4 x i32> [[TMP9]], i1 true)989; CHECK-NEXT:    [[TMP11:%.*]] = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> [[TMP10]])990; CHECK-NEXT:    ret i32 [[TMP11]]991;992  %x.0 = load i32, ptr %p993  %y.0 = load i32, ptr %q994  %sub.0 = sub i32 %x.0, %y.0995  %abs.0 = tail call i32 @llvm.abs.i32(i32 %sub.0, i1 true)996 997  %p.1 = getelementptr inbounds i32, ptr %p, i64 1998  %x.1 = load i32, ptr %p.1999  %q.1 = getelementptr inbounds i32, ptr %q, i64 11000  %y.1 = load i32, ptr %q.11001  %sub.1 = sub i32 %x.1, %y.11002  %abs.1 = tail call i32 @llvm.abs.i32(i32 %sub.1, i1 true)1003  %sum.0 = add i32 %abs.0, %abs.11004 1005  %p.2 = getelementptr inbounds i32, ptr %p, i64 %stride1006  %q.2 = getelementptr inbounds i32, ptr %q, i64 %stride1007 1008  %x.2 = load i32, ptr %p.21009  %y.2 = load i32, ptr %q.21010  %sub.2 = sub i32 %x.2, %y.21011  %abs.2 = tail call i32 @llvm.abs.i32(i32 %sub.2, i1 true)1012  %sum.1 = add i32 %sum.0, %abs.21013 1014  %p.3 = getelementptr inbounds i32, ptr %p.2, i64 11015  %x.3 = load i32, ptr %p.31016  %q.3 = getelementptr inbounds i32, ptr %q.2, i64 11017  %y.3 = load i32, ptr %q.31018  %sub.3 = sub i32 %x.3, %y.31019  %abs.3 = tail call i32 @llvm.abs.i32(i32 %sub.3, i1 true)1020  %sum.2 = add i32 %sum.1, %abs.31021 1022  ret i32 %sum.21023}1024 1025define i32 @reduce_sum_2arrays_a(ptr noalias %p, ptr noalias %q) {1026; CHECK-LABEL: @reduce_sum_2arrays_a(1027; CHECK-NEXT:  entry:1028; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[P:%.*]], align 11029; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i8>, ptr [[Q:%.*]], align 11030; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1031; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1032; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> [[TMP1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1033; CHECK-NEXT:    [[TMP4:%.*]] = zext <8 x i8> [[TMP3]] to <8 x i32>1034; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> [[TMP4]])1035; CHECK-NEXT:    ret i32 [[TMP5]]1036;1037entry:1038  %x.0 = load i8, ptr %p, align 11039  %conv = zext i8 %x.0 to i321040  %y.0 = load i8, ptr %q, align 11041  %conv3 = zext i8 %y.0 to i321042  %add4 = add nuw nsw i32 %conv, %conv31043 1044  %arrayidx.1 = getelementptr inbounds i8, ptr %p, i64 11045  %x.1 = load i8, ptr %arrayidx.1, align 11046  %conv.1 = zext i8 %x.1 to i321047  %arrayidx2.1 = getelementptr inbounds i8, ptr %q, i64 11048  %y.1 = load i8, ptr %arrayidx2.1, align 11049  %conv3.1 = zext i8 %y.1 to i321050  %add.1 = add nuw nsw i32 %add4, %conv.11051  %add4.1 = add nuw nsw i32 %add.1, %conv3.11052 1053  %arrayidx.2 = getelementptr inbounds i8, ptr %p, i64 21054  %x.2 = load i8, ptr %arrayidx.2, align 11055  %conv.2 = zext i8 %x.2 to i321056  %arrayidx2.2 = getelementptr inbounds i8, ptr %q, i64 21057  %y.2 = load i8, ptr %arrayidx2.2, align 11058  %conv3.2 = zext i8 %y.2 to i321059  %add.2 = add nuw nsw i32 %add4.1, %conv.21060  %add4.2 = add nuw nsw i32 %add.2, %conv3.21061 1062  %arrayidx.3 = getelementptr inbounds i8, ptr %p, i64 31063  %x.3 = load i8, ptr %arrayidx.3, align 11064  %conv.3 = zext i8 %x.3 to i321065  %arrayidx2.3 = getelementptr inbounds i8, ptr %q, i64 31066  %y.3 = load i8, ptr %arrayidx2.3, align 11067  %conv3.3 = zext i8 %y.3 to i321068  %add.3 = add nuw nsw i32 %add4.2, %conv.31069  %add4.3 = add nuw nsw i32 %add.3, %conv3.31070 1071  ret i32 %add4.31072}1073 1074define i32 @reduce_sum_2arrays_b(ptr noalias noundef %x, ptr noalias %y) {1075; CHECK-LABEL: @reduce_sum_2arrays_b(1076; CHECK-NEXT:  entry:1077; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[X:%.*]], align 11078; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i8>, ptr [[Y:%.*]], align 11079; CHECK-NEXT:    [[TMP2:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1080; CHECK-NEXT:    [[TMP6:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>1081; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP0]], <4 x i8> [[TMP1]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1082; CHECK-NEXT:    [[TMP4:%.*]] = zext <8 x i8> [[TMP3]] to <8 x i32>1083; CHECK-NEXT:    [[TMP5:%.*]] = call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> [[TMP4]])1084; CHECK-NEXT:    ret i32 [[TMP5]]1085;1086  entry:1087  %0 = load i8, ptr %x, align 11088  %conv = zext i8 %0 to i321089  %arrayidx.1 = getelementptr inbounds i8, ptr %x, i64 11090  %1 = load i8, ptr %arrayidx.1, align 11091  %conv.1 = zext i8 %1 to i321092  %add.1 = add nuw nsw i32 %conv, %conv.11093  %arrayidx.2 = getelementptr inbounds i8, ptr %x, i64 21094  %2 = load i8, ptr %arrayidx.2, align 11095  %conv.2 = zext i8 %2 to i321096  %add.2 = add nuw nsw i32 %add.1, %conv.21097  %arrayidx.3 = getelementptr inbounds i8, ptr %x, i64 31098  %3 = load i8, ptr %arrayidx.3, align 11099  %conv.3 = zext i8 %3 to i321100  %add.3 = add nuw nsw i32 %add.2, %conv.31101  %4 = load i8, ptr %y, align 11102  %conv9 = zext i8 %4 to i321103  %add10 = add nuw nsw i32 %add.3, %conv91104  %arrayidx8.1 = getelementptr inbounds i8, ptr %y, i64 11105  %5 = load i8, ptr %arrayidx8.1, align 11106  %conv9.1 = zext i8 %5 to i321107  %add10.1 = add nuw nsw i32 %add10, %conv9.11108  %arrayidx8.2 = getelementptr inbounds i8, ptr %y, i64 21109  %6 = load i8, ptr %arrayidx8.2, align 11110  %conv9.2 = zext i8 %6 to i321111  %add10.2 = add nuw nsw i32 %add10.1, %conv9.21112  %arrayidx8.3 = getelementptr inbounds i8, ptr %y, i64 31113  %7 = load i8, ptr %arrayidx8.3, align 11114  %conv9.3 = zext i8 %7 to i321115  %add10.3 = add nuw nsw i32 %add10.2, %conv9.31116  ret i32 %add10.31117}1118 1119; Shouldn't vectorize to a reduction because we can't promote it1120define bfloat @fadd_4xbf16(ptr %p) {1121; CHECK-LABEL: @fadd_4xbf16(1122; CHECK-NEXT:    [[X0:%.*]] = load bfloat, ptr [[P:%.*]], align 21123; CHECK-NEXT:    [[P1:%.*]] = getelementptr bfloat, ptr [[P]], i32 11124; CHECK-NEXT:    [[X1:%.*]] = load bfloat, ptr [[P1]], align 21125; CHECK-NEXT:    [[P2:%.*]] = getelementptr bfloat, ptr [[P]], i32 21126; CHECK-NEXT:    [[X2:%.*]] = load bfloat, ptr [[P2]], align 21127; CHECK-NEXT:    [[P3:%.*]] = getelementptr bfloat, ptr [[P]], i32 31128; CHECK-NEXT:    [[X3:%.*]] = load bfloat, ptr [[P3]], align 21129; CHECK-NEXT:    [[R0:%.*]] = fadd fast bfloat [[X0]], [[X1]]1130; CHECK-NEXT:    [[R1:%.*]] = fadd fast bfloat [[R0]], [[X2]]1131; CHECK-NEXT:    [[R2:%.*]] = fadd fast bfloat [[R1]], [[X3]]1132; CHECK-NEXT:    ret bfloat [[R2]]1133;1134  %x0 = load bfloat, ptr %p1135  %p1 = getelementptr bfloat, ptr %p, i32 11136  %x1 = load bfloat, ptr %p11137  %p2 = getelementptr bfloat, ptr %p, i32 21138  %x2 = load bfloat, ptr %p21139  %p3 = getelementptr bfloat, ptr %p, i32 31140  %x3 = load bfloat, ptr %p31141 1142  %r0 = fadd fast bfloat %x0, %x11143  %r1 = fadd fast bfloat %r0, %x21144  %r2 = fadd fast bfloat %r1, %x31145 1146  ret bfloat %r21147}1148 1149; Shouldn't vectorize to a reduction because there's no vfred{u,o}mul.vs1150define bfloat @fmul_4xbf16(ptr %p) {1151; CHECK-LABEL: @fmul_4xbf16(1152; CHECK-NEXT:    [[X0:%.*]] = load bfloat, ptr [[P:%.*]], align 21153; CHECK-NEXT:    [[P1:%.*]] = getelementptr bfloat, ptr [[P]], i32 11154; CHECK-NEXT:    [[X1:%.*]] = load bfloat, ptr [[P1]], align 21155; CHECK-NEXT:    [[P2:%.*]] = getelementptr bfloat, ptr [[P]], i32 21156; CHECK-NEXT:    [[X2:%.*]] = load bfloat, ptr [[P2]], align 21157; CHECK-NEXT:    [[P3:%.*]] = getelementptr bfloat, ptr [[P]], i32 31158; CHECK-NEXT:    [[X3:%.*]] = load bfloat, ptr [[P3]], align 21159; CHECK-NEXT:    [[R0:%.*]] = fmul fast bfloat [[X0]], [[X1]]1160; CHECK-NEXT:    [[R1:%.*]] = fmul fast bfloat [[R0]], [[X2]]1161; CHECK-NEXT:    [[R2:%.*]] = fmul fast bfloat [[R1]], [[X3]]1162; CHECK-NEXT:    ret bfloat [[R2]]1163;1164  %x0 = load bfloat, ptr %p1165  %p1 = getelementptr bfloat, ptr %p, i32 11166  %x1 = load bfloat, ptr %p11167  %p2 = getelementptr bfloat, ptr %p, i32 21168  %x2 = load bfloat, ptr %p21169  %p3 = getelementptr bfloat, ptr %p, i32 31170  %x3 = load bfloat, ptr %p31171 1172  %r0 = fmul fast bfloat %x0, %x11173  %r1 = fmul fast bfloat %r0, %x21174  %r2 = fmul fast bfloat %r1, %x31175 1176  ret bfloat %r21177}1178 1179; Shouldn't vectorize to a reduction on zvfhmin because we can't promote it1180define half @fadd_4xf16(ptr %p) {1181; ZVFHMIN-LABEL: @fadd_4xf16(1182; ZVFHMIN-NEXT:    [[X0:%.*]] = load half, ptr [[P:%.*]], align 21183; ZVFHMIN-NEXT:    [[P1:%.*]] = getelementptr half, ptr [[P]], i32 11184; ZVFHMIN-NEXT:    [[X1:%.*]] = load half, ptr [[P1]], align 21185; ZVFHMIN-NEXT:    [[P2:%.*]] = getelementptr half, ptr [[P]], i32 21186; ZVFHMIN-NEXT:    [[X2:%.*]] = load half, ptr [[P2]], align 21187; ZVFHMIN-NEXT:    [[P3:%.*]] = getelementptr half, ptr [[P]], i32 31188; ZVFHMIN-NEXT:    [[X3:%.*]] = load half, ptr [[P3]], align 21189; ZVFHMIN-NEXT:    [[R0:%.*]] = fadd fast half [[X0]], [[X1]]1190; ZVFHMIN-NEXT:    [[R1:%.*]] = fadd fast half [[R0]], [[X2]]1191; ZVFHMIN-NEXT:    [[R2:%.*]] = fadd fast half [[R1]], [[X3]]1192; ZVFHMIN-NEXT:    ret half [[R2]]1193;1194; ZVFH-LABEL: @fadd_4xf16(1195; ZVFH-NEXT:    [[TMP1:%.*]] = load <4 x half>, ptr [[P:%.*]], align 21196; ZVFH-NEXT:    [[TMP2:%.*]] = call fast half @llvm.vector.reduce.fadd.v4f16(half 0xH0000, <4 x half> [[TMP1]])1197; ZVFH-NEXT:    ret half [[TMP2]]1198;1199  %x0 = load half, ptr %p1200  %p1 = getelementptr half, ptr %p, i32 11201  %x1 = load half, ptr %p11202  %p2 = getelementptr half, ptr %p, i32 21203  %x2 = load half, ptr %p21204  %p3 = getelementptr half, ptr %p, i32 31205  %x3 = load half, ptr %p31206 1207  %r0 = fadd fast half %x0, %x11208  %r1 = fadd fast half %r0, %x21209  %r2 = fadd fast half %r1, %x31210 1211  ret half %r21212}1213 1214; Shouldn't vectorize to a reduction because there's no vfred{u,o}mul.vs1215define half @fmul_4xf16(ptr %p) {1216; CHECK-LABEL: @fmul_4xf16(1217; CHECK-NEXT:    [[X0:%.*]] = load half, ptr [[P:%.*]], align 21218; CHECK-NEXT:    [[P1:%.*]] = getelementptr half, ptr [[P]], i32 11219; CHECK-NEXT:    [[X1:%.*]] = load half, ptr [[P1]], align 21220; CHECK-NEXT:    [[P2:%.*]] = getelementptr half, ptr [[P]], i32 21221; CHECK-NEXT:    [[X2:%.*]] = load half, ptr [[P2]], align 21222; CHECK-NEXT:    [[P3:%.*]] = getelementptr half, ptr [[P]], i32 31223; CHECK-NEXT:    [[X3:%.*]] = load half, ptr [[P3]], align 21224; CHECK-NEXT:    [[R0:%.*]] = fmul fast half [[X0]], [[X1]]1225; CHECK-NEXT:    [[R1:%.*]] = fmul fast half [[R0]], [[X2]]1226; CHECK-NEXT:    [[R2:%.*]] = fmul fast half [[R1]], [[X3]]1227; CHECK-NEXT:    ret half [[R2]]1228;1229  %x0 = load half, ptr %p1230  %p1 = getelementptr half, ptr %p, i32 11231  %x1 = load half, ptr %p11232  %p2 = getelementptr half, ptr %p, i32 21233  %x2 = load half, ptr %p21234  %p3 = getelementptr half, ptr %p, i32 31235  %x3 = load half, ptr %p31236 1237  %r0 = fmul fast half %x0, %x11238  %r1 = fmul fast half %r0, %x21239  %r2 = fmul fast half %r1, %x31240 1241  ret half %r21242}1243