1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=bdver2 < %s | FileCheck %s 3 4%"struct.std::array" = type { [32 x i8] } 5 6; Function Attrs: nounwind uwtable 7define 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, -1 13; CHECK-NEXT: [[CONV31_I:%.*]] = and i32 undef, [[SUB_I]] 14; CHECK-NEXT: [[SHR_I_I:%.*]] = lshr i32 [[CONV31_I]], 1 15; CHECK-NEXT: [[TMP0:%.*]] = insertelement <2 x i32> poison, i32 [[CONV31_I]], i32 0 16; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i32> [[TMP0]], <2 x i32> poison, <2 x i32> zeroinitializer 17; 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> zeroinitializer 19; 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> zeroinitializer 21; 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 i8 23; CHECK-NEXT: [[TMP8:%.*]] = insertelement <16 x i8> poison, i8 [[TMP7]], i32 0 24; CHECK-NEXT: [[TMP9:%.*]] = trunc i32 [[SHR_I_I]] to i8 25; CHECK-NEXT: [[TMP10:%.*]] = insertelement <16 x i8> [[TMP8]], i8 [[TMP9]], i32 1 26; CHECK-NEXT: [[TMP11:%.*]] = trunc <8 x i32> [[TMP6]] to <8 x i8> 27; CHECK-NEXT: [[TMP12:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v8i8(<16 x i8> [[TMP10]], <8 x i8> [[TMP11]], i64 8) 28; CHECK-NEXT: [[TMP13:%.*]] = trunc <4 x i32> [[TMP4]] to <4 x i8> 29; CHECK-NEXT: [[TMP14:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v4i8(<16 x i8> [[TMP12]], <4 x i8> [[TMP13]], i64 4) 30; CHECK-NEXT: [[TMP15:%.*]] = trunc <2 x i32> [[TMP2]] to <2 x i8> 31; CHECK-NEXT: [[TMP16:%.*]] = call <16 x i8> @llvm.vector.insert.v16i8.v2i8(<16 x i8> [[TMP14]], <2 x i8> [[TMP15]], i64 2) 32; CHECK-NEXT: [[TMP17:%.*]] = and <16 x i8> [[TMP16]], splat (i8 1) 33; CHECK-NEXT: store <16 x i8> [[TMP17]], ptr undef, align 1 34; CHECK-NEXT: ret void 35; CHECK: if.end50.i: 36; CHECK-NEXT: ret void 37; 38entry: 39 br i1 %arg, label %if.end50.i, label %if.then22.i 40 41if.then22.i: ; preds = %entry 42 %sub.i = add nsw i32 undef, -1 43 %conv31.i = and i32 undef, %sub.i 44 %0 = trunc i32 %sub.i to i8 45 %conv.i.i1199 = and i8 %0, 1 46 store i8 %conv.i.i1199, ptr undef, align 1 47 %shr.i.i = lshr i32 %conv31.i, 1 48 %1 = trunc i32 %shr.i.i to i8 49 %conv.1.i.i = and i8 %1, 1 50 %arrayidx.i.i7.1.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 1 51 store i8 %conv.1.i.i, ptr %arrayidx.i.i7.1.i.i, align 1 52 %shr.1.i.i = lshr i32 %conv31.i, 2 53 %2 = trunc i32 %shr.1.i.i to i8 54 %conv.2.i.i = and i8 %2, 1 55 %arrayidx.i.i7.2.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 2 56 store i8 %conv.2.i.i, ptr %arrayidx.i.i7.2.i.i, align 1 57 %shr.2.i.i = lshr i32 %conv31.i, 3 58 %3 = trunc i32 %shr.2.i.i to i8 59 %conv.3.i.i = and i8 %3, 1 60 %arrayidx.i.i7.3.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 3 61 store i8 %conv.3.i.i, ptr %arrayidx.i.i7.3.i.i, align 1 62 %shr.3.i.i = lshr i32 %conv31.i, 4 63 %4 = trunc i32 %shr.3.i.i to i8 64 %conv.4.i.i = and i8 %4, 1 65 %arrayidx.i.i7.4.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 4 66 store i8 %conv.4.i.i, ptr %arrayidx.i.i7.4.i.i, align 1 67 %shr.4.i.i = lshr i32 %conv31.i, 5 68 %5 = trunc i32 %shr.4.i.i to i8 69 %conv.5.i.i = and i8 %5, 1 70 %arrayidx.i.i7.5.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 5 71 store i8 %conv.5.i.i, ptr %arrayidx.i.i7.5.i.i, align 1 72 %shr.5.i.i = lshr i32 %conv31.i, 6 73 %6 = trunc i32 %shr.5.i.i to i8 74 %conv.6.i.i = and i8 %6, 1 75 %arrayidx.i.i7.6.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 6 76 store i8 %conv.6.i.i, ptr %arrayidx.i.i7.6.i.i, align 1 77 %shr.6.i.i = lshr i32 %conv31.i, 7 78 %7 = trunc i32 %shr.6.i.i to i8 79 %conv.7.i.i = and i8 %7, 1 80 %arrayidx.i.i7.7.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 7 81 store i8 %conv.7.i.i, ptr %arrayidx.i.i7.7.i.i, align 1 82 %shr.7.i.i = lshr i32 %conv31.i, 8 83 %8 = trunc i32 %shr.7.i.i to i8 84 %conv.8.i.i = and i8 %8, 1 85 %arrayidx.i.i7.8.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 8 86 store i8 %conv.8.i.i, ptr %arrayidx.i.i7.8.i.i, align 1 87 %shr.8.i.i = lshr i32 %conv31.i, 9 88 %9 = trunc i32 %shr.8.i.i to i8 89 %conv.9.i.i = and i8 %9, 1 90 %arrayidx.i.i7.9.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 9 91 store i8 %conv.9.i.i, ptr %arrayidx.i.i7.9.i.i, align 1 92 %shr.9.i.i = lshr i32 %conv31.i, 10 93 %10 = trunc i32 %shr.9.i.i to i8 94 %conv.10.i.i = and i8 %10, 1 95 %arrayidx.i.i7.10.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 10 96 store i8 %conv.10.i.i, ptr %arrayidx.i.i7.10.i.i, align 1 97 %shr.10.i.i = lshr i32 %conv31.i, 11 98 %11 = trunc i32 %shr.10.i.i to i8 99 %conv.11.i.i = and i8 %11, 1 100 %arrayidx.i.i7.11.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 11 101 store i8 %conv.11.i.i, ptr %arrayidx.i.i7.11.i.i, align 1 102 %shr.11.i.i = lshr i32 %conv31.i, 12 103 %12 = trunc i32 %shr.11.i.i to i8 104 %conv.12.i.i = and i8 %12, 1 105 %arrayidx.i.i7.12.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 12 106 store i8 %conv.12.i.i, ptr %arrayidx.i.i7.12.i.i, align 1 107 %shr.12.i.i = lshr i32 %conv31.i, 13 108 %13 = trunc i32 %shr.12.i.i to i8 109 %conv.13.i.i = and i8 %13, 1 110 %arrayidx.i.i7.13.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 13 111 store i8 %conv.13.i.i, ptr %arrayidx.i.i7.13.i.i, align 1 112 %shr.13.i.i = lshr i32 %conv31.i, 14 113 %14 = trunc i32 %shr.13.i.i to i8 114 %conv.14.i.i = and i8 %14, 1 115 %arrayidx.i.i7.14.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 14 116 store i8 %conv.14.i.i, ptr %arrayidx.i.i7.14.i.i, align 1 117 %shr.14.i.i = lshr i32 %conv31.i, 15 118 %15 = trunc i32 %shr.14.i.i to i8 119 %conv.15.i.i = and i8 %15, 1 120 %arrayidx.i.i7.15.i.i = getelementptr inbounds %"struct.std::array", ptr undef, i64 0, i32 0, i64 15 121 store i8 %conv.15.i.i, ptr %arrayidx.i.i7.15.i.i, align 1 122 ret void 123 124if.end50.i: ; preds = %entry 125 ret void 126} 127