Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+ssse3 | FileCheck %s --check-prefix=SSE
      3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1
      4 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2
      5 
      6 ; Verify that we correctly fold horizontal binop even in the presence of UNDEFs.
      7 
      8 define <4 x float> @test1_undef(<4 x float> %a, <4 x float> %b) {
      9 ; SSE-LABEL: test1_undef:
     10 ; SSE:       # BB#0:
     11 ; SSE-NEXT:    haddps %xmm1, %xmm0
     12 ; SSE-NEXT:    retq
     13 ;
     14 ; AVX-LABEL: test1_undef:
     15 ; AVX:       # BB#0:
     16 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
     17 ; AVX-NEXT:    retq
     18   %vecext = extractelement <4 x float> %a, i32 0
     19   %vecext1 = extractelement <4 x float> %a, i32 1
     20   %add = fadd float %vecext, %vecext1
     21   %vecinit = insertelement <4 x float> undef, float %add, i32 0
     22   %vecext2 = extractelement <4 x float> %a, i32 2
     23   %vecext3 = extractelement <4 x float> %a, i32 3
     24   %add4 = fadd float %vecext2, %vecext3
     25   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1
     26   %vecext10 = extractelement <4 x float> %b, i32 2
     27   %vecext11 = extractelement <4 x float> %b, i32 3
     28   %add12 = fadd float %vecext10, %vecext11
     29   %vecinit13 = insertelement <4 x float> %vecinit5, float %add12, i32 3
     30   ret <4 x float> %vecinit13
     31 }
     32 
     33 define <4 x float> @test2_undef(<4 x float> %a, <4 x float> %b) {
     34 ; SSE-LABEL: test2_undef:
     35 ; SSE:       # BB#0:
     36 ; SSE-NEXT:    haddps %xmm1, %xmm0
     37 ; SSE-NEXT:    retq
     38 ;
     39 ; AVX-LABEL: test2_undef:
     40 ; AVX:       # BB#0:
     41 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
     42 ; AVX-NEXT:    retq
     43   %vecext = extractelement <4 x float> %a, i32 0
     44   %vecext1 = extractelement <4 x float> %a, i32 1
     45   %add = fadd float %vecext, %vecext1
     46   %vecinit = insertelement <4 x float> undef, float %add, i32 0
     47   %vecext6 = extractelement <4 x float> %b, i32 0
     48   %vecext7 = extractelement <4 x float> %b, i32 1
     49   %add8 = fadd float %vecext6, %vecext7
     50   %vecinit9 = insertelement <4 x float> %vecinit, float %add8, i32 2
     51   %vecext10 = extractelement <4 x float> %b, i32 2
     52   %vecext11 = extractelement <4 x float> %b, i32 3
     53   %add12 = fadd float %vecext10, %vecext11
     54   %vecinit13 = insertelement <4 x float> %vecinit9, float %add12, i32 3
     55   ret <4 x float> %vecinit13
     56 }
     57 
     58 define <4 x float> @test3_undef(<4 x float> %a, <4 x float> %b) {
     59 ; SSE-LABEL: test3_undef:
     60 ; SSE:       # BB#0:
     61 ; SSE-NEXT:    haddps %xmm1, %xmm0
     62 ; SSE-NEXT:    retq
     63 ;
     64 ; AVX-LABEL: test3_undef:
     65 ; AVX:       # BB#0:
     66 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
     67 ; AVX-NEXT:    retq
     68   %vecext = extractelement <4 x float> %a, i32 0
     69   %vecext1 = extractelement <4 x float> %a, i32 1
     70   %add = fadd float %vecext, %vecext1
     71   %vecinit = insertelement <4 x float> undef, float %add, i32 0
     72   %vecext2 = extractelement <4 x float> %a, i32 2
     73   %vecext3 = extractelement <4 x float> %a, i32 3
     74   %add4 = fadd float %vecext2, %vecext3
     75   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1
     76   %vecext6 = extractelement <4 x float> %b, i32 0
     77   %vecext7 = extractelement <4 x float> %b, i32 1
     78   %add8 = fadd float %vecext6, %vecext7
     79   %vecinit9 = insertelement <4 x float> %vecinit5, float %add8, i32 2
     80   ret <4 x float> %vecinit9
     81 }
     82 
     83 define <4 x float> @test4_undef(<4 x float> %a, <4 x float> %b) {
     84 ; SSE-LABEL: test4_undef:
     85 ; SSE:       # BB#0:
     86 ; SSE-NEXT:    movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
     87 ; SSE-NEXT:    addss %xmm1, %xmm0
     88 ; SSE-NEXT:    retq
     89 ;
     90 ; AVX-LABEL: test4_undef:
     91 ; AVX:       # BB#0:
     92 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
     93 ; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm0
     94 ; AVX-NEXT:    retq
     95   %vecext = extractelement <4 x float> %a, i32 0
     96   %vecext1 = extractelement <4 x float> %a, i32 1
     97   %add = fadd float %vecext, %vecext1
     98   %vecinit = insertelement <4 x float> undef, float %add, i32 0
     99   ret <4 x float> %vecinit
    100 }
    101 
    102 define <2 x double> @test5_undef(<2 x double> %a, <2 x double> %b) {
    103 ; SSE-LABEL: test5_undef:
    104 ; SSE:       # BB#0:
    105 ; SSE-NEXT:    movapd %xmm0, %xmm1
    106 ; SSE-NEXT:    shufpd {{.*#+}} xmm1 = xmm1[1,0]
    107 ; SSE-NEXT:    addsd %xmm0, %xmm1
    108 ; SSE-NEXT:    movapd %xmm1, %xmm0
    109 ; SSE-NEXT:    retq
    110 ;
    111 ; AVX-LABEL: test5_undef:
    112 ; AVX:       # BB#0:
    113 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm1 = xmm0[1,0]
    114 ; AVX-NEXT:    vaddsd %xmm1, %xmm0, %xmm0
    115 ; AVX-NEXT:    retq
    116   %vecext = extractelement <2 x double> %a, i32 0
    117   %vecext1 = extractelement <2 x double> %a, i32 1
    118   %add = fadd double %vecext, %vecext1
    119   %vecinit = insertelement <2 x double> undef, double %add, i32 0
    120   ret <2 x double> %vecinit
    121 }
    122 
    123 define <4 x float> @test6_undef(<4 x float> %a, <4 x float> %b) {
    124 ; SSE-LABEL: test6_undef:
    125 ; SSE:       # BB#0:
    126 ; SSE-NEXT:    haddps %xmm0, %xmm0
    127 ; SSE-NEXT:    retq
    128 ;
    129 ; AVX-LABEL: test6_undef:
    130 ; AVX:       # BB#0:
    131 ; AVX-NEXT:    vhaddps %xmm0, %xmm0, %xmm0
    132 ; AVX-NEXT:    retq
    133   %vecext = extractelement <4 x float> %a, i32 0
    134   %vecext1 = extractelement <4 x float> %a, i32 1
    135   %add = fadd float %vecext, %vecext1
    136   %vecinit = insertelement <4 x float> undef, float %add, i32 0
    137   %vecext2 = extractelement <4 x float> %a, i32 2
    138   %vecext3 = extractelement <4 x float> %a, i32 3
    139   %add4 = fadd float %vecext2, %vecext3
    140   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 1
    141   ret <4 x float> %vecinit5
    142 }
    143 
    144 define <4 x float> @test7_undef(<4 x float> %a, <4 x float> %b) {
    145 ; SSE-LABEL: test7_undef:
    146 ; SSE:       # BB#0:
    147 ; SSE-NEXT:    haddps %xmm1, %xmm0
    148 ; SSE-NEXT:    retq
    149 ;
    150 ; AVX-LABEL: test7_undef:
    151 ; AVX:       # BB#0:
    152 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
    153 ; AVX-NEXT:    retq
    154   %vecext = extractelement <4 x float> %b, i32 0
    155   %vecext1 = extractelement <4 x float> %b, i32 1
    156   %add = fadd float %vecext, %vecext1
    157   %vecinit = insertelement <4 x float> undef, float %add, i32 2
    158   %vecext2 = extractelement <4 x float> %b, i32 2
    159   %vecext3 = extractelement <4 x float> %b, i32 3
    160   %add4 = fadd float %vecext2, %vecext3
    161   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 3
    162   ret <4 x float> %vecinit5
    163 }
    164 
    165 define <4 x float> @test8_undef(<4 x float> %a, <4 x float> %b) {
    166 ; SSE-LABEL: test8_undef:
    167 ; SSE:       # BB#0:
    168 ; SSE-NEXT:    movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
    169 ; SSE-NEXT:    addss %xmm0, %xmm1
    170 ; SSE-NEXT:    movaps %xmm0, %xmm2
    171 ; SSE-NEXT:    shufpd {{.*#+}} xmm2 = xmm2[1,0]
    172 ; SSE-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,1,2,3]
    173 ; SSE-NEXT:    addss %xmm2, %xmm0
    174 ; SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
    175 ; SSE-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1,1,3]
    176 ; SSE-NEXT:    movaps %xmm1, %xmm0
    177 ; SSE-NEXT:    retq
    178 ;
    179 ; AVX-LABEL: test8_undef:
    180 ; AVX:       # BB#0:
    181 ; AVX-NEXT:    vmovshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
    182 ; AVX-NEXT:    vaddss %xmm1, %xmm0, %xmm1
    183 ; AVX-NEXT:    vpermilpd {{.*#+}} xmm2 = xmm0[1,0]
    184 ; AVX-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,1,2,3]
    185 ; AVX-NEXT:    vaddss %xmm0, %xmm2, %xmm0
    186 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]
    187 ; AVX-NEXT:    retq
    188   %vecext = extractelement <4 x float> %a, i32 0
    189   %vecext1 = extractelement <4 x float> %a, i32 1
    190   %add = fadd float %vecext, %vecext1
    191   %vecinit = insertelement <4 x float> undef, float %add, i32 0
    192   %vecext2 = extractelement <4 x float> %a, i32 2
    193   %vecext3 = extractelement <4 x float> %a, i32 3
    194   %add4 = fadd float %vecext2, %vecext3
    195   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 2
    196   ret <4 x float> %vecinit5
    197 }
    198 
    199 define <4 x float> @test9_undef(<4 x float> %a, <4 x float> %b) {
    200 ; SSE-LABEL: test9_undef:
    201 ; SSE:       # BB#0:
    202 ; SSE-NEXT:    haddps %xmm1, %xmm0
    203 ; SSE-NEXT:    retq
    204 ;
    205 ; AVX-LABEL: test9_undef:
    206 ; AVX:       # BB#0:
    207 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
    208 ; AVX-NEXT:    retq
    209   %vecext = extractelement <4 x float> %a, i32 0
    210   %vecext1 = extractelement <4 x float> %a, i32 1
    211   %add = fadd float %vecext, %vecext1
    212   %vecinit = insertelement <4 x float> undef, float %add, i32 0
    213   %vecext2 = extractelement <4 x float> %b, i32 2
    214   %vecext3 = extractelement <4 x float> %b, i32 3
    215   %add4 = fadd float %vecext2, %vecext3
    216   %vecinit5 = insertelement <4 x float> %vecinit, float %add4, i32 3
    217   ret <4 x float> %vecinit5
    218 }
    219 
    220 define <8 x float> @test10_undef(<8 x float> %a, <8 x float> %b) {
    221 ; SSE-LABEL: test10_undef:
    222 ; SSE:       # BB#0:
    223 ; SSE-NEXT:    haddps %xmm2, %xmm0
    224 ; SSE-NEXT:    retq
    225 ;
    226 ; AVX-LABEL: test10_undef:
    227 ; AVX:       # BB#0:
    228 ; AVX-NEXT:    vhaddps %ymm1, %ymm0, %ymm0
    229 ; AVX-NEXT:    retq
    230   %vecext = extractelement <8 x float> %a, i32 0
    231   %vecext1 = extractelement <8 x float> %a, i32 1
    232   %add = fadd float %vecext, %vecext1
    233   %vecinit = insertelement <8 x float> undef, float %add, i32 0
    234   %vecext2 = extractelement <8 x float> %b, i32 2
    235   %vecext3 = extractelement <8 x float> %b, i32 3
    236   %add4 = fadd float %vecext2, %vecext3
    237   %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 3
    238   ret <8 x float> %vecinit5
    239 }
    240 
    241 define <8 x float> @test11_undef(<8 x float> %a, <8 x float> %b) {
    242 ; SSE-LABEL: test11_undef:
    243 ; SSE:       # BB#0:
    244 ; SSE-NEXT:    movshdup {{.*#+}} xmm1 = xmm0[1,1,3,3]
    245 ; SSE-NEXT:    addss %xmm1, %xmm0
    246 ; SSE-NEXT:    movshdup {{.*#+}} xmm1 = xmm3[1,1,3,3]
    247 ; SSE-NEXT:    addss %xmm3, %xmm1
    248 ; SSE-NEXT:    movddup {{.*#+}} xmm1 = xmm1[0,0]
    249 ; SSE-NEXT:    retq
    250 ;
    251 ; AVX-LABEL: test11_undef:
    252 ; AVX:       # BB#0:
    253 ; AVX-NEXT:    vhaddps %ymm0, %ymm0, %ymm0
    254 ; AVX-NEXT:    retq
    255   %vecext = extractelement <8 x float> %a, i32 0
    256   %vecext1 = extractelement <8 x float> %a, i32 1
    257   %add = fadd float %vecext, %vecext1
    258   %vecinit = insertelement <8 x float> undef, float %add, i32 0
    259   %vecext2 = extractelement <8 x float> %b, i32 4
    260   %vecext3 = extractelement <8 x float> %b, i32 5
    261   %add4 = fadd float %vecext2, %vecext3
    262   %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 6
    263   ret <8 x float> %vecinit5
    264 }
    265 
    266 define <8 x float> @test12_undef(<8 x float> %a, <8 x float> %b) {
    267 ; SSE-LABEL: test12_undef:
    268 ; SSE:       # BB#0:
    269 ; SSE-NEXT:    haddps %xmm0, %xmm0
    270 ; SSE-NEXT:    retq
    271 ;
    272 ; AVX-LABEL: test12_undef:
    273 ; AVX:       # BB#0:
    274 ; AVX-NEXT:    vhaddps %ymm0, %ymm0, %ymm0
    275 ; AVX-NEXT:    retq
    276   %vecext = extractelement <8 x float> %a, i32 0
    277   %vecext1 = extractelement <8 x float> %a, i32 1
    278   %add = fadd float %vecext, %vecext1
    279   %vecinit = insertelement <8 x float> undef, float %add, i32 0
    280   %vecext2 = extractelement <8 x float> %a, i32 2
    281   %vecext3 = extractelement <8 x float> %a, i32 3
    282   %add4 = fadd float %vecext2, %vecext3
    283   %vecinit5 = insertelement <8 x float> %vecinit, float %add4, i32 1
    284   ret <8 x float> %vecinit5
    285 }
    286 
    287 define <8 x float> @test13_undef(<8 x float> %a, <8 x float> %b) {
    288 ; SSE-LABEL: test13_undef:
    289 ; SSE:       # BB#0:
    290 ; SSE-NEXT:    haddps %xmm1, %xmm0
    291 ; SSE-NEXT:    retq
    292 ;
    293 ; AVX-LABEL: test13_undef:
    294 ; AVX:       # BB#0:
    295 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
    296 ; AVX-NEXT:    vhaddps %xmm1, %xmm0, %xmm0
    297 ; AVX-NEXT:    retq
    298   %vecext = extractelement <8 x float> %a, i32 0
    299   %vecext1 = extractelement <8 x float> %a, i32 1
    300   %add1 = fadd float %vecext, %vecext1
    301   %vecinit1 = insertelement <8 x float> undef, float %add1, i32 0
    302   %vecext2 = extractelement <8 x float> %a, i32 2
    303   %vecext3 = extractelement <8 x float> %a, i32 3
    304   %add2 = fadd float %vecext2, %vecext3
    305   %vecinit2 = insertelement <8 x float> %vecinit1, float %add2, i32 1
    306   %vecext4 = extractelement <8 x float> %a, i32 4
    307   %vecext5 = extractelement <8 x float> %a, i32 5
    308   %add3 = fadd float %vecext4, %vecext5
    309   %vecinit3 = insertelement <8 x float> %vecinit2, float %add3, i32 2
    310   %vecext6 = extractelement <8 x float> %a, i32 6
    311   %vecext7 = extractelement <8 x float> %a, i32 7
    312   %add4 = fadd float %vecext6, %vecext7
    313   %vecinit4 = insertelement <8 x float> %vecinit3, float %add4, i32 3
    314   ret <8 x float> %vecinit4
    315 }
    316 
    317 define <8 x i32> @test14_undef(<8 x i32> %a, <8 x i32> %b) {
    318 ; SSE-LABEL: test14_undef:
    319 ; SSE:       # BB#0:
    320 ; SSE-NEXT:    phaddd %xmm2, %xmm0
    321 ; SSE-NEXT:    retq
    322 ;
    323 ; AVX1-LABEL: test14_undef:
    324 ; AVX1:       # BB#0:
    325 ; AVX1-NEXT:    vphaddd %xmm1, %xmm0, %xmm0
    326 ; AVX1-NEXT:    retq
    327 ;
    328 ; AVX2-LABEL: test14_undef:
    329 ; AVX2:       # BB#0:
    330 ; AVX2-NEXT:    vphaddd %ymm1, %ymm0, %ymm0
    331 ; AVX2-NEXT:    retq
    332   %vecext = extractelement <8 x i32> %a, i32 0
    333   %vecext1 = extractelement <8 x i32> %a, i32 1
    334   %add = add i32 %vecext, %vecext1
    335   %vecinit = insertelement <8 x i32> undef, i32 %add, i32 0
    336   %vecext2 = extractelement <8 x i32> %b, i32 2
    337   %vecext3 = extractelement <8 x i32> %b, i32 3
    338   %add4 = add i32 %vecext2, %vecext3
    339   %vecinit5 = insertelement <8 x i32> %vecinit, i32 %add4, i32 3
    340   ret <8 x i32> %vecinit5
    341 }
    342 
    343 ; On AVX2, the following sequence can be folded into a single horizontal add.
    344 ; If the Subtarget doesn't support AVX2, then we avoid emitting two packed
    345 ; integer horizontal adds instead of two scalar adds followed by vector inserts.
    346 define <8 x i32> @test15_undef(<8 x i32> %a, <8 x i32> %b) {
    347 ; SSE-LABEL: test15_undef:
    348 ; SSE:       # BB#0:
    349 ; SSE-NEXT:    movd %xmm0, %eax
    350 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3]
    351 ; SSE-NEXT:    movd %xmm0, %ecx
    352 ; SSE-NEXT:    addl %eax, %ecx
    353 ; SSE-NEXT:    movd %xmm3, %eax
    354 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
    355 ; SSE-NEXT:    movd %xmm0, %edx
    356 ; SSE-NEXT:    addl %eax, %edx
    357 ; SSE-NEXT:    movd %ecx, %xmm0
    358 ; SSE-NEXT:    movd %edx, %xmm1
    359 ; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
    360 ; SSE-NEXT:    retq
    361 ;
    362 ; AVX1-LABEL: test15_undef:
    363 ; AVX1:       # BB#0:
    364 ; AVX1-NEXT:    vmovd %xmm0, %eax
    365 ; AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
    366 ; AVX1-NEXT:    addl %eax, %ecx
    367 ; AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
    368 ; AVX1-NEXT:    vmovd %xmm0, %eax
    369 ; AVX1-NEXT:    vpextrd $1, %xmm0, %edx
    370 ; AVX1-NEXT:    addl %eax, %edx
    371 ; AVX1-NEXT:    vmovd %ecx, %xmm0
    372 ; AVX1-NEXT:    vmovd %edx, %xmm1
    373 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm1[0,1,0,1]
    374 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
    375 ; AVX1-NEXT:    retq
    376 ;
    377 ; AVX2-LABEL: test15_undef:
    378 ; AVX2:       # BB#0:
    379 ; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    380 ; AVX2-NEXT:    retq
    381   %vecext = extractelement <8 x i32> %a, i32 0
    382   %vecext1 = extractelement <8 x i32> %a, i32 1
    383   %add = add i32 %vecext, %vecext1
    384   %vecinit = insertelement <8 x i32> undef, i32 %add, i32 0
    385   %vecext2 = extractelement <8 x i32> %b, i32 4
    386   %vecext3 = extractelement <8 x i32> %b, i32 5
    387   %add4 = add i32 %vecext2, %vecext3
    388   %vecinit5 = insertelement <8 x i32> %vecinit, i32 %add4, i32 6
    389   ret <8 x i32> %vecinit5
    390 }
    391 
    392 define <8 x i32> @test16_undef(<8 x i32> %a, <8 x i32> %b) {
    393 ; SSE-LABEL: test16_undef:
    394 ; SSE:       # BB#0:
    395 ; SSE-NEXT:    phaddd %xmm0, %xmm0
    396 ; SSE-NEXT:    retq
    397 ;
    398 ; AVX1-LABEL: test16_undef:
    399 ; AVX1:       # BB#0:
    400 ; AVX1-NEXT:    vphaddd %xmm0, %xmm0, %xmm0
    401 ; AVX1-NEXT:    retq
    402 ;
    403 ; AVX2-LABEL: test16_undef:
    404 ; AVX2:       # BB#0:
    405 ; AVX2-NEXT:    vphaddd %ymm0, %ymm0, %ymm0
    406 ; AVX2-NEXT:    retq
    407   %vecext = extractelement <8 x i32> %a, i32 0
    408   %vecext1 = extractelement <8 x i32> %a, i32 1
    409   %add = add i32 %vecext, %vecext1
    410   %vecinit = insertelement <8 x i32> undef, i32 %add, i32 0
    411   %vecext2 = extractelement <8 x i32> %a, i32 2
    412   %vecext3 = extractelement <8 x i32> %a, i32 3
    413   %add4 = add i32 %vecext2, %vecext3
    414   %vecinit5 = insertelement <8 x i32> %vecinit, i32 %add4, i32 1
    415   ret <8 x i32> %vecinit5
    416 }
    417 
    418 define <8 x i32> @test17_undef(<8 x i32> %a, <8 x i32> %b) {
    419 ; SSE-LABEL: test17_undef:
    420 ; SSE:       # BB#0:
    421 ; SSE-NEXT:    phaddd %xmm1, %xmm0
    422 ; SSE-NEXT:    retq
    423 ;
    424 ; AVX1-LABEL: test17_undef:
    425 ; AVX1:       # BB#0:
    426 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
    427 ; AVX1-NEXT:    vphaddd %xmm1, %xmm0, %xmm0
    428 ; AVX1-NEXT:    retq
    429 ;
    430 ; AVX2-LABEL: test17_undef:
    431 ; AVX2:       # BB#0:
    432 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
    433 ; AVX2-NEXT:    vphaddd %xmm1, %xmm0, %xmm0
    434 ; AVX2-NEXT:    retq
    435   %vecext = extractelement <8 x i32> %a, i32 0
    436   %vecext1 = extractelement <8 x i32> %a, i32 1
    437   %add1 = add i32 %vecext, %vecext1
    438   %vecinit1 = insertelement <8 x i32> undef, i32 %add1, i32 0
    439   %vecext2 = extractelement <8 x i32> %a, i32 2
    440   %vecext3 = extractelement <8 x i32> %a, i32 3
    441   %add2 = add i32 %vecext2, %vecext3
    442   %vecinit2 = insertelement <8 x i32> %vecinit1, i32 %add2, i32 1
    443   %vecext4 = extractelement <8 x i32> %a, i32 4
    444   %vecext5 = extractelement <8 x i32> %a, i32 5
    445   %add3 = add i32 %vecext4, %vecext5
    446   %vecinit3 = insertelement <8 x i32> %vecinit2, i32 %add3, i32 2
    447   %vecext6 = extractelement <8 x i32> %a, i32 6
    448   %vecext7 = extractelement <8 x i32> %a, i32 7
    449   %add4 = add i32 %vecext6, %vecext7
    450   %vecinit4 = insertelement <8 x i32> %vecinit3, i32 %add4, i32 3
    451   ret <8 x i32> %vecinit4
    452 }
    453