[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / PowerPC / ctr-minmaxnum.ll
blobfacd45f5377cf2ea6a65e65c814c56816acf676a
1 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
3 declare float @fabsf(float)
5 declare float @fminf(float, float)
6 declare double @fmin(double, double)
7 declare float @llvm.minnum.f32(float, float)
8 declare double @llvm.minnum.f64(double, double)
10 declare float @fmaxf(float, float)
11 declare double @fmax(double, double)
12 declare float @llvm.maxnum.f32(float, float)
13 declare double @llvm.maxnum.f64(double, double)
15 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
16 declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
17 declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
18 declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
20 define void @test1(float %f, ptr %fp) {
21 entry:
22   br label %loop_body
24 loop_body:
25   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
26   %0 = call float @llvm.minnum.f32(float %f, float 1.0)
27   store float %0, ptr %fp, align 4
28   %1 = add i64 %invar_address.dim.0.01, 1
29   %2 = icmp eq i64 %1, 2
30   br i1 %2, label %loop_exit, label %loop_body
32 loop_exit:
33   ret void
36 ; CHECK-LABEL: test1:
37 ; CHECK-NOT: mtctr
38 ; CHECK: xsmindp
39 ; CHECK-NOT: xsmindp
40 ; CHECK-NOT: mtctr
41 ; CHECK: blr
43 define void @test1v(<4 x float> %f, ptr %fp) {
44 entry:
45   br label %loop_body
47 loop_body:
48   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
49   %0 = call <4 x float> @llvm.minnum.v4f32(<4 x float> %f, <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0>)
50   store <4 x float> %0, ptr %fp, align 16
51   %1 = add i64 %invar_address.dim.0.01, 1
52   %2 = icmp eq i64 %1, 4
53   br i1 %2, label %loop_exit, label %loop_body
55 loop_exit:
56   ret void
59 ; CHECK-LABEL: test1v:
60 ; CHECK: xvminsp
61 ; CHECK-NOT: xsmindp
62 ; CHECK: mtctr
63 ; CHECK-NOT: xsmindp
64 ; CHECK: blr
66 define void @test1a(float %f, ptr %fp) {
67 entry:
68   br label %loop_body
70 loop_body:
71   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
72   %0 = call float @fminf(float %f, float 1.0) readnone
73   store float %0, ptr %fp, align 4
74   %1 = add i64 %invar_address.dim.0.01, 1
75   %2 = icmp eq i64 %1, 2
76   br i1 %2, label %loop_exit, label %loop_body
78 loop_exit:
79   ret void
82 ; CHECK-LABEL: test1a:
83 ; CHECK-NOT: mtctr
84 ; CHECK: xsmindp
85 ; CHECK-NOT: xsmindp
86 ; CHECK-NOT: mtctr
87 ; CHECK: blr
89 define void @test2(float %f, ptr %fp) {
90 entry:
91   br label %loop_body
93 loop_body:
94   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
95   %0 = call float @llvm.maxnum.f32(float %f, float 1.0)
96   store float %0, ptr %fp, align 4
97   %1 = add i64 %invar_address.dim.0.01, 1
98   %2 = icmp eq i64 %1, 2
99   br i1 %2, label %loop_exit, label %loop_body
101 loop_exit:
102   ret void
105 ; CHECK-LABEL: test2:
106 ; CHECK-NOT: mtctr
107 ; CHECK: xsmaxdp
108 ; CHECK-NOT: xsmaxdp
109 ; CHECK-NOT: mtctr
110 ; CHECK: blr
112 define void @test2v(<4 x double> %f, ptr %fp) {
113 entry:
114   br label %loop_body
116 loop_body:
117   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
118   %0 = call <4 x double> @llvm.maxnum.v4f64(<4 x double> %f, <4 x double> <double 1.0, double 1.0, double 1.0, double 1.0>)
119   store <4 x double> %0, ptr %fp, align 16
120   %1 = add i64 %invar_address.dim.0.01, 1
121   %2 = icmp eq i64 %1, 4
122   br i1 %2, label %loop_exit, label %loop_body
124 loop_exit:
125   ret void
128 ; CHECK-LABEL: test2v:
129 ; CHECK: xvmaxdp
130 ; CHECK: xvmaxdp
131 ; CHECK-NOT: xsmaxdp
132 ; CHECK: mtctr
133 ; CHECK-NOT: xsmaxdp
134 ; CHECK: blr
136 define void @test2a(float %f, ptr %fp) {
137 entry:
138   br label %loop_body
140 loop_body:
141   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
142   %0 = call float @fmaxf(float %f, float 1.0) readnone
143   store float %0, ptr %fp, align 4
144   %1 = add i64 %invar_address.dim.0.01, 1
145   %2 = icmp eq i64 %1, 2
146   br i1 %2, label %loop_exit, label %loop_body
148 loop_exit:
149   ret void
152 ; CHECK-LABEL: test2a:
153 ; CHECK-NOT: mtctr
154 ; CHECK: xsmaxdp
155 ; CHECK-NOT: xsmaxdp
156 ; CHECK-NOT: mtctr
157 ; CHECK: blr
159 define void @test3(double %f, ptr %fp) {
160 entry:
161   br label %loop_body
163 loop_body:
164   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
165   %0 = call double @llvm.minnum.f64(double %f, double 1.0)
166   store double %0, ptr %fp, align 8
167   %1 = add i64 %invar_address.dim.0.01, 1
168   %2 = icmp eq i64 %1, 2
169   br i1 %2, label %loop_exit, label %loop_body
171 loop_exit:
172   ret void
175 ; CHECK-LABEL: test3:
176 ; CHECK-NOT: mtctr
177 ; CHECK: xsmindp
178 ; CHECK-NOT: xsmindp
179 ; CHECK-NOT: mtctr
180 ; CHECK: blr
182 define void @test3a(double %f, ptr %fp) {
183 entry:
184   br label %loop_body
186 loop_body:
187   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
188   %0 = call double @fmin(double %f, double 1.0) readnone
189   store double %0, ptr %fp, align 8
190   %1 = add i64 %invar_address.dim.0.01, 1
191   %2 = icmp eq i64 %1, 2
192   br i1 %2, label %loop_exit, label %loop_body
194 loop_exit:
195   ret void
198 ; CHECK-LABEL: test3a:
199 ; CHECK-NOT: mtctr
200 ; CHECK: xsmindp
201 ; CHECK-NOT: xsmindp
202 ; CHECK-NOT: mtctr
203 ; CHECK: blr
205 define void @test4(double %f, ptr %fp) {
206 entry:
207   br label %loop_body
209 loop_body:
210   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
211   %0 = call double @llvm.maxnum.f64(double %f, double 1.0)
212   store double %0, ptr %fp, align 8
213   %1 = add i64 %invar_address.dim.0.01, 1
214   %2 = icmp eq i64 %1, 2
215   br i1 %2, label %loop_exit, label %loop_body
217 loop_exit:
218   ret void
221 ; CHECK-LABEL: test4:
222 ; CHECK-NOT: mtctr
223 ; CHECK: xsmaxdp
224 ; CHECK-NOT: xsmaxdp
225 ; CHECK-NOT: mtctr
226 ; CHECK: blr
228 define void @test4a(double %f, ptr %fp) {
229 entry:
230   br label %loop_body
232 loop_body:
233   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
234   %0 = call double @fmax(double %f, double 1.0) readnone
235   store double %0, ptr %fp, align 8
236   %1 = add i64 %invar_address.dim.0.01, 1
237   %2 = icmp eq i64 %1, 2
238   br i1 %2, label %loop_exit, label %loop_body
240 loop_exit:
241   ret void
244 ; CHECK-LABEL: test4a:
245 ; CHECK-NOT: mtctr
246 ; CHECK: xsmaxdp
247 ; CHECK-NOT: xsmaxdp
248 ; CHECK-NOT: mtctr
249 ; CHECK: blr