172 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -S -o - -mtriple=x86_64-unknown-linux -mcpu=bdver2 | FileCheck %s3 4define <2 x i8> @g(<2 x i8> %x, <2 x i8> %y) {5; CHECK-LABEL: @g(6; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <2 x i8> [[X:%.*]], <2 x i8> [[Y:%.*]], <2 x i32> <i32 0, i32 3>7; CHECK-NEXT: [[TMP2:%.*]] = mul <2 x i8> [[TMP1]], [[TMP1]]8; CHECK-NEXT: ret <2 x i8> [[TMP2]]9;10 %x0 = extractelement <2 x i8> %x, i32 011 %y1 = extractelement <2 x i8> %y, i32 112 %x0x0 = mul i8 %x0, %x013 %y1y1 = mul i8 %y1, %y114 %ins1 = insertelement <2 x i8> undef, i8 %x0x0, i32 015 %ins2 = insertelement <2 x i8> %ins1, i8 %y1y1, i32 116 ret <2 x i8> %ins217}18 19define <4 x i8> @h(<4 x i8> %x, <4 x i8> %y) {20; CHECK-LABEL: @h(21; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]], <4 x i32> <i32 0, i32 3, i32 5, i32 6>22; CHECK-NEXT: [[TMP2:%.*]] = mul <4 x i8> [[TMP1]], [[TMP1]]23; CHECK-NEXT: ret <4 x i8> [[TMP2]]24;25 %x0 = extractelement <4 x i8> %x, i32 026 %x3 = extractelement <4 x i8> %x, i32 327 %y1 = extractelement <4 x i8> %y, i32 128 %y2 = extractelement <4 x i8> %y, i32 229 %x0x0 = mul i8 %x0, %x030 %x3x3 = mul i8 %x3, %x331 %y1y1 = mul i8 %y1, %y132 %y2y2 = mul i8 %y2, %y233 %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 034 %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 135 %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 236 %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 337 ret <4 x i8> %ins438}39 40define <4 x i8> @h_undef(<4 x i8> %x, <4 x i8> %y) {41; CHECK-LABEL: @h_undef(42; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i8> undef, i32 043; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i8> [[X:%.*]], i32 344; CHECK-NEXT: [[Y1:%.*]] = extractelement <4 x i8> [[Y:%.*]], i32 145; CHECK-NEXT: [[Y2:%.*]] = extractelement <4 x i8> [[Y]], i32 246; CHECK-NEXT: [[TMP1:%.*]] = insertelement <4 x i8> poison, i8 [[X0]], i32 047; CHECK-NEXT: [[TMP4:%.*]] = insertelement <4 x i8> [[TMP1]], i8 [[X3]], i32 148; CHECK-NEXT: [[TMP5:%.*]] = insertelement <4 x i8> [[TMP4]], i8 [[Y1]], i32 249; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i8> [[TMP5]], i8 [[Y2]], i32 350; CHECK-NEXT: [[TMP3:%.*]] = mul <4 x i8> [[TMP2]], [[TMP2]]51; CHECK-NEXT: ret <4 x i8> [[TMP3]]52;53 %x0 = extractelement <4 x i8> undef, i32 054 %x3 = extractelement <4 x i8> %x, i32 355 %y1 = extractelement <4 x i8> %y, i32 156 %y2 = extractelement <4 x i8> %y, i32 257 %x0x0 = mul i8 %x0, %x058 %x3x3 = mul i8 %x3, %x359 %y1y1 = mul i8 %y1, %y160 %y2y2 = mul i8 %y2, %y261 %ins1 = insertelement <4 x i8> undef, i8 %x0x0, i32 062 %ins2 = insertelement <4 x i8> %ins1, i8 %x3x3, i32 163 %ins3 = insertelement <4 x i8> %ins2, i8 %y1y1, i32 264 %ins4 = insertelement <4 x i8> %ins3, i8 %y2y2, i32 365 ret <4 x i8> %ins466}67 68define i8 @i(<4 x i8> %x, <4 x i8> %y) {69; CHECK-LABEL: @i(70; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]], <4 x i32> <i32 0, i32 3, i32 5, i32 6>71; CHECK-NEXT: [[TMP2:%.*]] = mul <4 x i8> [[TMP1]], [[TMP1]]72; CHECK-NEXT: [[TMP3:%.*]] = call i8 @llvm.vector.reduce.add.v4i8(<4 x i8> [[TMP2]])73; CHECK-NEXT: ret i8 [[TMP3]]74;75 %x0 = extractelement <4 x i8> %x, i32 076 %x3 = extractelement <4 x i8> %x, i32 377 %y1 = extractelement <4 x i8> %y, i32 178 %y2 = extractelement <4 x i8> %y, i32 279 %x0x0 = mul i8 %x0, %x080 %x3x3 = mul i8 %x3, %x381 %y1y1 = mul i8 %y1, %y182 %y2y2 = mul i8 %y2, %y283 %1 = add i8 %x0x0, %x3x384 %2 = add i8 %y1y1, %y2y285 %3 = add i8 %1, %286 ret i8 %387}88 89define i8 @j(<4 x i8> %x, <4 x i8> %y) {90; CHECK-LABEL: @j(91; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x i8> [[X:%.*]], <4 x i8> [[Y:%.*]], <2 x i32> <i32 0, i32 5>92; CHECK-NEXT: [[TMP2:%.*]] = mul <2 x i8> [[TMP1]], [[TMP1]]93; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i8> [[X]], <4 x i8> [[Y]], <2 x i32> <i32 3, i32 6>94; CHECK-NEXT: [[TMP4:%.*]] = mul <2 x i8> [[TMP3]], [[TMP3]]95; CHECK-NEXT: [[TMP5:%.*]] = add <2 x i8> [[TMP2]], [[TMP4]]96; CHECK-NEXT: [[TMP6:%.*]] = extractelement <2 x i8> [[TMP5]], i32 097; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i8> [[TMP5]], i32 198; CHECK-NEXT: [[TMP8:%.*]] = sdiv i8 [[TMP6]], [[TMP7]]99; CHECK-NEXT: ret i8 [[TMP8]]100;101 %x0 = extractelement <4 x i8> %x, i32 0102 %x3 = extractelement <4 x i8> %x, i32 3103 %y1 = extractelement <4 x i8> %y, i32 1104 %y2 = extractelement <4 x i8> %y, i32 2105 %x0x0 = mul i8 %x0, %x0106 %x3x3 = mul i8 %x3, %x3107 %y1y1 = mul i8 %y1, %y1108 %y2y2 = mul i8 %y2, %y2109 %1 = add i8 %x0x0, %x3x3110 %2 = add i8 %y1y1, %y2y2111 %3 = sdiv i8 %1, %2112 ret i8 %3113}114 115define i8 @k(<4 x i8> %x) {116; CHECK-LABEL: @k(117; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i8> [[TMP1:%.*]], <4 x i8> poison, <2 x i32> <i32 0, i32 1>118; CHECK-NEXT: [[TMP10:%.*]] = mul <2 x i8> [[TMP2]], [[TMP2]]119; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <2 x i32> <i32 2, i32 3>120; CHECK-NEXT: [[TMP4:%.*]] = mul <2 x i8> [[TMP3]], [[TMP3]]121; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i8> [[TMP4]], <2 x i8> poison, <2 x i32> <i32 1, i32 0>122; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i8> [[TMP10]], [[TMP5]]123; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i8> [[TMP6]], i32 0124; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i8> [[TMP6]], i32 1125; CHECK-NEXT: [[TMP9:%.*]] = sdiv i8 [[TMP7]], [[TMP8]]126; CHECK-NEXT: ret i8 [[TMP9]]127;128 %x0 = extractelement <4 x i8> %x, i32 0129 %x3 = extractelement <4 x i8> %x, i32 3130 %x1 = extractelement <4 x i8> %x, i32 1131 %x2 = extractelement <4 x i8> %x, i32 2132 %x0x0 = mul i8 %x0, %x0133 %x3x3 = mul i8 %x3, %x3134 %x1x1 = mul i8 %x1, %x1135 %x2x2 = mul i8 %x2, %x2136 %1 = add i8 %x0x0, %x3x3137 %2 = add i8 %x1x1, %x2x2138 %3 = sdiv i8 %1, %2139 ret i8 %3140}141 142define i8 @k_bb(<4 x i8> %x) {143; CHECK-LABEL: @k_bb(144; CHECK-NEXT: br label [[BB1:%.*]]145; CHECK: bb1:146; CHECK-NEXT: [[TMP2:%.*]] = shufflevector <4 x i8> [[TMP1:%.*]], <4 x i8> poison, <2 x i32> <i32 0, i32 1>147; CHECK-NEXT: [[TMP10:%.*]] = mul <2 x i8> [[TMP2]], [[TMP2]]148; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i8> [[TMP1]], <4 x i8> poison, <2 x i32> <i32 2, i32 3>149; CHECK-NEXT: [[TMP4:%.*]] = mul <2 x i8> [[TMP3]], [[TMP3]]150; CHECK-NEXT: [[TMP5:%.*]] = shufflevector <2 x i8> [[TMP4]], <2 x i8> poison, <2 x i32> <i32 1, i32 0>151; CHECK-NEXT: [[TMP6:%.*]] = add <2 x i8> [[TMP10]], [[TMP5]]152; CHECK-NEXT: [[TMP7:%.*]] = extractelement <2 x i8> [[TMP6]], i32 0153; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i8> [[TMP6]], i32 1154; CHECK-NEXT: [[TMP9:%.*]] = sdiv i8 [[TMP7]], [[TMP8]]155; CHECK-NEXT: ret i8 [[TMP9]]156;157 %x0 = extractelement <4 x i8> %x, i32 0158 br label %bb1159bb1:160 %x3 = extractelement <4 x i8> %x, i32 3161 %x1 = extractelement <4 x i8> %x, i32 1162 %x2 = extractelement <4 x i8> %x, i32 2163 %x0x0 = mul i8 %x0, %x0164 %x3x3 = mul i8 %x3, %x3165 %x1x1 = mul i8 %x1, %x1166 %x2x2 = mul i8 %x2, %x2167 %1 = add i8 %x0x0, %x3x3168 %2 = add i8 %x1x1, %x2x2169 %3 = sdiv i8 %1, %2170 ret i8 %3171}172