667 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -mtriple=x86_64-unknown -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,SSE3; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=slm -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,SLM4; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=corei7-avx -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX15; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=core-avx2 -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX26; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=knl -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX5127; RUN: opt < %s -mtriple=x86_64-unknown -mcpu=skx -passes=slp-vectorizer -S | FileCheck %s --check-prefixes=CHECK,AVX5128 9define <8 x i32> @add_sub_v8i32(<8 x i32> %a, <8 x i32> %b) {10; SSE-LABEL: @add_sub_v8i32(11; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP2:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>12; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>13; SSE-NEXT: [[TMP8:%.*]] = add <4 x i32> [[TMP1]], [[TMP4]]14; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>15; SSE-NEXT: [[TMP9:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>16; SSE-NEXT: [[TMP6:%.*]] = sub <4 x i32> [[TMP3]], [[TMP9]]17; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>18; SSE-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>19; SSE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>20; SSE-NEXT: ret <8 x i32> [[TMP5]]21;22; SLM-LABEL: @add_sub_v8i32(23; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP2:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>24; SLM-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>25; SLM-NEXT: [[TMP8:%.*]] = add <4 x i32> [[TMP1]], [[TMP4]]26; SLM-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>27; SLM-NEXT: [[TMP9:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>28; SLM-NEXT: [[TMP6:%.*]] = sub <4 x i32> [[TMP3]], [[TMP9]]29; SLM-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>30; SLM-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>31; SLM-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>32; SLM-NEXT: ret <8 x i32> [[TMP5]]33;34; AVX1-LABEL: @add_sub_v8i32(35; AVX1-NEXT: [[TMP1:%.*]] = add <8 x i32> [[A:%.*]], [[B:%.*]]36; AVX1-NEXT: [[TMP2:%.*]] = sub <8 x i32> [[A]], [[B]]37; AVX1-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>38; AVX1-NEXT: ret <8 x i32> [[TMP3]]39;40; AVX2-LABEL: @add_sub_v8i32(41; AVX2-NEXT: [[TMP1:%.*]] = add <8 x i32> [[A:%.*]], [[B:%.*]]42; AVX2-NEXT: [[TMP2:%.*]] = sub <8 x i32> [[A]], [[B]]43; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>44; AVX2-NEXT: ret <8 x i32> [[TMP3]]45;46; AVX512-LABEL: @add_sub_v8i32(47; AVX512-NEXT: [[TMP1:%.*]] = add <8 x i32> [[A:%.*]], [[B:%.*]]48; AVX512-NEXT: [[TMP2:%.*]] = sub <8 x i32> [[A]], [[B]]49; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>50; AVX512-NEXT: ret <8 x i32> [[TMP3]]51;52 %a0 = extractelement <8 x i32> %a, i32 053 %a1 = extractelement <8 x i32> %a, i32 154 %a2 = extractelement <8 x i32> %a, i32 255 %a3 = extractelement <8 x i32> %a, i32 356 %a4 = extractelement <8 x i32> %a, i32 457 %a5 = extractelement <8 x i32> %a, i32 558 %a6 = extractelement <8 x i32> %a, i32 659 %a7 = extractelement <8 x i32> %a, i32 760 %b0 = extractelement <8 x i32> %b, i32 061 %b1 = extractelement <8 x i32> %b, i32 162 %b2 = extractelement <8 x i32> %b, i32 263 %b3 = extractelement <8 x i32> %b, i32 364 %b4 = extractelement <8 x i32> %b, i32 465 %b5 = extractelement <8 x i32> %b, i32 566 %b6 = extractelement <8 x i32> %b, i32 667 %b7 = extractelement <8 x i32> %b, i32 768 %ab0 = add i32 %a0, %b069 %ab1 = add i32 %a1, %b170 %ab2 = add i32 %a2, %b271 %ab3 = add i32 %a3, %b372 %ab4 = sub i32 %a4, %b473 %ab5 = sub i32 %a5, %b574 %ab6 = sub i32 %a6, %b675 %ab7 = sub i32 %a7, %b776 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 077 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 178 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 279 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 380 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 481 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 582 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 683 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 784 ret <8 x i32> %r785}86 87define <4 x i32> @add_and_v4i32(<4 x i32> %a, <4 x i32> %b) {88; CHECK-LABEL: @add_and_v4i32(89; CHECK-NEXT: [[TMP1:%.*]] = add <4 x i32> [[A:%.*]], [[B:%.*]]90; CHECK-NEXT: [[TMP2:%.*]] = and <4 x i32> [[A]], [[B]]91; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>92; CHECK-NEXT: ret <4 x i32> [[TMP3]]93;94 %a0 = extractelement <4 x i32> %a, i32 095 %a1 = extractelement <4 x i32> %a, i32 196 %a2 = extractelement <4 x i32> %a, i32 297 %a3 = extractelement <4 x i32> %a, i32 398 %b0 = extractelement <4 x i32> %b, i32 099 %b1 = extractelement <4 x i32> %b, i32 1100 %b2 = extractelement <4 x i32> %b, i32 2101 %b3 = extractelement <4 x i32> %b, i32 3102 %ab0 = add i32 %a0, %b0103 %ab1 = add i32 %a1, %b1104 %ab2 = and i32 %a2, %b2105 %ab3 = and i32 %a3, %b3106 %r0 = insertelement <4 x i32> undef, i32 %ab0, i32 0107 %r1 = insertelement <4 x i32> %r0, i32 %ab1, i32 1108 %r2 = insertelement <4 x i32> %r1, i32 %ab2, i32 2109 %r3 = insertelement <4 x i32> %r2, i32 %ab3, i32 3110 ret <4 x i32> %r3111}112 113define <4 x i32> @add_mul_v4i32(<4 x i32> %a, <4 x i32> %b) {114; CHECK-LABEL: @add_mul_v4i32(115; CHECK-NEXT: [[TMP1:%.*]] = mul <4 x i32> [[A:%.*]], [[B:%.*]]116; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[A]], [[B]]117; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> <i32 0, i32 5, i32 6, i32 3>118; CHECK-NEXT: ret <4 x i32> [[TMP3]]119;120 %a0 = extractelement <4 x i32> %a, i32 0121 %a1 = extractelement <4 x i32> %a, i32 1122 %a2 = extractelement <4 x i32> %a, i32 2123 %a3 = extractelement <4 x i32> %a, i32 3124 %b0 = extractelement <4 x i32> %b, i32 0125 %b1 = extractelement <4 x i32> %b, i32 1126 %b2 = extractelement <4 x i32> %b, i32 2127 %b3 = extractelement <4 x i32> %b, i32 3128 %ab0 = mul i32 %a0, %b0129 %ab1 = add i32 %a1, %b1130 %ab2 = add i32 %a2, %b2131 %ab3 = mul i32 %a3, %b3132 %r0 = insertelement <4 x i32> undef, i32 %ab0, i32 0133 %r1 = insertelement <4 x i32> %r0, i32 %ab1, i32 1134 %r2 = insertelement <4 x i32> %r1, i32 %ab2, i32 2135 %r3 = insertelement <4 x i32> %r2, i32 %ab3, i32 3136 ret <4 x i32> %r3137}138 139define <8 x i32> @ashr_shl_v8i32(<8 x i32> %a, <8 x i32> %b) {140; SSE-LABEL: @ashr_shl_v8i32(141; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP2:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>142; SSE-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>143; SSE-NEXT: [[TMP8:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP4]]144; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>145; SSE-NEXT: [[TMP9:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>146; SSE-NEXT: [[TMP6:%.*]] = shl <4 x i32> [[TMP3]], [[TMP9]]147; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>148; SSE-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>149; SSE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>150; SSE-NEXT: ret <8 x i32> [[TMP5]]151;152; SLM-LABEL: @ashr_shl_v8i32(153; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[TMP2:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>154; SLM-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>155; SLM-NEXT: [[TMP8:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP4]]156; SLM-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP2]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>157; SLM-NEXT: [[TMP9:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>158; SLM-NEXT: [[TMP6:%.*]] = shl <4 x i32> [[TMP3]], [[TMP9]]159; SLM-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>160; SLM-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>161; SLM-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP7]], <8 x i32> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>162; SLM-NEXT: ret <8 x i32> [[TMP5]]163;164; AVX1-LABEL: @ashr_shl_v8i32(165; AVX1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], [[B:%.*]]166; AVX1-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], [[B]]167; AVX1-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>168; AVX1-NEXT: ret <8 x i32> [[TMP3]]169;170; AVX2-LABEL: @ashr_shl_v8i32(171; AVX2-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], [[B:%.*]]172; AVX2-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], [[B]]173; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>174; AVX2-NEXT: ret <8 x i32> [[TMP3]]175;176; AVX512-LABEL: @ashr_shl_v8i32(177; AVX512-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], [[B:%.*]]178; AVX512-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], [[B]]179; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>180; AVX512-NEXT: ret <8 x i32> [[TMP3]]181;182 %a0 = extractelement <8 x i32> %a, i32 0183 %a1 = extractelement <8 x i32> %a, i32 1184 %a2 = extractelement <8 x i32> %a, i32 2185 %a3 = extractelement <8 x i32> %a, i32 3186 %a4 = extractelement <8 x i32> %a, i32 4187 %a5 = extractelement <8 x i32> %a, i32 5188 %a6 = extractelement <8 x i32> %a, i32 6189 %a7 = extractelement <8 x i32> %a, i32 7190 %b0 = extractelement <8 x i32> %b, i32 0191 %b1 = extractelement <8 x i32> %b, i32 1192 %b2 = extractelement <8 x i32> %b, i32 2193 %b3 = extractelement <8 x i32> %b, i32 3194 %b4 = extractelement <8 x i32> %b, i32 4195 %b5 = extractelement <8 x i32> %b, i32 5196 %b6 = extractelement <8 x i32> %b, i32 6197 %b7 = extractelement <8 x i32> %b, i32 7198 %ab0 = ashr i32 %a0, %b0199 %ab1 = ashr i32 %a1, %b1200 %ab2 = ashr i32 %a2, %b2201 %ab3 = ashr i32 %a3, %b3202 %ab4 = shl i32 %a4, %b4203 %ab5 = shl i32 %a5, %b5204 %ab6 = shl i32 %a6, %b6205 %ab7 = shl i32 %a7, %b7206 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0207 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1208 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2209 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3210 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4211 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5212 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6213 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7214 ret <8 x i32> %r7215}216 217define <8 x i32> @ashr_shl_v8i32_const(<8 x i32> %a) {218; SSE-LABEL: @ashr_shl_v8i32_const(219; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>220; SSE-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[TMP1]], splat (i32 2)221; SSE-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>222; SSE-NEXT: [[TMP4:%.*]] = shl <4 x i32> [[TMP3]], splat (i32 3)223; SSE-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>224; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>225; SSE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP6]], <8 x i32> [[TMP7]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>226; SSE-NEXT: ret <8 x i32> [[TMP5]]227;228; SLM-LABEL: @ashr_shl_v8i32_const(229; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>230; SLM-NEXT: [[TMP2:%.*]] = ashr <4 x i32> [[TMP1]], splat (i32 2)231; SLM-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>232; SLM-NEXT: [[TMP4:%.*]] = shl <4 x i32> [[TMP3]], splat (i32 3)233; SLM-NEXT: [[TMP6:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>234; SLM-NEXT: [[TMP7:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>235; SLM-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP6]], <8 x i32> [[TMP7]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>236; SLM-NEXT: ret <8 x i32> [[TMP5]]237;238; AVX1-LABEL: @ashr_shl_v8i32_const(239; AVX1-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>240; AVX1-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>241; AVX1-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>242; AVX1-NEXT: ret <8 x i32> [[TMP3]]243;244; AVX2-LABEL: @ashr_shl_v8i32_const(245; AVX2-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>246; AVX2-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>247; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>248; AVX2-NEXT: ret <8 x i32> [[TMP3]]249;250; AVX512-LABEL: @ashr_shl_v8i32_const(251; AVX512-NEXT: [[TMP1:%.*]] = ashr <8 x i32> [[A:%.*]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>252; AVX512-NEXT: [[TMP2:%.*]] = shl <8 x i32> [[A]], <i32 2, i32 2, i32 2, i32 2, i32 3, i32 3, i32 3, i32 3>253; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>254; AVX512-NEXT: ret <8 x i32> [[TMP3]]255;256 %a0 = extractelement <8 x i32> %a, i32 0257 %a1 = extractelement <8 x i32> %a, i32 1258 %a2 = extractelement <8 x i32> %a, i32 2259 %a3 = extractelement <8 x i32> %a, i32 3260 %a4 = extractelement <8 x i32> %a, i32 4261 %a5 = extractelement <8 x i32> %a, i32 5262 %a6 = extractelement <8 x i32> %a, i32 6263 %a7 = extractelement <8 x i32> %a, i32 7264 %ab0 = ashr i32 %a0, 2265 %ab1 = ashr i32 %a1, 2266 %ab2 = ashr i32 %a2, 2267 %ab3 = ashr i32 %a3, 2268 %ab4 = shl i32 %a4, 3269 %ab5 = shl i32 %a5, 3270 %ab6 = shl i32 %a6, 3271 %ab7 = shl i32 %a7, 3272 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0273 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1274 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2275 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3276 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4277 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5278 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6279 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7280 ret <8 x i32> %r7281}282 283define <8 x i32> @ashr_lshr_shl_v8i32(<8 x i32> %a, <8 x i32> %b) {284; SSE-LABEL: @ashr_lshr_shl_v8i32(285; SSE-NEXT: [[A6:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 6286; SSE-NEXT: [[A7:%.*]] = extractelement <8 x i32> [[A]], i32 7287; SSE-NEXT: [[B6:%.*]] = extractelement <8 x i32> [[B:%.*]], i32 6288; SSE-NEXT: [[B7:%.*]] = extractelement <8 x i32> [[B]], i32 7289; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>290; SSE-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>291; SSE-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP2]]292; SSE-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP1]], [[TMP2]]293; SSE-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>294; SSE-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <2 x i32> <i32 4, i32 5>295; SSE-NEXT: [[TMP10:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <2 x i32> <i32 4, i32 5>296; SSE-NEXT: [[TMP7:%.*]] = lshr <2 x i32> [[TMP6]], [[TMP10]]297; SSE-NEXT: [[AB6:%.*]] = shl i32 [[A6]], [[B6]]298; SSE-NEXT: [[AB7:%.*]] = shl i32 [[A7]], [[B7]]299; SSE-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>300; SSE-NEXT: [[TMP9:%.*]] = shufflevector <2 x i32> [[TMP7]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>301; SSE-NEXT: [[R51:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> [[TMP9]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 6, i32 7>302; SSE-NEXT: [[R6:%.*]] = insertelement <8 x i32> [[R51]], i32 [[AB6]], i32 6303; SSE-NEXT: [[R7:%.*]] = insertelement <8 x i32> [[R6]], i32 [[AB7]], i32 7304; SSE-NEXT: ret <8 x i32> [[R7]]305;306; SLM-LABEL: @ashr_lshr_shl_v8i32(307; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>308; SLM-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>309; SLM-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP2]]310; SLM-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP1]], [[TMP2]]311; SLM-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>312; SLM-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>313; SLM-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>314; SLM-NEXT: [[TMP8:%.*]] = lshr <4 x i32> [[TMP6]], [[TMP7]]315; SLM-NEXT: [[TMP9:%.*]] = shl <4 x i32> [[TMP6]], [[TMP7]]316; SLM-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>317; SLM-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>318; SLM-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>319; SLM-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[TMP11]], <8 x i32> [[TMP12]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>320; SLM-NEXT: ret <8 x i32> [[R71]]321;322; AVX1-LABEL: @ashr_lshr_shl_v8i32(323; AVX1-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>324; AVX1-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>325; AVX1-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP2]]326; AVX1-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP1]], [[TMP2]]327; AVX1-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>328; AVX1-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>329; AVX1-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>330; AVX1-NEXT: [[TMP8:%.*]] = lshr <4 x i32> [[TMP6]], [[TMP7]]331; AVX1-NEXT: [[TMP9:%.*]] = shl <4 x i32> [[TMP6]], [[TMP7]]332; AVX1-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>333; AVX1-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>334; AVX1-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>335; AVX1-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[TMP11]], <8 x i32> [[TMP12]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>336; AVX1-NEXT: ret <8 x i32> [[R71]]337;338; AVX2-LABEL: @ashr_lshr_shl_v8i32(339; AVX2-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>340; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>341; AVX2-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP2]]342; AVX2-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP1]], [[TMP2]]343; AVX2-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>344; AVX2-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>345; AVX2-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>346; AVX2-NEXT: [[TMP8:%.*]] = lshr <4 x i32> [[TMP6]], [[TMP7]]347; AVX2-NEXT: [[TMP9:%.*]] = shl <4 x i32> [[TMP6]], [[TMP7]]348; AVX2-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>349; AVX2-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>350; AVX2-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>351; AVX2-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[TMP11]], <8 x i32> [[TMP12]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>352; AVX2-NEXT: ret <8 x i32> [[R71]]353;354; AVX512-LABEL: @ashr_lshr_shl_v8i32(355; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>356; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[B:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>357; AVX512-NEXT: [[TMP3:%.*]] = ashr <4 x i32> [[TMP1]], [[TMP2]]358; AVX512-NEXT: [[TMP4:%.*]] = lshr <4 x i32> [[TMP1]], [[TMP2]]359; AVX512-NEXT: [[TMP5:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>360; AVX512-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>361; AVX512-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[B]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>362; AVX512-NEXT: [[TMP8:%.*]] = lshr <4 x i32> [[TMP6]], [[TMP7]]363; AVX512-NEXT: [[TMP9:%.*]] = shl <4 x i32> [[TMP6]], [[TMP7]]364; AVX512-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 6, i32 7>365; AVX512-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>366; AVX512-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP10]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>367; AVX512-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[TMP11]], <8 x i32> [[TMP12]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>368; AVX512-NEXT: ret <8 x i32> [[R71]]369;370 %a0 = extractelement <8 x i32> %a, i32 0371 %a1 = extractelement <8 x i32> %a, i32 1372 %a2 = extractelement <8 x i32> %a, i32 2373 %a3 = extractelement <8 x i32> %a, i32 3374 %a4 = extractelement <8 x i32> %a, i32 4375 %a5 = extractelement <8 x i32> %a, i32 5376 %a6 = extractelement <8 x i32> %a, i32 6377 %a7 = extractelement <8 x i32> %a, i32 7378 %b0 = extractelement <8 x i32> %b, i32 0379 %b1 = extractelement <8 x i32> %b, i32 1380 %b2 = extractelement <8 x i32> %b, i32 2381 %b3 = extractelement <8 x i32> %b, i32 3382 %b4 = extractelement <8 x i32> %b, i32 4383 %b5 = extractelement <8 x i32> %b, i32 5384 %b6 = extractelement <8 x i32> %b, i32 6385 %b7 = extractelement <8 x i32> %b, i32 7386 %ab0 = ashr i32 %a0, %b0387 %ab1 = ashr i32 %a1, %b1388 %ab2 = lshr i32 %a2, %b2389 %ab3 = lshr i32 %a3, %b3390 %ab4 = lshr i32 %a4, %b4391 %ab5 = lshr i32 %a5, %b5392 %ab6 = shl i32 %a6, %b6393 %ab7 = shl i32 %a7, %b7394 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0395 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1396 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2397 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3398 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4399 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5400 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6401 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7402 ret <8 x i32> %r7403}404 405define <8 x i32> @add_v8i32_undefs(<8 x i32> %a) {406; CHECK-LABEL: @add_v8i32_undefs(407; CHECK-NEXT: [[TMP1:%.*]] = add <8 x i32> [[A:%.*]], <i32 undef, i32 4, i32 8, i32 16, i32 undef, i32 4, i32 8, i32 16>408; CHECK-NEXT: ret <8 x i32> [[TMP1]]409;410 %a0 = extractelement <8 x i32> %a, i32 0411 %a1 = extractelement <8 x i32> %a, i32 1412 %a2 = extractelement <8 x i32> %a, i32 2413 %a3 = extractelement <8 x i32> %a, i32 3414 %a4 = extractelement <8 x i32> %a, i32 4415 %a5 = extractelement <8 x i32> %a, i32 5416 %a6 = extractelement <8 x i32> %a, i32 6417 %a7 = extractelement <8 x i32> %a, i32 7418 %ab0 = add i32 %a0, undef419 %ab1 = add i32 %a1, 4420 %ab2 = add i32 %a2, 8421 %ab3 = add i32 %a3, 16422 %ab4 = add i32 %a4, undef423 %ab5 = add i32 %a5, 4424 %ab6 = add i32 %a6, 8425 %ab7 = add i32 %a7, 16426 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0427 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1428 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2429 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3430 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4431 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5432 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6433 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7434 ret <8 x i32> %r7435}436 437define <8 x i32> @sdiv_v8i32_undefs(<8 x i32> %a) {438; SSE-LABEL: @sdiv_v8i32_undefs(439; SSE-NEXT: [[A0:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 0440; SSE-NEXT: [[A1:%.*]] = extractelement <8 x i32> [[A]], i32 1441; SSE-NEXT: [[A2:%.*]] = extractelement <8 x i32> [[A]], i32 2442; SSE-NEXT: [[A3:%.*]] = extractelement <8 x i32> [[A]], i32 3443; SSE-NEXT: [[A4:%.*]] = extractelement <8 x i32> [[A]], i32 4444; SSE-NEXT: [[A5:%.*]] = extractelement <8 x i32> [[A]], i32 5445; SSE-NEXT: [[A6:%.*]] = extractelement <8 x i32> [[A]], i32 6446; SSE-NEXT: [[A7:%.*]] = extractelement <8 x i32> [[A]], i32 7447; SSE-NEXT: [[AB0:%.*]] = sdiv i32 [[A0]], undef448; SSE-NEXT: [[AB1:%.*]] = sdiv i32 [[A1]], 4449; SSE-NEXT: [[AB2:%.*]] = sdiv i32 [[A2]], 8450; SSE-NEXT: [[AB3:%.*]] = sdiv i32 [[A3]], 16451; SSE-NEXT: [[AB4:%.*]] = sdiv i32 [[A4]], undef452; SSE-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4453; SSE-NEXT: [[AB6:%.*]] = sdiv i32 [[A6]], 8454; SSE-NEXT: [[AB7:%.*]] = sdiv i32 [[A7]], 16455; SSE-NEXT: [[R0:%.*]] = insertelement <8 x i32> undef, i32 [[AB0]], i32 0456; SSE-NEXT: [[R1:%.*]] = insertelement <8 x i32> [[R0]], i32 [[AB1]], i32 1457; SSE-NEXT: [[R2:%.*]] = insertelement <8 x i32> [[R1]], i32 [[AB2]], i32 2458; SSE-NEXT: [[R3:%.*]] = insertelement <8 x i32> [[R2]], i32 [[AB3]], i32 3459; SSE-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[R3]], i32 [[AB4]], i32 4460; SSE-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5461; SSE-NEXT: [[R6:%.*]] = insertelement <8 x i32> [[R5]], i32 [[AB6]], i32 6462; SSE-NEXT: [[R7:%.*]] = insertelement <8 x i32> [[R6]], i32 [[AB7]], i32 7463; SSE-NEXT: ret <8 x i32> [[R7]]464;465; SLM-LABEL: @sdiv_v8i32_undefs(466; SLM-NEXT: [[A0:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 0467; SLM-NEXT: [[A1:%.*]] = extractelement <8 x i32> [[A]], i32 1468; SLM-NEXT: [[A2:%.*]] = extractelement <8 x i32> [[A]], i32 2469; SLM-NEXT: [[A3:%.*]] = extractelement <8 x i32> [[A]], i32 3470; SLM-NEXT: [[A4:%.*]] = extractelement <8 x i32> [[A]], i32 4471; SLM-NEXT: [[A5:%.*]] = extractelement <8 x i32> [[A]], i32 5472; SLM-NEXT: [[A6:%.*]] = extractelement <8 x i32> [[A]], i32 6473; SLM-NEXT: [[A7:%.*]] = extractelement <8 x i32> [[A]], i32 7474; SLM-NEXT: [[AB0:%.*]] = sdiv i32 [[A0]], undef475; SLM-NEXT: [[AB1:%.*]] = sdiv i32 [[A1]], 4476; SLM-NEXT: [[AB2:%.*]] = sdiv i32 [[A2]], 8477; SLM-NEXT: [[AB3:%.*]] = sdiv i32 [[A3]], 16478; SLM-NEXT: [[AB4:%.*]] = sdiv i32 [[A4]], undef479; SLM-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4480; SLM-NEXT: [[AB6:%.*]] = sdiv i32 [[A6]], 8481; SLM-NEXT: [[AB7:%.*]] = sdiv i32 [[A7]], 16482; SLM-NEXT: [[R0:%.*]] = insertelement <8 x i32> undef, i32 [[AB0]], i32 0483; SLM-NEXT: [[R1:%.*]] = insertelement <8 x i32> [[R0]], i32 [[AB1]], i32 1484; SLM-NEXT: [[R2:%.*]] = insertelement <8 x i32> [[R1]], i32 [[AB2]], i32 2485; SLM-NEXT: [[R3:%.*]] = insertelement <8 x i32> [[R2]], i32 [[AB3]], i32 3486; SLM-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[R3]], i32 [[AB4]], i32 4487; SLM-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5488; SLM-NEXT: [[R6:%.*]] = insertelement <8 x i32> [[R5]], i32 [[AB6]], i32 6489; SLM-NEXT: [[R7:%.*]] = insertelement <8 x i32> [[R6]], i32 [[AB7]], i32 7490; SLM-NEXT: ret <8 x i32> [[R7]]491;492; AVX1-LABEL: @sdiv_v8i32_undefs(493; AVX1-NEXT: [[A0:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 0494; AVX1-NEXT: [[A1:%.*]] = extractelement <8 x i32> [[A]], i32 1495; AVX1-NEXT: [[A2:%.*]] = extractelement <8 x i32> [[A]], i32 2496; AVX1-NEXT: [[A3:%.*]] = extractelement <8 x i32> [[A]], i32 3497; AVX1-NEXT: [[A4:%.*]] = extractelement <8 x i32> [[A]], i32 4498; AVX1-NEXT: [[A5:%.*]] = extractelement <8 x i32> [[A]], i32 5499; AVX1-NEXT: [[A6:%.*]] = extractelement <8 x i32> [[A]], i32 6500; AVX1-NEXT: [[A7:%.*]] = extractelement <8 x i32> [[A]], i32 7501; AVX1-NEXT: [[AB0:%.*]] = sdiv i32 [[A0]], undef502; AVX1-NEXT: [[AB1:%.*]] = sdiv i32 [[A1]], 4503; AVX1-NEXT: [[AB2:%.*]] = sdiv i32 [[A2]], 8504; AVX1-NEXT: [[AB3:%.*]] = sdiv i32 [[A3]], 16505; AVX1-NEXT: [[AB4:%.*]] = sdiv i32 [[A4]], undef506; AVX1-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4507; AVX1-NEXT: [[AB6:%.*]] = sdiv i32 [[A6]], 8508; AVX1-NEXT: [[AB7:%.*]] = sdiv i32 [[A7]], 16509; AVX1-NEXT: [[R0:%.*]] = insertelement <8 x i32> undef, i32 [[AB0]], i32 0510; AVX1-NEXT: [[R1:%.*]] = insertelement <8 x i32> [[R0]], i32 [[AB1]], i32 1511; AVX1-NEXT: [[R2:%.*]] = insertelement <8 x i32> [[R1]], i32 [[AB2]], i32 2512; AVX1-NEXT: [[R3:%.*]] = insertelement <8 x i32> [[R2]], i32 [[AB3]], i32 3513; AVX1-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[R3]], i32 [[AB4]], i32 4514; AVX1-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5515; AVX1-NEXT: [[R6:%.*]] = insertelement <8 x i32> [[R5]], i32 [[AB6]], i32 6516; AVX1-NEXT: [[R7:%.*]] = insertelement <8 x i32> [[R6]], i32 [[AB7]], i32 7517; AVX1-NEXT: ret <8 x i32> [[R7]]518;519; AVX2-LABEL: @sdiv_v8i32_undefs(520; AVX2-NEXT: [[A0:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 0521; AVX2-NEXT: [[A1:%.*]] = extractelement <8 x i32> [[A]], i32 1522; AVX2-NEXT: [[A4:%.*]] = extractelement <8 x i32> [[A]], i32 4523; AVX2-NEXT: [[A5:%.*]] = extractelement <8 x i32> [[A]], i32 5524; AVX2-NEXT: [[AB0:%.*]] = sdiv i32 [[A0]], undef525; AVX2-NEXT: [[AB1:%.*]] = sdiv i32 [[A1]], 4526; AVX2-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <2 x i32> <i32 2, i32 3>527; AVX2-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[TMP1]], <i32 8, i32 16>528; AVX2-NEXT: [[AB4:%.*]] = sdiv i32 [[A4]], undef529; AVX2-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4530; AVX2-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <2 x i32> <i32 6, i32 7>531; AVX2-NEXT: [[TMP4:%.*]] = sdiv <2 x i32> [[TMP3]], <i32 8, i32 16>532; AVX2-NEXT: [[R0:%.*]] = insertelement <8 x i32> undef, i32 [[AB0]], i32 0533; AVX2-NEXT: [[R1:%.*]] = insertelement <8 x i32> [[R0]], i32 [[AB1]], i32 1534; AVX2-NEXT: [[TMP5:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>535; AVX2-NEXT: [[R32:%.*]] = shufflevector <8 x i32> [[R1]], <8 x i32> [[TMP5]], <8 x i32> <i32 0, i32 1, i32 8, i32 9, i32 4, i32 5, i32 6, i32 7>536; AVX2-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[R32]], i32 [[AB4]], i32 4537; AVX2-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5538; AVX2-NEXT: [[TMP6:%.*]] = shufflevector <2 x i32> [[TMP4]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>539; AVX2-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[R5]], <8 x i32> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 8, i32 9>540; AVX2-NEXT: ret <8 x i32> [[R71]]541;542; AVX512-LABEL: @sdiv_v8i32_undefs(543; AVX512-NEXT: [[A0:%.*]] = extractelement <8 x i32> [[A:%.*]], i32 0544; AVX512-NEXT: [[A1:%.*]] = extractelement <8 x i32> [[A]], i32 1545; AVX512-NEXT: [[A4:%.*]] = extractelement <8 x i32> [[A]], i32 4546; AVX512-NEXT: [[A5:%.*]] = extractelement <8 x i32> [[A]], i32 5547; AVX512-NEXT: [[AB0:%.*]] = sdiv i32 [[A0]], undef548; AVX512-NEXT: [[AB1:%.*]] = sdiv i32 [[A1]], 4549; AVX512-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <2 x i32> <i32 2, i32 3>550; AVX512-NEXT: [[TMP2:%.*]] = sdiv <2 x i32> [[TMP1]], <i32 8, i32 16>551; AVX512-NEXT: [[AB4:%.*]] = sdiv i32 [[A4]], undef552; AVX512-NEXT: [[AB5:%.*]] = sdiv i32 [[A5]], 4553; AVX512-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <2 x i32> <i32 6, i32 7>554; AVX512-NEXT: [[TMP4:%.*]] = sdiv <2 x i32> [[TMP3]], <i32 8, i32 16>555; AVX512-NEXT: [[R0:%.*]] = insertelement <8 x i32> undef, i32 [[AB0]], i32 0556; AVX512-NEXT: [[R1:%.*]] = insertelement <8 x i32> [[R0]], i32 [[AB1]], i32 1557; AVX512-NEXT: [[TMP5:%.*]] = shufflevector <2 x i32> [[TMP2]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>558; AVX512-NEXT: [[R32:%.*]] = shufflevector <8 x i32> [[R1]], <8 x i32> [[TMP5]], <8 x i32> <i32 0, i32 1, i32 8, i32 9, i32 4, i32 5, i32 6, i32 7>559; AVX512-NEXT: [[R4:%.*]] = insertelement <8 x i32> [[R32]], i32 [[AB4]], i32 4560; AVX512-NEXT: [[R5:%.*]] = insertelement <8 x i32> [[R4]], i32 [[AB5]], i32 5561; AVX512-NEXT: [[TMP6:%.*]] = shufflevector <2 x i32> [[TMP4]], <2 x i32> poison, <8 x i32> <i32 0, i32 1, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison, i32 poison>562; AVX512-NEXT: [[R71:%.*]] = shufflevector <8 x i32> [[R5]], <8 x i32> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 8, i32 9>563; AVX512-NEXT: ret <8 x i32> [[R71]]564;565 %a0 = extractelement <8 x i32> %a, i32 0566 %a1 = extractelement <8 x i32> %a, i32 1567 %a2 = extractelement <8 x i32> %a, i32 2568 %a3 = extractelement <8 x i32> %a, i32 3569 %a4 = extractelement <8 x i32> %a, i32 4570 %a5 = extractelement <8 x i32> %a, i32 5571 %a6 = extractelement <8 x i32> %a, i32 6572 %a7 = extractelement <8 x i32> %a, i32 7573 %ab0 = sdiv i32 %a0, undef574 %ab1 = sdiv i32 %a1, 4575 %ab2 = sdiv i32 %a2, 8576 %ab3 = sdiv i32 %a3, 16577 %ab4 = sdiv i32 %a4, undef578 %ab5 = sdiv i32 %a5, 4579 %ab6 = sdiv i32 %a6, 8580 %ab7 = sdiv i32 %a7, 16581 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0582 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1583 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2584 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3585 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4586 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5587 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6588 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7589 ret <8 x i32> %r7590}591 592define <8 x i32> @add_sub_v8i32_splat(<8 x i32> %a, i32 %b) {593; SSE-LABEL: @add_sub_v8i32_splat(594; SSE-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>595; SSE-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[B:%.*]], i32 0596; SSE-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer597; SSE-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP1]], [[TMP3]]598; SSE-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>599; SSE-NEXT: [[TMP6:%.*]] = sub <4 x i32> [[TMP3]], [[TMP5]]600; SSE-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>601; SSE-NEXT: [[TMP9:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>602; SSE-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> [[TMP9]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>603; SSE-NEXT: ret <8 x i32> [[TMP7]]604;605; SLM-LABEL: @add_sub_v8i32_splat(606; SLM-NEXT: [[TMP1:%.*]] = shufflevector <8 x i32> [[A:%.*]], <8 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>607; SLM-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[B:%.*]], i32 0608; SLM-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer609; SLM-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP1]], [[TMP3]]610; SLM-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[A]], <8 x i32> poison, <4 x i32> <i32 4, i32 5, i32 6, i32 7>611; SLM-NEXT: [[TMP6:%.*]] = sub <4 x i32> [[TMP3]], [[TMP5]]612; SLM-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>613; SLM-NEXT: [[TMP9:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>614; SLM-NEXT: [[TMP7:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> [[TMP9]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 8, i32 9, i32 10, i32 11>615; SLM-NEXT: ret <8 x i32> [[TMP7]]616;617; AVX1-LABEL: @add_sub_v8i32_splat(618; AVX1-NEXT: [[TMP1:%.*]] = insertelement <8 x i32> poison, i32 [[B:%.*]], i32 0619; AVX1-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <8 x i32> zeroinitializer620; AVX1-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP2]], [[A:%.*]]621; AVX1-NEXT: [[TMP4:%.*]] = sub <8 x i32> [[TMP2]], [[A]]622; AVX1-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>623; AVX1-NEXT: ret <8 x i32> [[TMP5]]624;625; AVX2-LABEL: @add_sub_v8i32_splat(626; AVX2-NEXT: [[TMP1:%.*]] = insertelement <8 x i32> poison, i32 [[B:%.*]], i32 0627; AVX2-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <8 x i32> zeroinitializer628; AVX2-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP2]], [[A:%.*]]629; AVX2-NEXT: [[TMP4:%.*]] = sub <8 x i32> [[TMP2]], [[A]]630; AVX2-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>631; AVX2-NEXT: ret <8 x i32> [[TMP5]]632;633; AVX512-LABEL: @add_sub_v8i32_splat(634; AVX512-NEXT: [[TMP1:%.*]] = insertelement <8 x i32> poison, i32 [[B:%.*]], i32 0635; AVX512-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> [[TMP1]], <8 x i32> poison, <8 x i32> zeroinitializer636; AVX512-NEXT: [[TMP3:%.*]] = add <8 x i32> [[TMP2]], [[A:%.*]]637; AVX512-NEXT: [[TMP4:%.*]] = sub <8 x i32> [[TMP2]], [[A]]638; AVX512-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> [[TMP3]], <8 x i32> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>639; AVX512-NEXT: ret <8 x i32> [[TMP5]]640;641 %a0 = extractelement <8 x i32> %a, i32 0642 %a1 = extractelement <8 x i32> %a, i32 1643 %a2 = extractelement <8 x i32> %a, i32 2644 %a3 = extractelement <8 x i32> %a, i32 3645 %a4 = extractelement <8 x i32> %a, i32 4646 %a5 = extractelement <8 x i32> %a, i32 5647 %a6 = extractelement <8 x i32> %a, i32 6648 %a7 = extractelement <8 x i32> %a, i32 7649 %ab0 = add i32 %a0, %b650 %ab1 = add i32 %b, %a1651 %ab2 = add i32 %a2, %b652 %ab3 = add i32 %b, %a3653 %ab4 = sub i32 %b, %a4654 %ab5 = sub i32 %b, %a5655 %ab6 = sub i32 %b, %a6656 %ab7 = sub i32 %b, %a7657 %r0 = insertelement <8 x i32> undef, i32 %ab0, i32 0658 %r1 = insertelement <8 x i32> %r0, i32 %ab1, i32 1659 %r2 = insertelement <8 x i32> %r1, i32 %ab2, i32 2660 %r3 = insertelement <8 x i32> %r2, i32 %ab3, i32 3661 %r4 = insertelement <8 x i32> %r3, i32 %ab4, i32 4662 %r5 = insertelement <8 x i32> %r4, i32 %ab5, i32 5663 %r6 = insertelement <8 x i32> %r5, i32 %ab6, i32 6664 %r7 = insertelement <8 x i32> %r6, i32 %ab7, i32 7665 ret <8 x i32> %r7666}667