brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.9 KiB · a7a7f64 Raw
300 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -S -passes=slp-vectorizer %s --mtriple=aarch64-- | FileCheck %s3 4; This test checks whether load-zext-add and load-add reduction patterns5; get vectorized by SLP.6 7define i64 @red_zext_ld_2xi64(ptr %ptr) {8; CHECK-LABEL: @red_zext_ld_2xi64(9; CHECK-NEXT:  entry:10; CHECK-NEXT:    [[LD0:%.*]] = load i8, ptr [[PTR:%.*]], align 111; CHECK-NEXT:    [[ZEXT:%.*]] = zext i8 [[LD0]] to i6412; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i64 113; CHECK-NEXT:    [[LD1:%.*]] = load i8, ptr [[GEP]], align 114; CHECK-NEXT:    [[ZEXT_1:%.*]] = zext i8 [[LD1]] to i6415; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw nsw i64 [[ZEXT]], [[ZEXT_1]]16; CHECK-NEXT:    ret i64 [[ADD_1]]17;18entry:19  %ld0 = load i8, ptr %ptr20  %zext = zext i8 %ld0 to i6421  %gep = getelementptr inbounds i8, ptr %ptr, i64 122  %ld1 = load i8, ptr %gep23  %zext.1 = zext i8 %ld1 to i6424  %add.1 = add nuw nsw i64 %zext, %zext.125  ret i64 %add.126}27 28define i64 @red_zext_ld_4xi64(ptr %ptr) {29; CHECK-LABEL: @red_zext_ld_4xi64(30; CHECK-NEXT:  entry:31; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i8>, ptr [[PTR:%.*]], align 132; CHECK-NEXT:    [[TMP1:%.*]] = zext <4 x i8> [[TMP0]] to <4 x i16>33; CHECK-NEXT:    [[TMP2:%.*]] = call i16 @llvm.vector.reduce.add.v4i16(<4 x i16> [[TMP1]])34; CHECK-NEXT:    [[TMP3:%.*]] = zext i16 [[TMP2]] to i6435; CHECK-NEXT:    ret i64 [[TMP3]]36;37entry:38  %ld0 = load i8, ptr %ptr39  %zext = zext i8 %ld0 to i6440  %gep = getelementptr inbounds i8, ptr %ptr, i64 141  %ld1 = load i8, ptr %gep42  %zext.1 = zext i8 %ld1 to i6443  %add.1 = add nuw nsw i64 %zext, %zext.144  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 245  %ld2 = load i8, ptr %gep.146  %zext.2 = zext i8 %ld2 to i6447  %add.2 = add nuw nsw i64 %add.1, %zext.248  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 349  %ld3 = load i8, ptr %gep.250  %zext.3 = zext i8 %ld3 to i6451  %add.3 = add nuw nsw i64 %add.2, %zext.352  ret i64 %add.353}54 55define i64 @red_zext_ld_8xi64(ptr %ptr) {56; CHECK-LABEL: @red_zext_ld_8xi64(57; CHECK-NEXT:  entry:58; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i8>, ptr [[PTR:%.*]], align 159; CHECK-NEXT:    [[TMP1:%.*]] = zext <8 x i8> [[TMP0]] to <8 x i64>60; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP1]])61; CHECK-NEXT:    ret i64 [[TMP2]]62;63entry:64  %ld0 = load i8, ptr %ptr65  %zext = zext i8 %ld0 to i6466  %gep = getelementptr inbounds i8, ptr %ptr, i64 167  %ld1 = load i8, ptr %gep68  %zext.1 = zext i8 %ld1 to i6469  %add.1 = add nuw nsw i64 %zext, %zext.170  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 271  %ld2 = load i8, ptr %gep.172  %zext.2 = zext i8 %ld2 to i6473  %add.2 = add nuw nsw i64 %add.1, %zext.274  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 375  %ld3 = load i8, ptr %gep.276  %zext.3 = zext i8 %ld3 to i6477  %add.3 = add nuw nsw i64 %add.2, %zext.378  %gep.3 = getelementptr inbounds i8, ptr %ptr, i64 479  %ld4 = load i8, ptr %gep.380  %zext.4 = zext i8 %ld4 to i6481  %add.4 = add nuw nsw i64 %add.3, %zext.482  %gep.4 = getelementptr inbounds i8, ptr %ptr, i64 583  %ld5 = load i8, ptr %gep.484  %zext.5 = zext i8 %ld5 to i6485  %add.5 = add nuw nsw i64 %add.4, %zext.586  %gep.5 = getelementptr inbounds i8, ptr %ptr, i64 687  %ld6 = load i8, ptr %gep.588  %zext.6 = zext i8 %ld6 to i6489  %add.6 = add nuw nsw i64 %add.5, %zext.690  %gep.6 = getelementptr inbounds i8, ptr %ptr, i64 791  %ld7 = load i8, ptr %gep.692  %zext.7 = zext i8 %ld7 to i6493  %add.7 = add nuw nsw i64 %add.6, %zext.794  ret i64 %add.795}96 97define i64 @red_zext_ld_16xi64(ptr %ptr) {98; CHECK-LABEL: @red_zext_ld_16xi64(99; CHECK-NEXT:  entry:100; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x i8>, ptr [[PTR:%.*]], align 1101; CHECK-NEXT:    [[TMP1:%.*]] = zext <16 x i8> [[TMP0]] to <16 x i64>102; CHECK-NEXT:    [[TMP2:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP1]])103; CHECK-NEXT:    ret i64 [[TMP2]]104;105entry:106  %ld0 = load i8, ptr %ptr107  %zext = zext i8 %ld0 to i64108  %gep = getelementptr inbounds i8, ptr %ptr, i64 1109  %ld1 = load i8, ptr %gep110  %zext.1 = zext i8 %ld1 to i64111  %add.1 = add nuw nsw i64 %zext, %zext.1112  %gep.1 = getelementptr inbounds i8, ptr %ptr, i64 2113  %ld2 = load i8, ptr %gep.1114  %zext.2 = zext i8 %ld2 to i64115  %add.2 = add nuw nsw i64 %add.1, %zext.2116  %gep.2 = getelementptr inbounds i8, ptr %ptr, i64 3117  %ld3 = load i8, ptr %gep.2118  %zext.3 = zext i8 %ld3 to i64119  %add.3 = add nuw nsw i64 %add.2, %zext.3120  %gep.3 = getelementptr inbounds i8, ptr %ptr, i64 4121  %ld4 = load i8, ptr %gep.3122  %zext.4 = zext i8 %ld4 to i64123  %add.4 = add nuw nsw i64 %add.3, %zext.4124  %gep.4 = getelementptr inbounds i8, ptr %ptr, i64 5125  %ld5 = load i8, ptr %gep.4126  %zext.5 = zext i8 %ld5 to i64127  %add.5 = add nuw nsw i64 %add.4, %zext.5128  %gep.5 = getelementptr inbounds i8, ptr %ptr, i64 6129  %ld6 = load i8, ptr %gep.5130  %zext.6 = zext i8 %ld6 to i64131  %add.6 = add nuw nsw i64 %add.5, %zext.6132  %gep.6 = getelementptr inbounds i8, ptr %ptr, i64 7133  %ld7 = load i8, ptr %gep.6134  %zext.7 = zext i8 %ld7 to i64135  %add.7 = add nuw nsw i64 %add.6, %zext.7136  %gep.7 = getelementptr inbounds i8, ptr %ptr, i64 8137  %ld8 = load i8, ptr %gep.7138  %zext.8 = zext i8 %ld8 to i64139  %add.8 = add nuw nsw i64 %add.7, %zext.8140  %gep.8 = getelementptr inbounds i8, ptr %ptr, i64 9141  %ld9 = load i8, ptr %gep.8142  %zext.9 = zext i8 %ld9 to i64143  %add.9 = add nuw nsw i64 %add.8, %zext.9144  %gep.9 = getelementptr inbounds i8, ptr %ptr, i64 10145  %ld10 = load i8, ptr %gep.9146  %zext.10 = zext i8 %ld10 to i64147  %add.10 = add nuw nsw i64 %add.9, %zext.10148  %gep.10 = getelementptr inbounds i8, ptr %ptr, i64 11149  %ld11 = load i8, ptr %gep.10150  %zext.11 = zext i8 %ld11 to i64151  %add.11 = add nuw nsw i64 %add.10, %zext.11152  %gep.11 = getelementptr inbounds i8, ptr %ptr, i64 12153  %ld12 = load i8, ptr %gep.11154  %zext.12 = zext i8 %ld12 to i64155  %add.12 = add nuw nsw i64 %add.11, %zext.12156  %gep.12 = getelementptr inbounds i8, ptr %ptr, i64 13157  %ld13 = load i8, ptr %gep.12158  %zext.13 = zext i8 %ld13 to i64159  %add.13 = add nuw nsw i64 %add.12, %zext.13160  %gep.13 = getelementptr inbounds i8, ptr %ptr, i64 14161  %ld14 = load i8, ptr %gep.13162  %zext.14 = zext i8 %ld14 to i64163  %add.14 = add nuw nsw i64 %add.13, %zext.14164  %gep.14 = getelementptr inbounds i8, ptr %ptr, i64 15165  %ld15 = load i8, ptr %gep.14166  %zext.15 = zext i8 %ld15 to i64167  %add.15 = add nuw nsw i64 %add.14, %zext.15168  ret i64 %add.15169}170 171 172 173define i64 @red_ld_2xi64(ptr %ptr) {174; CHECK-LABEL: @red_ld_2xi64(175; CHECK-NEXT:  entry:176; CHECK-NEXT:    [[LD0:%.*]] = load i64, ptr [[PTR:%.*]], align 8177; CHECK-NEXT:    [[GEP:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 1178; CHECK-NEXT:    [[LD1:%.*]] = load i64, ptr [[GEP]], align 8179; CHECK-NEXT:    [[ADD_1:%.*]] = add nuw nsw i64 [[LD0]], [[LD1]]180; CHECK-NEXT:    ret i64 [[ADD_1]]181;182entry:183  %ld0 = load i64, ptr %ptr184  %gep = getelementptr inbounds i64, ptr %ptr, i64 1185  %ld1 = load i64, ptr %gep186  %add.1 = add nuw nsw i64 %ld0, %ld1187  ret i64 %add.1188}189 190define i64 @red_ld_4xi64(ptr %ptr) {191; CHECK-LABEL: @red_ld_4xi64(192; CHECK-NEXT:  entry:193; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i64>, ptr [[PTR:%.*]], align 8194; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v4i64(<4 x i64> [[TMP0]])195; CHECK-NEXT:    ret i64 [[TMP1]]196;197entry:198  %ld0 = load i64, ptr %ptr199  %gep = getelementptr inbounds i64, ptr %ptr, i64 1200  %ld1 = load i64, ptr %gep201  %add.1 = add nuw nsw i64 %ld0, %ld1202  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 2203  %ld2 = load i64, ptr %gep.1204  %add.2 = add nuw nsw i64 %add.1, %ld2205  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 3206  %ld3 = load i64, ptr %gep.2207  %add.3 = add nuw nsw i64 %add.2, %ld3208  ret i64 %add.3209}210 211define i64 @red_ld_8xi64(ptr %ptr) {212; CHECK-LABEL: @red_ld_8xi64(213; CHECK-NEXT:  entry:214; CHECK-NEXT:    [[TMP0:%.*]] = load <8 x i64>, ptr [[PTR:%.*]], align 8215; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[TMP0]])216; CHECK-NEXT:    ret i64 [[TMP1]]217;218entry:219  %ld0 = load i64, ptr %ptr220  %gep = getelementptr inbounds i64, ptr %ptr, i64 1221  %ld1 = load i64, ptr %gep222  %add.1 = add nuw nsw i64 %ld0, %ld1223  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 2224  %ld2 = load i64, ptr %gep.1225  %add.2 = add nuw nsw i64 %add.1, %ld2226  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 3227  %ld3 = load i64, ptr %gep.2228  %add.3 = add nuw nsw i64 %add.2, %ld3229  %gep.3 = getelementptr inbounds i64, ptr %ptr, i64 4230  %ld4 = load i64, ptr %gep.3231  %add.4 = add nuw nsw i64 %add.3, %ld4232  %gep.4 = getelementptr inbounds i64, ptr %ptr, i64 5233  %ld5 = load i64, ptr %gep.4234  %add.5 = add nuw nsw i64 %add.4, %ld5235  %gep.5 = getelementptr inbounds i64, ptr %ptr, i64 6236  %ld6 = load i64, ptr %gep.5237  %add.6 = add nuw nsw i64 %add.5, %ld6238  %gep.6 = getelementptr inbounds i64, ptr %ptr, i64 7239  %ld7 = load i64, ptr %gep.6240  %add.7 = add nuw nsw i64 %add.6, %ld7241  ret i64 %add.7242}243 244define i64 @red_ld_16xi64(ptr %ptr) {245; CHECK-LABEL: @red_ld_16xi64(246; CHECK-NEXT:  entry:247; CHECK-NEXT:    [[TMP0:%.*]] = load <16 x i64>, ptr [[PTR:%.*]], align 8248; CHECK-NEXT:    [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v16i64(<16 x i64> [[TMP0]])249; CHECK-NEXT:    ret i64 [[TMP1]]250;251entry:252  %ld0 = load i64, ptr %ptr253  %gep = getelementptr inbounds i64, ptr %ptr, i64 1254  %ld1 = load i64, ptr %gep255  %add.1 = add nuw nsw i64 %ld0, %ld1256  %gep.1 = getelementptr inbounds i64, ptr %ptr, i64 2257  %ld2 = load i64, ptr %gep.1258  %add.2 = add nuw nsw i64 %add.1, %ld2259  %gep.2 = getelementptr inbounds i64, ptr %ptr, i64 3260  %ld3 = load i64, ptr %gep.2261  %add.3 = add nuw nsw i64 %add.2, %ld3262  %gep.3 = getelementptr inbounds i64, ptr %ptr, i64 4263  %ld4 = load i64, ptr %gep.3264  %add.4 = add nuw nsw i64 %add.3, %ld4265  %gep.4 = getelementptr inbounds i64, ptr %ptr, i64 5266  %ld5 = load i64, ptr %gep.4267  %add.5 = add nuw nsw i64 %add.4, %ld5268  %gep.5 = getelementptr inbounds i64, ptr %ptr, i64 6269  %ld6 = load i64, ptr %gep.5270  %add.6 = add nuw nsw i64 %add.5, %ld6271  %gep.6 = getelementptr inbounds i64, ptr %ptr, i64 7272  %ld7 = load i64, ptr %gep.6273  %add.7 = add nuw nsw i64 %add.6, %ld7274  %gep.7 = getelementptr inbounds i64, ptr %ptr, i64 8275  %ld8 = load i64, ptr %gep.7276  %add.8 = add nuw nsw i64 %add.7, %ld8277  %gep.8 = getelementptr inbounds i64, ptr %ptr, i64 9278  %ld9 = load i64, ptr %gep.8279  %add.9 = add nuw nsw i64 %add.8, %ld9280  %gep.9 = getelementptr inbounds i64, ptr %ptr, i64 10281  %ld10 = load i64, ptr %gep.9282  %add.10 = add nuw nsw i64 %add.9, %ld10283  %gep.10 = getelementptr inbounds i64, ptr %ptr, i64 11284  %ld11 = load i64, ptr %gep.10285  %add.11 = add nuw nsw i64 %add.10, %ld11286  %gep.11 = getelementptr inbounds i64, ptr %ptr, i64 12287  %ld12 = load i64, ptr %gep.11288  %add.12 = add nuw nsw i64 %add.11, %ld12289  %gep.12 = getelementptr inbounds i64, ptr %ptr, i64 13290  %ld13 = load i64, ptr %gep.12291  %add.13 = add nuw nsw i64 %add.12, %ld13292  %gep.13 = getelementptr inbounds i64, ptr %ptr, i64 14293  %ld14 = load i64, ptr %gep.13294  %add.14 = add nuw nsw i64 %add.13, %ld14295  %gep.14 = getelementptr inbounds i64, ptr %ptr, i64 15296  %ld15 = load i64, ptr %gep.14297  %add.15 = add nuw nsw i64 %add.14, %ld15298  ret i64 %add.15299}300