xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/SystemZ/vec-elt-insertion.ll (revision 0ad6be1927f89cef09aa5d0fb244873f687997c9)
1*0ad6be19SJonas Paulsson; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2aba39c39SJonas Paulsson; RUN: opt < %s -mtriple=s390x-unknown-linux -mcpu=z16 -S -passes=slp-vectorizer \
3aba39c39SJonas Paulsson; RUN:   -pass-remarks-output=%t | FileCheck %s
4aba39c39SJonas Paulsson; RUN: cat %t | FileCheck -check-prefix=REMARK %s
5aba39c39SJonas Paulsson;
6aba39c39SJonas Paulsson; Test functions that (at least currently) only gets vectorized if the
7aba39c39SJonas Paulsson; insertion cost for an element load is counted as free.
8aba39c39SJonas Paulsson
9*0ad6be19SJonas Paulssondeclare double @llvm.fmuladd.f64(double, double, double)
10*0ad6be19SJonas Paulsson
11aba39c39SJonas Paulsson; This function needs the free element load to be recognized in SLP
12aba39c39SJonas Paulsson; getGatherCost().
13*0ad6be19SJonas Paulssondefine void @fun0(ptr %0, double %1) {
14aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun0(
15*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]], double [[TMP1:%.*]]) #[[ATTR1:[0-9]+]] {
16*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP3:%.*]] = load double, ptr [[TMP0]], align 8
17*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <2 x double> poison, double [[TMP1]], i32 0
18*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <2 x double> [[TMP4]], double [[TMP3]], i32 1
19*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP6:%.*]] = fmul <2 x double> [[TMP5]], splat (double 2.000000e+00)
20*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP7:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP6]], <2 x double> zeroinitializer)
21*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP8:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP6]], <2 x double> [[TMP6]], <2 x double> [[TMP7]])
22*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP9:%.*]] = call <2 x double> @llvm.sqrt.v2f64(<2 x double> [[TMP8]])
23*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP10:%.*]] = extractelement <2 x double> [[TMP9]], i32 0
24*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP11:%.*]] = extractelement <2 x double> [[TMP9]], i32 1
25*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP12:%.*]] = fadd double [[TMP10]], [[TMP11]]
26*0ad6be19SJonas Paulsson; CHECK-NEXT:    store double [[TMP12]], ptr [[TMP0]], align 8
27*0ad6be19SJonas Paulsson; CHECK-NEXT:    ret void
28aba39c39SJonas Paulsson;
29aba39c39SJonas Paulsson; REMARK-LABEL: Function: fun0
30aba39c39SJonas Paulsson; REMARK: Args:
31*0ad6be19SJonas Paulsson; REMARK-NEXT: - String:          'SLP vectorized with cost '
32*0ad6be19SJonas Paulsson; REMARK-NEXT: - Cost:            '-1'
33aba39c39SJonas Paulsson
34aba39c39SJonas Paulsson  %3 = fmul double %1, 2.000000e+00
35aba39c39SJonas Paulsson  %4 = tail call double @llvm.fmuladd.f64(double %3, double %3, double 0.000000e+00)
36aba39c39SJonas Paulsson  %5 = tail call double @llvm.fmuladd.f64(double %3, double %3, double %4)
37aba39c39SJonas Paulsson  %sqrt1 = tail call double @llvm.sqrt.f64(double %5)
38aba39c39SJonas Paulsson  %6 = load double, ptr %0, align 8
39aba39c39SJonas Paulsson  %7 = fmul double %6, 2.000000e+00
40aba39c39SJonas Paulsson  %8 = tail call double @llvm.fmuladd.f64(double %7, double %7, double 0.000000e+00)
41aba39c39SJonas Paulsson  %9 = tail call double @llvm.fmuladd.f64(double %7, double %7, double %8)
42aba39c39SJonas Paulsson  %sqrt = tail call double @llvm.sqrt.f64(double %9)
43aba39c39SJonas Paulsson  %10 = fadd double %sqrt1, %sqrt
44aba39c39SJonas Paulsson  store double %10, ptr %0, align 8
45aba39c39SJonas Paulsson  ret void
46aba39c39SJonas Paulsson}
47aba39c39SJonas Paulsson
48aba39c39SJonas Paulsson; This function needs the element-load to be recognized in SystemZ
49aba39c39SJonas Paulsson; getVectorInstrCost().
50aba39c39SJonas Paulssondefine void @fun1(double %0) {
51aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun1(
52*0ad6be19SJonas Paulsson; CHECK-SAME: double [[TMP0:%.*]]) #[[ATTR1]] {
53*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <2 x double> <double 0.000000e+00, double poison>, double [[TMP0]], i32 1
54*0ad6be19SJonas Paulsson; CHECK-NEXT:    br label %[[BB3:.*]]
55*0ad6be19SJonas Paulsson; CHECK:       [[BB3]]:
56*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP4:%.*]] = phi <2 x double> [ <double poison, double undef>, [[TMP1:%.*]] ], [ poison, %[[BB3]] ]
57*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP5:%.*]] = phi <2 x double> [ zeroinitializer, [[TMP1]] ], [ poison, %[[BB3]] ]
58*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP6:%.*]] = phi <2 x double> [ zeroinitializer, [[TMP1]] ], [ [[TMP18:%.*]], %[[BB3]] ]
59*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP7:%.*]] = fsub <2 x double> zeroinitializer, [[TMP6]]
60*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP8:%.*]] = fsub <2 x double> zeroinitializer, [[TMP5]]
61*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP9:%.*]] = fsub <2 x double> zeroinitializer, [[TMP4]]
62*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP10:%.*]] = load double, ptr null, align 8
63*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP11:%.*]] = fmul <2 x double> [[TMP7]], zeroinitializer
64*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP12:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP8]], <2 x double> [[TMP8]], <2 x double> [[TMP11]])
65*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP13:%.*]] = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> [[TMP9]], <2 x double> [[TMP9]], <2 x double> [[TMP12]])
66*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP14:%.*]] = fcmp olt <2 x double> [[TMP13]], [[TMP2]]
67*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <2 x i1> [[TMP14]], i32 0
68*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP16:%.*]] = extractelement <2 x i1> [[TMP14]], i32 1
69*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP17:%.*]] = or i1 [[TMP15]], [[TMP16]]
70*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP18]] = insertelement <2 x double> poison, double [[TMP10]], i32 1
71*0ad6be19SJonas Paulsson; CHECK-NEXT:    br label %[[BB3]]
72aba39c39SJonas Paulsson;
73aba39c39SJonas Paulsson; REMARK-LABEL: Function: fun1
74aba39c39SJonas Paulsson; REMARK: Args:
75*0ad6be19SJonas Paulsson; REMARK:      - String:          'SLP vectorized with cost '
76*0ad6be19SJonas Paulsson; REMARK-NEXT: - Cost:            '-1'
77aba39c39SJonas Paulsson
78aba39c39SJonas Paulsson  br label %2
79aba39c39SJonas Paulsson
80aba39c39SJonas Paulsson2:
81aba39c39SJonas Paulsson  %3 = phi double [ poison, %1 ], [ poison, %2 ]
82aba39c39SJonas Paulsson  %4 = phi double [ undef, %1 ], [ poison, %2 ]
83aba39c39SJonas Paulsson  %5 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ]
84aba39c39SJonas Paulsson  %6 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ]
85aba39c39SJonas Paulsson  %7 = phi double [ 0.000000e+00, %1 ], [ poison, %2 ]
86aba39c39SJonas Paulsson  %8 = phi double [ 0.000000e+00, %1 ], [ %21, %2 ]
87aba39c39SJonas Paulsson  %9 = fsub double 0.000000e+00, %8
88aba39c39SJonas Paulsson  %10 = fsub double 0.000000e+00, %7
89aba39c39SJonas Paulsson  %11 = fmul double %9, 0.000000e+00
90aba39c39SJonas Paulsson  %12 = fmul double %10, 0.000000e+00
91aba39c39SJonas Paulsson  %13 = fsub double 0.000000e+00, %6
92aba39c39SJonas Paulsson  %14 = fsub double 0.000000e+00, %5
93aba39c39SJonas Paulsson  %15 = tail call double @llvm.fmuladd.f64(double %13, double %13, double %11)
94aba39c39SJonas Paulsson  %16 = tail call double @llvm.fmuladd.f64(double %14, double %14, double %12)
95aba39c39SJonas Paulsson  %17 = fsub double 0.000000e+00, %4
96aba39c39SJonas Paulsson  %18 = fsub double 0.000000e+00, %3
97aba39c39SJonas Paulsson  %19 = tail call double @llvm.fmuladd.f64(double %17, double %17, double %15)
98aba39c39SJonas Paulsson  %20 = tail call double @llvm.fmuladd.f64(double %18, double %18, double %16)
99aba39c39SJonas Paulsson  %21 = load double, ptr null, align 8
100aba39c39SJonas Paulsson  %22 = fcmp olt double %19, %0
101aba39c39SJonas Paulsson  %23 = fcmp olt double %20, 0.000000e+00
102aba39c39SJonas Paulsson  %24 = or i1 %23, %22
103aba39c39SJonas Paulsson  br label %2
104aba39c39SJonas Paulsson}
105aba39c39SJonas Paulsson
106aba39c39SJonas Paulsson; This should *not* be vectorized as the insertion into the vector isn't free,
107aba39c39SJonas Paulsson; which is recognized in SystemZTTImpl::getScalarizationOverhead().
108aba39c39SJonas Paulssondefine void @fun2(ptr %0, ptr %Dst) {
109aba39c39SJonas Paulsson; CHECK-LABEL: define void @fun2(
110*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]], ptr [[DST:%.*]]) #[[ATTR1]] {
111*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP2:%.*]] = load i64, ptr [[TMP0]], align 8
112*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[TMP2]], 0
113*0ad6be19SJonas Paulsson; CHECK-NEXT:    br i1 [[TMP3]], label %[[BB4:.*]], label %[[BB5:.*]]
114*0ad6be19SJonas Paulsson; CHECK:       [[BB4]]:
115*0ad6be19SJonas Paulsson; CHECK-NEXT:    ret void
116*0ad6be19SJonas Paulsson; CHECK:       [[BB5]]:
117*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr i8, ptr [[DST]], i64 24
118*0ad6be19SJonas Paulsson; CHECK-NEXT:    store i64 [[TMP2]], ptr [[TMP6]], align 8
119*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr i8, ptr [[DST]], i64 16
120*0ad6be19SJonas Paulsson; CHECK-NEXT:    store i64 0, ptr [[TMP7]], align 8
121*0ad6be19SJonas Paulsson; CHECK-NEXT:    br label %[[BB4]]
122aba39c39SJonas Paulsson;
123*0ad6be19SJonas Paulsson; REMARK-NOT: Function: fun2
124aba39c39SJonas Paulsson
125aba39c39SJonas Paulsson  %3 = load i64, ptr %0, align 8
126aba39c39SJonas Paulsson  %4 = icmp eq i64 %3, 0
127aba39c39SJonas Paulsson  br i1 %4, label %5, label %6
128aba39c39SJonas Paulsson
129aba39c39SJonas Paulsson5:
130aba39c39SJonas Paulsson  ret void
131aba39c39SJonas Paulsson
132aba39c39SJonas Paulsson6:
133aba39c39SJonas Paulsson  %7 = getelementptr i8, ptr %Dst, i64 24
134aba39c39SJonas Paulsson  store i64 %3, ptr %7, align 8
135aba39c39SJonas Paulsson  %8 = getelementptr i8, ptr %Dst, i64 16
136aba39c39SJonas Paulsson  store i64 0, ptr %8, align 8
137aba39c39SJonas Paulsson  br label %5
138aba39c39SJonas Paulsson}
139*0ad6be19SJonas Paulsson
140*0ad6be19SJonas Paulsson; This should *not* be vectorized as the load is immediately stored, in which
141*0ad6be19SJonas Paulsson; case MVC is preferred.
142*0ad6be19SJonas Paulssondefine void @fun3(ptr %0)  {
143*0ad6be19SJonas Paulsson; CHECK-LABEL: define void @fun3(
144*0ad6be19SJonas Paulsson; CHECK-SAME: ptr [[TMP0:%.*]]) #[[ATTR1]] {
145*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP2:%.*]] = load ptr, ptr inttoptr (i64 568 to ptr), align 8
146*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 40
147*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP4:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP2]], i64 48
148*0ad6be19SJonas Paulsson; CHECK-NEXT:    br label %[[BB5:.*]]
149*0ad6be19SJonas Paulsson; CHECK:       [[BB5]]:
150*0ad6be19SJonas Paulsson; CHECK-NEXT:    store ptr null, ptr [[TMP3]], align 8, !tbaa [[TBAA0:![0-9]+]]
151*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP6:%.*]] = load ptr, ptr inttoptr (i64 64 to ptr), align 8, !tbaa [[TBAA8:![0-9]+]]
152*0ad6be19SJonas Paulsson; CHECK-NEXT:    store ptr [[TMP6]], ptr [[TMP4]], align 8
153*0ad6be19SJonas Paulsson; CHECK-NEXT:    [[TMP7:%.*]] = tail call i64 [[TMP0]](ptr noundef poison, i64 noundef poison)
154*0ad6be19SJonas Paulsson; CHECK-NEXT:    br label %[[BB5]]
155*0ad6be19SJonas Paulsson;
156*0ad6be19SJonas Paulsson  %2 = load ptr, ptr inttoptr (i64 568 to ptr), align 8
157*0ad6be19SJonas Paulsson  %3 = getelementptr inbounds nuw i8, ptr %2, i64 40
158*0ad6be19SJonas Paulsson  %4 = getelementptr inbounds nuw i8, ptr %2, i64 48
159*0ad6be19SJonas Paulsson  br label %5
160*0ad6be19SJonas Paulsson
161*0ad6be19SJonas Paulsson5:
162*0ad6be19SJonas Paulsson  store ptr null, ptr %3, align 8, !tbaa !1
163*0ad6be19SJonas Paulsson  %6 = load ptr, ptr inttoptr (i64 64 to ptr), align 8, !tbaa !9
164*0ad6be19SJonas Paulsson  store ptr %6, ptr %4, align 8
165*0ad6be19SJonas Paulsson  %7 = tail call i64 %0(ptr noundef poison, i64 noundef poison)
166*0ad6be19SJonas Paulsson  br label %5
167*0ad6be19SJonas Paulsson}
168*0ad6be19SJonas Paulsson
169*0ad6be19SJonas Paulsson!1 = !{!2, !7, i64 40}
170*0ad6be19SJonas Paulsson!2 = !{!"arc", !3, i64 0, !6, i64 8, !7, i64 16, !7, i64 24, !8, i64 32, !7, i64 40, !7, i64 48, !6, i64 56, !6, i64 64}
171*0ad6be19SJonas Paulsson!3 = !{!"int", !4, i64 0}
172*0ad6be19SJonas Paulsson!4 = !{!"omnipotent char", !5, i64 0}
173*0ad6be19SJonas Paulsson!5 = !{!"Simple C/C++ TBAA"}
174*0ad6be19SJonas Paulsson!6 = !{!"long", !4, i64 0}
175*0ad6be19SJonas Paulsson!7 = !{!"any pointer", !4, i64 0}
176*0ad6be19SJonas Paulsson!8 = !{!"short", !4, i64 0}
177*0ad6be19SJonas Paulsson!9 = !{!10, !7, i64 64}
178*0ad6be19SJonas Paulsson!10 = !{!"node", !6, i64 0, !3, i64 8, !7, i64 16, !7, i64 24, !7, i64 32, !7, i64 40, !7, i64 48, !7, i64 56, !7, i64 64, !7, i64 72, !6, i64 80, !6, i64 88, !3, i64 96, !3, i64 100}
179*0ad6be19SJonas Paulsson;.
180*0ad6be19SJonas Paulsson; CHECK: [[TBAA0]] = !{[[META1:![0-9]+]], [[META6:![0-9]+]], i64 40}
181*0ad6be19SJonas Paulsson; CHECK: [[META1]] = !{!"arc", [[META2:![0-9]+]], i64 0, [[META5:![0-9]+]], i64 8, [[META6]], i64 16, [[META6]], i64 24, [[META7:![0-9]+]], i64 32, [[META6]], i64 40, [[META6]], i64 48, [[META5]], i64 56, [[META5]], i64 64}
182*0ad6be19SJonas Paulsson; CHECK: [[META2]] = !{!"int", [[META3:![0-9]+]], i64 0}
183*0ad6be19SJonas Paulsson; CHECK: [[META3]] = !{!"omnipotent char", [[META4:![0-9]+]], i64 0}
184*0ad6be19SJonas Paulsson; CHECK: [[META4]] = !{!"Simple C/C++ TBAA"}
185*0ad6be19SJonas Paulsson; CHECK: [[META5]] = !{!"long", [[META3]], i64 0}
186*0ad6be19SJonas Paulsson; CHECK: [[META6]] = !{!"any pointer", [[META3]], i64 0}
187*0ad6be19SJonas Paulsson; CHECK: [[META7]] = !{!"short", [[META3]], i64 0}
188*0ad6be19SJonas Paulsson; CHECK: [[TBAA8]] = !{[[META9:![0-9]+]], [[META6]], i64 64}
189*0ad6be19SJonas Paulsson; CHECK: [[META9]] = !{!"node", [[META5]], i64 0, [[META2]], i64 8, [[META6]], i64 16, [[META6]], i64 24, [[META6]], i64 32, [[META6]], i64 40, [[META6]], i64 48, [[META6]], i64 56, [[META6]], i64 64, [[META6]], i64 72, [[META5]], i64 80, [[META5]], i64 88, [[META2]], i64 96, [[META2]], i64 100}
190*0ad6be19SJonas Paulsson;.
191