130 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=bdver2 < %s | FileCheck %s3 4%"struct.std::array" = type { [32 x i8] }5 6; Function Attrs: nounwind uwtable7define fastcc void @_ZN12_GLOBAL__N_127PolynomialMultiplyRecognize9recognizeEv(i1 %arg) unnamed_addr #0 align 2 {8; CHECK-LABEL: @_ZN12_GLOBAL__N_127PolynomialMultiplyRecognize9recognizeEv(9; CHECK-NEXT: entry:10; CHECK-NEXT: br i1 [[ARG:%.*]], label [[IF_END50_I:%.*]], label [[IF_THEN22_I:%.*]]11; CHECK: if.then22.i:12; CHECK-NEXT: [[SUB_I:%.*]] = add nsw i32 undef, -113; CHECK-NEXT: [[CONV31_I:%.*]] = and i32 undef, [[SUB_I]]14; CHECK-NEXT: [[SHR_I_I:%.*]] = lshr i32 [[CONV31_I]], 115; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i32> poison, i32 [[CONV31_I]], i32 016; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <2 x i32> zeroinitializer17; CHECK-NEXT: [[TMP2:%.*]] = lshr <2 x i32> [[TMP1]], <i32 2, i32 3>18; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x i32> [[TMP1]], <2 x i32> poison, <4 x i32> zeroinitializer19; CHECK-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP3]], <i32 4, i32 5, i32 6, i32 7>20; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <8 x i32> zeroinitializer21; CHECK-NEXT: [[TMP6:%.*]] = lshr <8 x i32> [[TMP5]], <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>22; CHECK-NEXT: [[TMP7:%.*]] = trunc i32 [[SUB_I]] to i823; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x i8> poison, i8 [[TMP7]], i32 024; CHECK-NEXT: [[TMP9:%.*]] = trunc i32 [[SHR_I_I]] to i825; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x i8> [[TMP8]], i8 [[TMP9]], i32 126; CHECK-NEXT: [[TMP11:%.*]] = trunc <8 x i32> [[TMP6]] to <8 x i8>27; CHECK-NEXT: [[TMP12:%.*]] = shufflevector <8 x i8> [[TMP11]], <8 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>28; CHECK-NEXT: [[TMP14:%.*]] = shufflevector <16 x i8> [[TMP10]], <16 x i8> [[TMP12]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23>29; CHECK-NEXT: [[TMP13:%.*]] = trunc <4 x i32> [[TMP4]] to <4 x i8>30; CHECK-NEXT: [[TMP19:%.*]] = shufflevector <4 x i8> [[TMP13]], <4 x i8> poison, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>31; CHECK-NEXT: [[TMP20:%.*]] = shufflevector <16 x i8> [[TMP14]], <16 x i8> [[TMP19]], <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 16, i32 17, i32 18, i32 19, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>32; CHECK-NEXT: [[TMP15:%.*]] = trunc <2 x i32> [[TMP2]] to <2 x i8>33; CHECK-NEXT: [[TMP18:%.*]] = shufflevector <2 x i8> [[TMP15]], <2 x i8> poison, <16 x i32> <i32 0, i32 1, 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>34; CHECK-NEXT: [[TMP16:%.*]] = shufflevector <16 x i8> [[TMP20]], <16 x i8> [[TMP18]], <16 x i32> <i32 0, i32 1, i32 16, i32 17, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>35; CHECK-NEXT: [[TMP17:%.*]] = and <16 x i8> [[TMP16]], splat (i8 1)36; CHECK-NEXT: store <16 x i8> [[TMP17]], ptr undef, align 137; CHECK-NEXT: ret void38; CHECK: if.end50.i:39; CHECK-NEXT: ret void40;41entry:42 br i1 %arg, label %if.end50.i, label %if.then22.i43 44if.then22.i: ; preds = %entry45 %sub.i = add nsw i32 undef, -146 %conv31.i = and i32 undef, %sub.i47 %0 = trunc i32 %sub.i to i848 %conv.i.i1199 = and i8 %0, 149 store i8 %conv.i.i1199, ptr undef, align 150 %shr.i.i = lshr i32 %conv31.i, 151 %1 = trunc i32 %shr.i.i to i852 %conv.1.i.i = and i8 %1, 153 %arrayidx.i.i7.1.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 154 store i8 %conv.1.i.i, ptr %arrayidx.i.i7.1.i.i, align 155 %shr.1.i.i = lshr i32 %conv31.i, 256 %2 = trunc i32 %shr.1.i.i to i857 %conv.2.i.i = and i8 %2, 158 %arrayidx.i.i7.2.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 259 store i8 %conv.2.i.i, ptr %arrayidx.i.i7.2.i.i, align 160 %shr.2.i.i = lshr i32 %conv31.i, 361 %3 = trunc i32 %shr.2.i.i to i862 %conv.3.i.i = and i8 %3, 163 %arrayidx.i.i7.3.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 364 store i8 %conv.3.i.i, ptr %arrayidx.i.i7.3.i.i, align 165 %shr.3.i.i = lshr i32 %conv31.i, 466 %4 = trunc i32 %shr.3.i.i to i867 %conv.4.i.i = and i8 %4, 168 %arrayidx.i.i7.4.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 469 store i8 %conv.4.i.i, ptr %arrayidx.i.i7.4.i.i, align 170 %shr.4.i.i = lshr i32 %conv31.i, 571 %5 = trunc i32 %shr.4.i.i to i872 %conv.5.i.i = and i8 %5, 173 %arrayidx.i.i7.5.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 574 store i8 %conv.5.i.i, ptr %arrayidx.i.i7.5.i.i, align 175 %shr.5.i.i = lshr i32 %conv31.i, 676 %6 = trunc i32 %shr.5.i.i to i877 %conv.6.i.i = and i8 %6, 178 %arrayidx.i.i7.6.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 679 store i8 %conv.6.i.i, ptr %arrayidx.i.i7.6.i.i, align 180 %shr.6.i.i = lshr i32 %conv31.i, 781 %7 = trunc i32 %shr.6.i.i to i882 %conv.7.i.i = and i8 %7, 183 %arrayidx.i.i7.7.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 784 store i8 %conv.7.i.i, ptr %arrayidx.i.i7.7.i.i, align 185 %shr.7.i.i = lshr i32 %conv31.i, 886 %8 = trunc i32 %shr.7.i.i to i887 %conv.8.i.i = and i8 %8, 188 %arrayidx.i.i7.8.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 889 store i8 %conv.8.i.i, ptr %arrayidx.i.i7.8.i.i, align 190 %shr.8.i.i = lshr i32 %conv31.i, 991 %9 = trunc i32 %shr.8.i.i to i892 %conv.9.i.i = and i8 %9, 193 %arrayidx.i.i7.9.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 994 store i8 %conv.9.i.i, ptr %arrayidx.i.i7.9.i.i, align 195 %shr.9.i.i = lshr i32 %conv31.i, 1096 %10 = trunc i32 %shr.9.i.i to i897 %conv.10.i.i = and i8 %10, 198 %arrayidx.i.i7.10.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 1099 store i8 %conv.10.i.i, ptr %arrayidx.i.i7.10.i.i, align 1100 %shr.10.i.i = lshr i32 %conv31.i, 11101 %11 = trunc i32 %shr.10.i.i to i8102 %conv.11.i.i = and i8 %11, 1103 %arrayidx.i.i7.11.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 11104 store i8 %conv.11.i.i, ptr %arrayidx.i.i7.11.i.i, align 1105 %shr.11.i.i = lshr i32 %conv31.i, 12106 %12 = trunc i32 %shr.11.i.i to i8107 %conv.12.i.i = and i8 %12, 1108 %arrayidx.i.i7.12.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 12109 store i8 %conv.12.i.i, ptr %arrayidx.i.i7.12.i.i, align 1110 %shr.12.i.i = lshr i32 %conv31.i, 13111 %13 = trunc i32 %shr.12.i.i to i8112 %conv.13.i.i = and i8 %13, 1113 %arrayidx.i.i7.13.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 13114 store i8 %conv.13.i.i, ptr %arrayidx.i.i7.13.i.i, align 1115 %shr.13.i.i = lshr i32 %conv31.i, 14116 %14 = trunc i32 %shr.13.i.i to i8117 %conv.14.i.i = and i8 %14, 1118 %arrayidx.i.i7.14.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 14119 store i8 %conv.14.i.i, ptr %arrayidx.i.i7.14.i.i, align 1120 %shr.14.i.i = lshr i32 %conv31.i, 15121 %15 = trunc i32 %shr.14.i.i to i8122 %conv.15.i.i = and i8 %15, 1123 %arrayidx.i.i7.15.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 15124 store i8 %conv.15.i.i, ptr %arrayidx.i.i7.15.i.i, align 1125 ret void126 127if.end50.i: ; preds = %entry128 ret void129}130