1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -basicaa -slp-vectorizer -mcpu=btver2 -S | FileCheck %s --check-prefix=VECT
3 ; RUN: opt < %s -basicaa -slp-vectorizer -mcpu=btver2 -slp-min-reg-size=128 -S | FileCheck %s --check-prefix=NOVECT
5 ; Check SLPVectorizer works for packed horizontal 128-bit instrs.
8 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
9 target triple = "x86_64-unknown-linux-gnu"
11 define void @add_pairs_128(<4 x float>, float* nocapture) #0 {
12 ; VECT-LABEL: @add_pairs_128(
13 ; VECT-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP0:%.*]], i32 0
14 ; VECT-NEXT: [[TMP4:%.*]] = extractelement <4 x float> [[TMP0]], i32 1
15 ; VECT-NEXT: [[TMP5:%.*]] = extractelement <4 x float> [[TMP0]], i32 2
16 ; VECT-NEXT: [[TMP6:%.*]] = extractelement <4 x float> [[TMP0]], i32 3
17 ; VECT-NEXT: [[TMP7:%.*]] = insertelement <2 x float> undef, float [[TMP3]], i32 0
18 ; VECT-NEXT: [[TMP8:%.*]] = insertelement <2 x float> [[TMP7]], float [[TMP5]], i32 1
19 ; VECT-NEXT: [[TMP9:%.*]] = insertelement <2 x float> undef, float [[TMP4]], i32 0
20 ; VECT-NEXT: [[TMP10:%.*]] = insertelement <2 x float> [[TMP9]], float [[TMP6]], i32 1
21 ; VECT-NEXT: [[TMP11:%.*]] = fadd <2 x float> [[TMP8]], [[TMP10]]
22 ; VECT-NEXT: [[TMP12:%.*]] = getelementptr inbounds float, float* [[TMP1:%.*]], i64 1
23 ; VECT-NEXT: [[TMP13:%.*]] = bitcast float* [[TMP1]] to <2 x float>*
24 ; VECT-NEXT: store <2 x float> [[TMP11]], <2 x float>* [[TMP13]], align 4
27 ; NOVECT-LABEL: @add_pairs_128(
28 ; NOVECT-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[TMP0:%.*]], i32 0
29 ; NOVECT-NEXT: [[TMP4:%.*]] = extractelement <4 x float> [[TMP0]], i32 1
30 ; NOVECT-NEXT: [[TMP5:%.*]] = fadd float [[TMP3]], [[TMP4]]
31 ; NOVECT-NEXT: store float [[TMP5]], float* [[TMP1:%.*]], align 4
32 ; NOVECT-NEXT: [[TMP6:%.*]] = extractelement <4 x float> [[TMP0]], i32 2
33 ; NOVECT-NEXT: [[TMP7:%.*]] = extractelement <4 x float> [[TMP0]], i32 3
34 ; NOVECT-NEXT: [[TMP8:%.*]] = fadd float [[TMP6]], [[TMP7]]
35 ; NOVECT-NEXT: [[TMP9:%.*]] = getelementptr inbounds float, float* [[TMP1]], i64 1
36 ; NOVECT-NEXT: store float [[TMP8]], float* [[TMP9]], align 4
37 ; NOVECT-NEXT: ret void
39 %3 = extractelement <4 x float> %0, i32 0
40 %4 = extractelement <4 x float> %0, i32 1
41 %5 = fadd float %3, %4
42 store float %5, float* %1, align 4
43 %6 = extractelement <4 x float> %0, i32 2
44 %7 = extractelement <4 x float> %0, i32 3
45 %8 = fadd float %6, %7
46 %9 = getelementptr inbounds float, float* %1, i64 1
47 store float %8, float* %9, align 4
51 attributes #0 = { nounwind }