xref: /llvm-project/llvm/test/Transforms/SLPVectorizer/SystemZ/reductions-fmin-fmax.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1866b9f43SDominik Steenken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2866b9f43SDominik Steenken; RUN: opt -mtriple=s390x-unknown-linux -mcpu=z15 -passes=slp-vectorizer %s -S -o - \
3866b9f43SDominik Steenken; RUN:   | FileCheck %s
4866b9f43SDominik Steenken
5866b9f43SDominik Steenken; Test vectorization and reassociation of fmin/fmax operations. Vectorization
6866b9f43SDominik Steenken; is more profitable if the loads are also vectorizable.
7866b9f43SDominik Steenken
8866b9f43SDominik Steenkendefine double @fmin_double_4_nums_seq(ptr nocapture noundef readonly %x) {
9866b9f43SDominik Steenken; CHECK-LABEL: define double @fmin_double_4_nums_seq(
10*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0:[0-9]+]] {
11866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 4
12866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmin.v4f64(<4 x double> [[TMP1]])
13866b9f43SDominik Steenken; CHECK-NEXT:    ret double [[TMP2]]
14866b9f43SDominik Steenken;
15866b9f43SDominik Steenken  %g1 = getelementptr inbounds double, ptr %x, i64 1
16866b9f43SDominik Steenken  %g2 = getelementptr inbounds double, ptr %x, i64 2
17866b9f43SDominik Steenken  %g3 = getelementptr inbounds double, ptr %x, i64 3
18866b9f43SDominik Steenken  %t0 = load double, ptr %x, align 4
19866b9f43SDominik Steenken  %t1 = load double, ptr %g1, align 4
20866b9f43SDominik Steenken  %t2 = load double, ptr %g2, align 4
21866b9f43SDominik Steenken  %t3 = load double, ptr %g3, align 4
22866b9f43SDominik Steenken  %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0)
23866b9f43SDominik Steenken  %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1)
24866b9f43SDominik Steenken  %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2)
25866b9f43SDominik Steenken  ret double %m3
26866b9f43SDominik Steenken}
27866b9f43SDominik Steenken
28866b9f43SDominik Steenkendefine double @fmin_double_16_nums_nonseq(ptr nocapture noundef readonly %x) {
29866b9f43SDominik Steenken; CHECK-LABEL: define double @fmin_double_16_nums_nonseq(
30*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {
31866b9f43SDominik Steenken; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2
32866b9f43SDominik Steenken; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4
33866b9f43SDominik Steenken; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6
34866b9f43SDominik Steenken; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 8
35866b9f43SDominik Steenken; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 10
36866b9f43SDominik Steenken; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 12
37866b9f43SDominik Steenken; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 14
38866b9f43SDominik Steenken; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 16
39866b9f43SDominik Steenken; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 18
40866b9f43SDominik Steenken; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 20
41866b9f43SDominik Steenken; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 22
42866b9f43SDominik Steenken; CHECK-NEXT:    [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 24
43866b9f43SDominik Steenken; CHECK-NEXT:    [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 26
44866b9f43SDominik Steenken; CHECK-NEXT:    [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 28
45866b9f43SDominik Steenken; CHECK-NEXT:    [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 30
46866b9f43SDominik Steenken; CHECK-NEXT:    [[T0:%.*]] = load double, ptr [[X]], align 4
47866b9f43SDominik Steenken; CHECK-NEXT:    [[T1:%.*]] = load double, ptr [[G1]], align 4
48866b9f43SDominik Steenken; CHECK-NEXT:    [[T2:%.*]] = load double, ptr [[G2]], align 4
49866b9f43SDominik Steenken; CHECK-NEXT:    [[T3:%.*]] = load double, ptr [[G3]], align 4
50866b9f43SDominik Steenken; CHECK-NEXT:    [[T4:%.*]] = load double, ptr [[G4]], align 4
51866b9f43SDominik Steenken; CHECK-NEXT:    [[T5:%.*]] = load double, ptr [[G5]], align 4
52866b9f43SDominik Steenken; CHECK-NEXT:    [[T6:%.*]] = load double, ptr [[G6]], align 4
53866b9f43SDominik Steenken; CHECK-NEXT:    [[T7:%.*]] = load double, ptr [[G7]], align 4
54866b9f43SDominik Steenken; CHECK-NEXT:    [[T8:%.*]] = load double, ptr [[G8]], align 4
55866b9f43SDominik Steenken; CHECK-NEXT:    [[T9:%.*]] = load double, ptr [[G9]], align 4
56866b9f43SDominik Steenken; CHECK-NEXT:    [[T10:%.*]] = load double, ptr [[G10]], align 4
57866b9f43SDominik Steenken; CHECK-NEXT:    [[T11:%.*]] = load double, ptr [[G11]], align 4
58866b9f43SDominik Steenken; CHECK-NEXT:    [[T12:%.*]] = load double, ptr [[G12]], align 4
59866b9f43SDominik Steenken; CHECK-NEXT:    [[T13:%.*]] = load double, ptr [[G13]], align 4
60866b9f43SDominik Steenken; CHECK-NEXT:    [[T14:%.*]] = load double, ptr [[G14]], align 4
61866b9f43SDominik Steenken; CHECK-NEXT:    [[T15:%.*]] = load double, ptr [[G15]], align 4
62866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 0
63866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 1
64866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 2
65866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 3
66866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 4
67866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 5
68866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 6
69866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 7
70866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 8
71866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 9
72866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 10
73866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 11
74866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 12
75866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 13
76866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 14
77866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 15
78866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmin.v16f64(<16 x double> [[TMP16]])
79866b9f43SDominik Steenken; CHECK-NEXT:    ret double [[TMP17]]
80866b9f43SDominik Steenken;
81866b9f43SDominik Steenken  %g1 = getelementptr inbounds double, ptr %x, i64 2
82866b9f43SDominik Steenken  %g2 = getelementptr inbounds double, ptr %x, i64 4
83866b9f43SDominik Steenken  %g3 = getelementptr inbounds double, ptr %x, i64 6
84866b9f43SDominik Steenken  %g4 = getelementptr inbounds double, ptr %x, i64 8
85866b9f43SDominik Steenken  %g5 = getelementptr inbounds double, ptr %x, i64 10
86866b9f43SDominik Steenken  %g6 = getelementptr inbounds double, ptr %x, i64 12
87866b9f43SDominik Steenken  %g7 = getelementptr inbounds double, ptr %x, i64 14
88866b9f43SDominik Steenken  %g8 = getelementptr inbounds double, ptr %x, i64 16
89866b9f43SDominik Steenken  %g9 = getelementptr inbounds double, ptr %x, i64 18
90866b9f43SDominik Steenken  %g10 = getelementptr inbounds double, ptr %x, i64 20
91866b9f43SDominik Steenken  %g11 = getelementptr inbounds double, ptr %x, i64 22
92866b9f43SDominik Steenken  %g12 = getelementptr inbounds double, ptr %x, i64 24
93866b9f43SDominik Steenken  %g13 = getelementptr inbounds double, ptr %x, i64 26
94866b9f43SDominik Steenken  %g14 = getelementptr inbounds double, ptr %x, i64 28
95866b9f43SDominik Steenken  %g15 = getelementptr inbounds double, ptr %x, i64 30
96866b9f43SDominik Steenken  %t0 = load double, ptr %x, align 4
97866b9f43SDominik Steenken  %t1 = load double, ptr %g1, align 4
98866b9f43SDominik Steenken  %t2 = load double, ptr %g2, align 4
99866b9f43SDominik Steenken  %t3 = load double, ptr %g3, align 4
100866b9f43SDominik Steenken  %t4 = load double, ptr %g4, align 4
101866b9f43SDominik Steenken  %t5 = load double, ptr %g5, align 4
102866b9f43SDominik Steenken  %t6 = load double, ptr %g6, align 4
103866b9f43SDominik Steenken  %t7 = load double, ptr %g7, align 4
104866b9f43SDominik Steenken  %t8 = load double, ptr %g8, align 4
105866b9f43SDominik Steenken  %t9 = load double, ptr %g9, align 4
106866b9f43SDominik Steenken  %t10 = load double, ptr %g10, align 4
107866b9f43SDominik Steenken  %t11 = load double, ptr %g11, align 4
108866b9f43SDominik Steenken  %t12 = load double, ptr %g12, align 4
109866b9f43SDominik Steenken  %t13 = load double, ptr %g13, align 4
110866b9f43SDominik Steenken  %t14 = load double, ptr %g14, align 4
111866b9f43SDominik Steenken  %t15 = load double, ptr %g15, align 4
112866b9f43SDominik Steenken  %m1 = tail call fast double @llvm.minnum.f64(double %t1, double %t0)
113866b9f43SDominik Steenken  %m2 = tail call fast double @llvm.minnum.f64(double %t2, double %m1)
114866b9f43SDominik Steenken  %m3 = tail call fast double @llvm.minnum.f64(double %t3, double %m2)
115866b9f43SDominik Steenken  %m4 = tail call fast double @llvm.minnum.f64(double %t4, double %m3)
116866b9f43SDominik Steenken  %m5 = tail call fast double @llvm.minnum.f64(double %t5, double %m4)
117866b9f43SDominik Steenken  %m6 = tail call fast double @llvm.minnum.f64(double %t6, double %m5)
118866b9f43SDominik Steenken  %m7 = tail call fast double @llvm.minnum.f64(double %t7, double %m6)
119866b9f43SDominik Steenken  %m8 = tail call fast double @llvm.minnum.f64(double %t8, double %m7)
120866b9f43SDominik Steenken  %m9 = tail call fast double @llvm.minnum.f64(double %t9, double %m8)
121866b9f43SDominik Steenken  %m10 = tail call fast double @llvm.minnum.f64(double %t10, double %m9)
122866b9f43SDominik Steenken  %m11 = tail call fast double @llvm.minnum.f64(double %t11, double %m10)
123866b9f43SDominik Steenken  %m12 = tail call fast double @llvm.minnum.f64(double %t12, double %m11)
124866b9f43SDominik Steenken  %m13 = tail call fast double @llvm.minnum.f64(double %t13, double %m12)
125866b9f43SDominik Steenken  %m14 = tail call fast double @llvm.minnum.f64(double %t14, double %m13)
126866b9f43SDominik Steenken  %m15 = tail call fast double @llvm.minnum.f64(double %t15, double %m14)
127866b9f43SDominik Steenken  ret double %m15
128866b9f43SDominik Steenken}
129866b9f43SDominik Steenken
130866b9f43SDominik Steenkendefine float @fmin_float_12_nums_nonseq(ptr nocapture noundef readonly %x) {
131866b9f43SDominik Steenken; CHECK-LABEL: define float @fmin_float_12_nums_nonseq(
132*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {
133866b9f43SDominik Steenken; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2
134866b9f43SDominik Steenken; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4
135866b9f43SDominik Steenken; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6
136866b9f43SDominik Steenken; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8
137866b9f43SDominik Steenken; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10
138866b9f43SDominik Steenken; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12
139866b9f43SDominik Steenken; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14
140866b9f43SDominik Steenken; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16
141866b9f43SDominik Steenken; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18
142866b9f43SDominik Steenken; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20
143866b9f43SDominik Steenken; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22
144866b9f43SDominik Steenken; CHECK-NEXT:    [[T0:%.*]] = load float, ptr [[X]], align 4
145866b9f43SDominik Steenken; CHECK-NEXT:    [[T1:%.*]] = load float, ptr [[G1]], align 4
146866b9f43SDominik Steenken; CHECK-NEXT:    [[T2:%.*]] = load float, ptr [[G2]], align 4
147866b9f43SDominik Steenken; CHECK-NEXT:    [[T3:%.*]] = load float, ptr [[G3]], align 4
148866b9f43SDominik Steenken; CHECK-NEXT:    [[T4:%.*]] = load float, ptr [[G4]], align 4
149866b9f43SDominik Steenken; CHECK-NEXT:    [[T5:%.*]] = load float, ptr [[G5]], align 4
150866b9f43SDominik Steenken; CHECK-NEXT:    [[T6:%.*]] = load float, ptr [[G6]], align 4
151866b9f43SDominik Steenken; CHECK-NEXT:    [[T7:%.*]] = load float, ptr [[G7]], align 4
152866b9f43SDominik Steenken; CHECK-NEXT:    [[T8:%.*]] = load float, ptr [[G8]], align 4
153866b9f43SDominik Steenken; CHECK-NEXT:    [[T9:%.*]] = load float, ptr [[G9]], align 4
154866b9f43SDominik Steenken; CHECK-NEXT:    [[T10:%.*]] = load float, ptr [[G10]], align 4
155866b9f43SDominik Steenken; CHECK-NEXT:    [[T11:%.*]] = load float, ptr [[G11]], align 4
156866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0
157866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1
158866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2
159866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3
160866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4
161866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5
162866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6
163866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7
164866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8
165866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9
166866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10
167866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11
168866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmin.v12f32(<12 x float> [[TMP12]])
169866b9f43SDominik Steenken; CHECK-NEXT:    ret float [[TMP13]]
170866b9f43SDominik Steenken;
171866b9f43SDominik Steenken  %g1 = getelementptr inbounds float, ptr %x, i64 2
172866b9f43SDominik Steenken  %g2 = getelementptr inbounds float, ptr %x, i64 4
173866b9f43SDominik Steenken  %g3 = getelementptr inbounds float, ptr %x, i64 6
174866b9f43SDominik Steenken  %g4 = getelementptr inbounds float, ptr %x, i64 8
175866b9f43SDominik Steenken  %g5 = getelementptr inbounds float, ptr %x, i64 10
176866b9f43SDominik Steenken  %g6 = getelementptr inbounds float, ptr %x, i64 12
177866b9f43SDominik Steenken  %g7 = getelementptr inbounds float, ptr %x, i64 14
178866b9f43SDominik Steenken  %g8 = getelementptr inbounds float, ptr %x, i64 16
179866b9f43SDominik Steenken  %g9 = getelementptr inbounds float, ptr %x, i64 18
180866b9f43SDominik Steenken  %g10 = getelementptr inbounds float, ptr %x, i64 20
181866b9f43SDominik Steenken  %g11 = getelementptr inbounds float, ptr %x, i64 22
182866b9f43SDominik Steenken  %t0 = load float, ptr %x, align 4
183866b9f43SDominik Steenken  %t1 = load float, ptr %g1, align 4
184866b9f43SDominik Steenken  %t2 = load float, ptr %g2, align 4
185866b9f43SDominik Steenken  %t3 = load float, ptr %g3, align 4
186866b9f43SDominik Steenken  %t4 = load float, ptr %g4, align 4
187866b9f43SDominik Steenken  %t5 = load float, ptr %g5, align 4
188866b9f43SDominik Steenken  %t6 = load float, ptr %g6, align 4
189866b9f43SDominik Steenken  %t7 = load float, ptr %g7, align 4
190866b9f43SDominik Steenken  %t8 = load float, ptr %g8, align 4
191866b9f43SDominik Steenken  %t9 = load float, ptr %g9, align 4
192866b9f43SDominik Steenken  %t10 = load float, ptr %g10, align 4
193866b9f43SDominik Steenken  %t11 = load float, ptr %g11, align 4
194866b9f43SDominik Steenken  %m1 = tail call fast float @llvm.minnum.f32(float %t1, float %t0)
195866b9f43SDominik Steenken  %m2 = tail call fast float @llvm.minnum.f32(float %t2, float %m1)
196866b9f43SDominik Steenken  %m3 = tail call fast float @llvm.minnum.f32(float %t3, float %m2)
197866b9f43SDominik Steenken  %m4 = tail call fast float @llvm.minnum.f32(float %t4, float %m3)
198866b9f43SDominik Steenken  %m5 = tail call fast float @llvm.minnum.f32(float %t5, float %m4)
199866b9f43SDominik Steenken  %m6 = tail call fast float @llvm.minnum.f32(float %t6, float %m5)
200866b9f43SDominik Steenken  %m7 = tail call fast float @llvm.minnum.f32(float %t7, float %m6)
201866b9f43SDominik Steenken  %m8 = tail call fast float @llvm.minnum.f32(float %t8, float %m7)
202866b9f43SDominik Steenken  %m9 = tail call fast float @llvm.minnum.f32(float %t9, float %m8)
203866b9f43SDominik Steenken  %m10 = tail call fast float @llvm.minnum.f32(float %t10, float %m9)
204866b9f43SDominik Steenken  %m11 = tail call fast float @llvm.minnum.f32(float %t11, float %m10)
205866b9f43SDominik Steenken  ret float %m11
206866b9f43SDominik Steenken}
207866b9f43SDominik Steenken
208866b9f43SDominik Steenkendefine double @fmax_double_4_nums_seq(ptr nocapture noundef readonly %x) {
209866b9f43SDominik Steenken; CHECK-LABEL: define double @fmax_double_4_nums_seq(
210*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {
211866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x double>, ptr [[X]], align 4
212866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = call fast double @llvm.vector.reduce.fmax.v4f64(<4 x double> [[TMP1]])
213866b9f43SDominik Steenken; CHECK-NEXT:    ret double [[TMP2]]
214866b9f43SDominik Steenken;
215866b9f43SDominik Steenken  %g1 = getelementptr inbounds double, ptr %x, i64 1
216866b9f43SDominik Steenken  %g2 = getelementptr inbounds double, ptr %x, i64 2
217866b9f43SDominik Steenken  %g3 = getelementptr inbounds double, ptr %x, i64 3
218866b9f43SDominik Steenken  %t0 = load double, ptr %x, align 4
219866b9f43SDominik Steenken  %t1 = load double, ptr %g1, align 4
220866b9f43SDominik Steenken  %t2 = load double, ptr %g2, align 4
221866b9f43SDominik Steenken  %t3 = load double, ptr %g3, align 4
222866b9f43SDominik Steenken  %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0)
223866b9f43SDominik Steenken  %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1)
224866b9f43SDominik Steenken  %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2)
225866b9f43SDominik Steenken  ret double %m3
226866b9f43SDominik Steenken}
227866b9f43SDominik Steenken
228866b9f43SDominik Steenkendefine double @fmax_double_16_nums_nonseq(ptr nocapture noundef readonly %x) {
229866b9f43SDominik Steenken; CHECK-LABEL: define double @fmax_double_16_nums_nonseq(
230*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {
231866b9f43SDominik Steenken; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds double, ptr [[X]], i64 2
232866b9f43SDominik Steenken; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds double, ptr [[X]], i64 4
233866b9f43SDominik Steenken; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds double, ptr [[X]], i64 6
234866b9f43SDominik Steenken; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds double, ptr [[X]], i64 8
235866b9f43SDominik Steenken; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds double, ptr [[X]], i64 10
236866b9f43SDominik Steenken; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds double, ptr [[X]], i64 12
237866b9f43SDominik Steenken; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds double, ptr [[X]], i64 14
238866b9f43SDominik Steenken; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds double, ptr [[X]], i64 16
239866b9f43SDominik Steenken; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds double, ptr [[X]], i64 18
240866b9f43SDominik Steenken; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds double, ptr [[X]], i64 20
241866b9f43SDominik Steenken; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds double, ptr [[X]], i64 22
242866b9f43SDominik Steenken; CHECK-NEXT:    [[G12:%.*]] = getelementptr inbounds double, ptr [[X]], i64 24
243866b9f43SDominik Steenken; CHECK-NEXT:    [[G13:%.*]] = getelementptr inbounds double, ptr [[X]], i64 26
244866b9f43SDominik Steenken; CHECK-NEXT:    [[G14:%.*]] = getelementptr inbounds double, ptr [[X]], i64 28
245866b9f43SDominik Steenken; CHECK-NEXT:    [[G15:%.*]] = getelementptr inbounds double, ptr [[X]], i64 30
246866b9f43SDominik Steenken; CHECK-NEXT:    [[T0:%.*]] = load double, ptr [[X]], align 4
247866b9f43SDominik Steenken; CHECK-NEXT:    [[T1:%.*]] = load double, ptr [[G1]], align 4
248866b9f43SDominik Steenken; CHECK-NEXT:    [[T2:%.*]] = load double, ptr [[G2]], align 4
249866b9f43SDominik Steenken; CHECK-NEXT:    [[T3:%.*]] = load double, ptr [[G3]], align 4
250866b9f43SDominik Steenken; CHECK-NEXT:    [[T4:%.*]] = load double, ptr [[G4]], align 4
251866b9f43SDominik Steenken; CHECK-NEXT:    [[T5:%.*]] = load double, ptr [[G5]], align 4
252866b9f43SDominik Steenken; CHECK-NEXT:    [[T6:%.*]] = load double, ptr [[G6]], align 4
253866b9f43SDominik Steenken; CHECK-NEXT:    [[T7:%.*]] = load double, ptr [[G7]], align 4
254866b9f43SDominik Steenken; CHECK-NEXT:    [[T8:%.*]] = load double, ptr [[G8]], align 4
255866b9f43SDominik Steenken; CHECK-NEXT:    [[T9:%.*]] = load double, ptr [[G9]], align 4
256866b9f43SDominik Steenken; CHECK-NEXT:    [[T10:%.*]] = load double, ptr [[G10]], align 4
257866b9f43SDominik Steenken; CHECK-NEXT:    [[T11:%.*]] = load double, ptr [[G11]], align 4
258866b9f43SDominik Steenken; CHECK-NEXT:    [[T12:%.*]] = load double, ptr [[G12]], align 4
259866b9f43SDominik Steenken; CHECK-NEXT:    [[T13:%.*]] = load double, ptr [[G13]], align 4
260866b9f43SDominik Steenken; CHECK-NEXT:    [[T14:%.*]] = load double, ptr [[G14]], align 4
261866b9f43SDominik Steenken; CHECK-NEXT:    [[T15:%.*]] = load double, ptr [[G15]], align 4
262866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <16 x double> poison, double [[T1]], i32 0
263866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <16 x double> [[TMP1]], double [[T0]], i32 1
264866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <16 x double> [[TMP2]], double [[T2]], i32 2
265866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <16 x double> [[TMP3]], double [[T3]], i32 3
266866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <16 x double> [[TMP4]], double [[T4]], i32 4
267866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <16 x double> [[TMP5]], double [[T5]], i32 5
268866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <16 x double> [[TMP6]], double [[T6]], i32 6
269866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <16 x double> [[TMP7]], double [[T7]], i32 7
270866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <16 x double> [[TMP8]], double [[T8]], i32 8
271866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <16 x double> [[TMP9]], double [[T9]], i32 9
272866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <16 x double> [[TMP10]], double [[T10]], i32 10
273866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <16 x double> [[TMP11]], double [[T11]], i32 11
274866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP13:%.*]] = insertelement <16 x double> [[TMP12]], double [[T12]], i32 12
275866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP14:%.*]] = insertelement <16 x double> [[TMP13]], double [[T13]], i32 13
276866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP15:%.*]] = insertelement <16 x double> [[TMP14]], double [[T14]], i32 14
277866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP16:%.*]] = insertelement <16 x double> [[TMP15]], double [[T15]], i32 15
278866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP17:%.*]] = call fast double @llvm.vector.reduce.fmax.v16f64(<16 x double> [[TMP16]])
279866b9f43SDominik Steenken; CHECK-NEXT:    ret double [[TMP17]]
280866b9f43SDominik Steenken;
281866b9f43SDominik Steenken  %g1 = getelementptr inbounds double, ptr %x, i64 2
282866b9f43SDominik Steenken  %g2 = getelementptr inbounds double, ptr %x, i64 4
283866b9f43SDominik Steenken  %g3 = getelementptr inbounds double, ptr %x, i64 6
284866b9f43SDominik Steenken  %g4 = getelementptr inbounds double, ptr %x, i64 8
285866b9f43SDominik Steenken  %g5 = getelementptr inbounds double, ptr %x, i64 10
286866b9f43SDominik Steenken  %g6 = getelementptr inbounds double, ptr %x, i64 12
287866b9f43SDominik Steenken  %g7 = getelementptr inbounds double, ptr %x, i64 14
288866b9f43SDominik Steenken  %g8 = getelementptr inbounds double, ptr %x, i64 16
289866b9f43SDominik Steenken  %g9 = getelementptr inbounds double, ptr %x, i64 18
290866b9f43SDominik Steenken  %g10 = getelementptr inbounds double, ptr %x, i64 20
291866b9f43SDominik Steenken  %g11 = getelementptr inbounds double, ptr %x, i64 22
292866b9f43SDominik Steenken  %g12 = getelementptr inbounds double, ptr %x, i64 24
293866b9f43SDominik Steenken  %g13 = getelementptr inbounds double, ptr %x, i64 26
294866b9f43SDominik Steenken  %g14 = getelementptr inbounds double, ptr %x, i64 28
295866b9f43SDominik Steenken  %g15 = getelementptr inbounds double, ptr %x, i64 30
296866b9f43SDominik Steenken  %t0 = load double, ptr %x, align 4
297866b9f43SDominik Steenken  %t1 = load double, ptr %g1, align 4
298866b9f43SDominik Steenken  %t2 = load double, ptr %g2, align 4
299866b9f43SDominik Steenken  %t3 = load double, ptr %g3, align 4
300866b9f43SDominik Steenken  %t4 = load double, ptr %g4, align 4
301866b9f43SDominik Steenken  %t5 = load double, ptr %g5, align 4
302866b9f43SDominik Steenken  %t6 = load double, ptr %g6, align 4
303866b9f43SDominik Steenken  %t7 = load double, ptr %g7, align 4
304866b9f43SDominik Steenken  %t8 = load double, ptr %g8, align 4
305866b9f43SDominik Steenken  %t9 = load double, ptr %g9, align 4
306866b9f43SDominik Steenken  %t10 = load double, ptr %g10, align 4
307866b9f43SDominik Steenken  %t11 = load double, ptr %g11, align 4
308866b9f43SDominik Steenken  %t12 = load double, ptr %g12, align 4
309866b9f43SDominik Steenken  %t13 = load double, ptr %g13, align 4
310866b9f43SDominik Steenken  %t14 = load double, ptr %g14, align 4
311866b9f43SDominik Steenken  %t15 = load double, ptr %g15, align 4
312866b9f43SDominik Steenken  %m1 = tail call fast double @llvm.maxnum.f64(double %t1, double %t0)
313866b9f43SDominik Steenken  %m2 = tail call fast double @llvm.maxnum.f64(double %t2, double %m1)
314866b9f43SDominik Steenken  %m3 = tail call fast double @llvm.maxnum.f64(double %t3, double %m2)
315866b9f43SDominik Steenken  %m4 = tail call fast double @llvm.maxnum.f64(double %t4, double %m3)
316866b9f43SDominik Steenken  %m5 = tail call fast double @llvm.maxnum.f64(double %t5, double %m4)
317866b9f43SDominik Steenken  %m6 = tail call fast double @llvm.maxnum.f64(double %t6, double %m5)
318866b9f43SDominik Steenken  %m7 = tail call fast double @llvm.maxnum.f64(double %t7, double %m6)
319866b9f43SDominik Steenken  %m8 = tail call fast double @llvm.maxnum.f64(double %t8, double %m7)
320866b9f43SDominik Steenken  %m9 = tail call fast double @llvm.maxnum.f64(double %t9, double %m8)
321866b9f43SDominik Steenken  %m10 = tail call fast double @llvm.maxnum.f64(double %t10, double %m9)
322866b9f43SDominik Steenken  %m11 = tail call fast double @llvm.maxnum.f64(double %t11, double %m10)
323866b9f43SDominik Steenken  %m12 = tail call fast double @llvm.maxnum.f64(double %t12, double %m11)
324866b9f43SDominik Steenken  %m13 = tail call fast double @llvm.maxnum.f64(double %t13, double %m12)
325866b9f43SDominik Steenken  %m14 = tail call fast double @llvm.maxnum.f64(double %t14, double %m13)
326866b9f43SDominik Steenken  %m15 = tail call fast double @llvm.maxnum.f64(double %t15, double %m14)
327866b9f43SDominik Steenken  ret double %m15
328866b9f43SDominik Steenken}
329866b9f43SDominik Steenken
330866b9f43SDominik Steenkendefine float @fmax_float_12_nums_nonseq(ptr nocapture noundef readonly %x) {
331866b9f43SDominik Steenken; CHECK-LABEL: define float @fmax_float_12_nums_nonseq(
332*29441e4fSNikita Popov; CHECK-SAME: ptr noundef readonly captures(none) [[X:%.*]]) #[[ATTR0]] {
333866b9f43SDominik Steenken; CHECK-NEXT:    [[G1:%.*]] = getelementptr inbounds float, ptr [[X]], i64 2
334866b9f43SDominik Steenken; CHECK-NEXT:    [[G2:%.*]] = getelementptr inbounds float, ptr [[X]], i64 4
335866b9f43SDominik Steenken; CHECK-NEXT:    [[G3:%.*]] = getelementptr inbounds float, ptr [[X]], i64 6
336866b9f43SDominik Steenken; CHECK-NEXT:    [[G4:%.*]] = getelementptr inbounds float, ptr [[X]], i64 8
337866b9f43SDominik Steenken; CHECK-NEXT:    [[G5:%.*]] = getelementptr inbounds float, ptr [[X]], i64 10
338866b9f43SDominik Steenken; CHECK-NEXT:    [[G6:%.*]] = getelementptr inbounds float, ptr [[X]], i64 12
339866b9f43SDominik Steenken; CHECK-NEXT:    [[G7:%.*]] = getelementptr inbounds float, ptr [[X]], i64 14
340866b9f43SDominik Steenken; CHECK-NEXT:    [[G8:%.*]] = getelementptr inbounds float, ptr [[X]], i64 16
341866b9f43SDominik Steenken; CHECK-NEXT:    [[G9:%.*]] = getelementptr inbounds float, ptr [[X]], i64 18
342866b9f43SDominik Steenken; CHECK-NEXT:    [[G10:%.*]] = getelementptr inbounds float, ptr [[X]], i64 20
343866b9f43SDominik Steenken; CHECK-NEXT:    [[G11:%.*]] = getelementptr inbounds float, ptr [[X]], i64 22
344866b9f43SDominik Steenken; CHECK-NEXT:    [[T0:%.*]] = load float, ptr [[X]], align 4
345866b9f43SDominik Steenken; CHECK-NEXT:    [[T1:%.*]] = load float, ptr [[G1]], align 4
346866b9f43SDominik Steenken; CHECK-NEXT:    [[T2:%.*]] = load float, ptr [[G2]], align 4
347866b9f43SDominik Steenken; CHECK-NEXT:    [[T3:%.*]] = load float, ptr [[G3]], align 4
348866b9f43SDominik Steenken; CHECK-NEXT:    [[T4:%.*]] = load float, ptr [[G4]], align 4
349866b9f43SDominik Steenken; CHECK-NEXT:    [[T5:%.*]] = load float, ptr [[G5]], align 4
350866b9f43SDominik Steenken; CHECK-NEXT:    [[T6:%.*]] = load float, ptr [[G6]], align 4
351866b9f43SDominik Steenken; CHECK-NEXT:    [[T7:%.*]] = load float, ptr [[G7]], align 4
352866b9f43SDominik Steenken; CHECK-NEXT:    [[T8:%.*]] = load float, ptr [[G8]], align 4
353866b9f43SDominik Steenken; CHECK-NEXT:    [[T9:%.*]] = load float, ptr [[G9]], align 4
354866b9f43SDominik Steenken; CHECK-NEXT:    [[T10:%.*]] = load float, ptr [[G10]], align 4
355866b9f43SDominik Steenken; CHECK-NEXT:    [[T11:%.*]] = load float, ptr [[G11]], align 4
356866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP1:%.*]] = insertelement <12 x float> poison, float [[T1]], i32 0
357866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP2:%.*]] = insertelement <12 x float> [[TMP1]], float [[T0]], i32 1
358866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP3:%.*]] = insertelement <12 x float> [[TMP2]], float [[T2]], i32 2
359866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP4:%.*]] = insertelement <12 x float> [[TMP3]], float [[T3]], i32 3
360866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP5:%.*]] = insertelement <12 x float> [[TMP4]], float [[T4]], i32 4
361866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP6:%.*]] = insertelement <12 x float> [[TMP5]], float [[T5]], i32 5
362866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP7:%.*]] = insertelement <12 x float> [[TMP6]], float [[T6]], i32 6
363866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP8:%.*]] = insertelement <12 x float> [[TMP7]], float [[T7]], i32 7
364866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP9:%.*]] = insertelement <12 x float> [[TMP8]], float [[T8]], i32 8
365866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP10:%.*]] = insertelement <12 x float> [[TMP9]], float [[T9]], i32 9
366866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP11:%.*]] = insertelement <12 x float> [[TMP10]], float [[T10]], i32 10
367866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP12:%.*]] = insertelement <12 x float> [[TMP11]], float [[T11]], i32 11
368866b9f43SDominik Steenken; CHECK-NEXT:    [[TMP13:%.*]] = call fast float @llvm.vector.reduce.fmax.v12f32(<12 x float> [[TMP12]])
369866b9f43SDominik Steenken; CHECK-NEXT:    ret float [[TMP13]]
370866b9f43SDominik Steenken;
371866b9f43SDominik Steenken  %g1 = getelementptr inbounds float, ptr %x, i64 2
372866b9f43SDominik Steenken  %g2 = getelementptr inbounds float, ptr %x, i64 4
373866b9f43SDominik Steenken  %g3 = getelementptr inbounds float, ptr %x, i64 6
374866b9f43SDominik Steenken  %g4 = getelementptr inbounds float, ptr %x, i64 8
375866b9f43SDominik Steenken  %g5 = getelementptr inbounds float, ptr %x, i64 10
376866b9f43SDominik Steenken  %g6 = getelementptr inbounds float, ptr %x, i64 12
377866b9f43SDominik Steenken  %g7 = getelementptr inbounds float, ptr %x, i64 14
378866b9f43SDominik Steenken  %g8 = getelementptr inbounds float, ptr %x, i64 16
379866b9f43SDominik Steenken  %g9 = getelementptr inbounds float, ptr %x, i64 18
380866b9f43SDominik Steenken  %g10 = getelementptr inbounds float, ptr %x, i64 20
381866b9f43SDominik Steenken  %g11 = getelementptr inbounds float, ptr %x, i64 22
382866b9f43SDominik Steenken  %t0 = load float, ptr %x, align 4
383866b9f43SDominik Steenken  %t1 = load float, ptr %g1, align 4
384866b9f43SDominik Steenken  %t2 = load float, ptr %g2, align 4
385866b9f43SDominik Steenken  %t3 = load float, ptr %g3, align 4
386866b9f43SDominik Steenken  %t4 = load float, ptr %g4, align 4
387866b9f43SDominik Steenken  %t5 = load float, ptr %g5, align 4
388866b9f43SDominik Steenken  %t6 = load float, ptr %g6, align 4
389866b9f43SDominik Steenken  %t7 = load float, ptr %g7, align 4
390866b9f43SDominik Steenken  %t8 = load float, ptr %g8, align 4
391866b9f43SDominik Steenken  %t9 = load float, ptr %g9, align 4
392866b9f43SDominik Steenken  %t10 = load float, ptr %g10, align 4
393866b9f43SDominik Steenken  %t11 = load float, ptr %g11, align 4
394866b9f43SDominik Steenken  %m1 = tail call fast float @llvm.maxnum.f32(float %t1, float %t0)
395866b9f43SDominik Steenken  %m2 = tail call fast float @llvm.maxnum.f32(float %t2, float %m1)
396866b9f43SDominik Steenken  %m3 = tail call fast float @llvm.maxnum.f32(float %t3, float %m2)
397866b9f43SDominik Steenken  %m4 = tail call fast float @llvm.maxnum.f32(float %t4, float %m3)
398866b9f43SDominik Steenken  %m5 = tail call fast float @llvm.maxnum.f32(float %t5, float %m4)
399866b9f43SDominik Steenken  %m6 = tail call fast float @llvm.maxnum.f32(float %t6, float %m5)
400866b9f43SDominik Steenken  %m7 = tail call fast float @llvm.maxnum.f32(float %t7, float %m6)
401866b9f43SDominik Steenken  %m8 = tail call fast float @llvm.maxnum.f32(float %t8, float %m7)
402866b9f43SDominik Steenken  %m9 = tail call fast float @llvm.maxnum.f32(float %t9, float %m8)
403866b9f43SDominik Steenken  %m10 = tail call fast float @llvm.maxnum.f32(float %t10, float %m9)
404866b9f43SDominik Steenken  %m11 = tail call fast float @llvm.maxnum.f32(float %t11, float %m10)
405866b9f43SDominik Steenken  ret float %m11
406866b9f43SDominik Steenken}
407866b9f43SDominik Steenken
408866b9f43SDominik Steenkendeclare float @llvm.minnum.f32(float, float)
409866b9f43SDominik Steenkendeclare double @llvm.minnum.f64(double, double)
410866b9f43SDominik Steenkendeclare float @llvm.maxnum.f32(float, float)
411866b9f43SDominik Steenkendeclare double @llvm.maxnum.f64(double, double)
412