Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / PowerPC / ctr-minmaxnum.ll
blobe38f851620b7397a68801268435c6c3736abf423
1 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=pwr7 < %s | FileCheck %s
2 ; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -verify-machineinstrs -mcpu=a2q < %s | FileCheck %s --check-prefix=QPX
4 declare float @fabsf(float)
6 declare float @fminf(float, float)
7 declare double @fmin(double, double)
8 declare float @llvm.minnum.f32(float, float)
9 declare double @llvm.minnum.f64(double, double)
11 declare float @fmaxf(float, float)
12 declare double @fmax(double, double)
13 declare float @llvm.maxnum.f32(float, float)
14 declare double @llvm.maxnum.f64(double, double)
16 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>)
17 declare <4 x double> @llvm.minnum.v4f64(<4 x double>, <4 x double>)
18 declare <4 x float> @llvm.maxnum.v4f32(<4 x float>, <4 x float>)
19 declare <4 x double> @llvm.maxnum.v4f64(<4 x double>, <4 x double>)
21 define void @test1(float %f, float* %fp) {
22 entry:
23   br label %loop_body
25 loop_body:
26   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
27   %0 = call float @llvm.minnum.f32(float %f, float 1.0)
28   store float %0, float* %fp, align 4
29   %1 = add i64 %invar_address.dim.0.01, 1
30   %2 = icmp eq i64 %1, 2
31   br i1 %2, label %loop_exit, label %loop_body
33 loop_exit:
34   ret void
37 ; CHECK-LABEL: test1:
38 ; CHECK-NOT: mtctr
39 ; CHECK: bl fminf
40 ; CHECK-NOT: bl fminf
41 ; CHECK-NOT: mtctr
42 ; CHECK: blr
44 define void @test1v(<4 x float> %f, <4 x float>* %fp) {
45 entry:
46   br label %loop_body
48 loop_body:
49   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
50   %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>)
51   store <4 x float> %0, <4 x float>* %fp, align 16
52   %1 = add i64 %invar_address.dim.0.01, 1
53   %2 = icmp eq i64 %1, 4
54   br i1 %2, label %loop_exit, label %loop_body
56 loop_exit:
57   ret void
60 ; CHECK-LABEL: test1v:
61 ; CHECK: bl fminf
62 ; CHECK-NOT: mtctr
63 ; CHECK: bl fminf
64 ; CHECK-NOT: mtctr
65 ; CHECK: bl fminf
66 ; CHECK-NOT: mtctr
67 ; CHECK: bl fminf
68 ; CHECK-NOT: bl fminf
69 ; CHECK: blr
71 ; QPX-LABEL: test1v:
72 ; QPX: mtctr
73 ; QPX-NOT: bl fminf
74 ; QPX: blr
76 define void @test1a(float %f, float* %fp) {
77 entry:
78   br label %loop_body
80 loop_body:
81   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
82   %0 = call float @fminf(float %f, float 1.0) readnone
83   store float %0, float* %fp, align 4
84   %1 = add i64 %invar_address.dim.0.01, 1
85   %2 = icmp eq i64 %1, 2
86   br i1 %2, label %loop_exit, label %loop_body
88 loop_exit:
89   ret void
92 ; CHECK-LABEL: test1a:
93 ; CHECK-NOT: mtctr
94 ; CHECK: bl fminf
95 ; CHECK-NOT: bl fminf
96 ; CHECK-NOT: mtctr
97 ; CHECK: blr
99 define void @test2(float %f, float* %fp) {
100 entry:
101   br label %loop_body
103 loop_body:
104   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
105   %0 = call float @llvm.maxnum.f32(float %f, float 1.0)
106   store float %0, float* %fp, align 4
107   %1 = add i64 %invar_address.dim.0.01, 1
108   %2 = icmp eq i64 %1, 2
109   br i1 %2, label %loop_exit, label %loop_body
111 loop_exit:
112   ret void
115 ; CHECK-LABEL: test2:
116 ; CHECK-NOT: mtctr
117 ; CHECK: bl fmaxf
118 ; CHECK-NOT: bl fmaxf
119 ; CHECK-NOT: mtctr
120 ; CHECK: blr
122 define void @test2v(<4 x double> %f, <4 x double>* %fp) {
123 entry:
124   br label %loop_body
126 loop_body:
127   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
128   %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>)
129   store <4 x double> %0, <4 x double>* %fp, align 16
130   %1 = add i64 %invar_address.dim.0.01, 1
131   %2 = icmp eq i64 %1, 4
132   br i1 %2, label %loop_exit, label %loop_body
134 loop_exit:
135   ret void
138 ; CHECK-LABEL: test2v:
139 ; CHECK: bl fmax
140 ; CHECK-NOT: mtctr
141 ; CHECK: bl fmax
142 ; CHECK-NOT: mtctr
143 ; CHECK: bl fmax
144 ; CHECK-NOT: mtctr
145 ; CHECK: bl fmax
146 ; CHECK-NOT: bl fmax
147 ; CHECK: blr
149 ; QPX-LABEL: test2v:
150 ; QPX: mtctr
151 ; QPX-NOT: bl fmax
152 ; QPX: blr
154 define void @test2a(float %f, float* %fp) {
155 entry:
156   br label %loop_body
158 loop_body:
159   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
160   %0 = call float @fmaxf(float %f, float 1.0) readnone
161   store float %0, float* %fp, align 4
162   %1 = add i64 %invar_address.dim.0.01, 1
163   %2 = icmp eq i64 %1, 2
164   br i1 %2, label %loop_exit, label %loop_body
166 loop_exit:
167   ret void
170 ; CHECK-LABEL: test2a:
171 ; CHECK-NOT: mtctr
172 ; CHECK: bl fmaxf
173 ; CHECK-NOT: bl fmaxf
174 ; CHECK-NOT: mtctr
175 ; CHECK: blr
177 define void @test3(double %f, double* %fp) {
178 entry:
179   br label %loop_body
181 loop_body:
182   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
183   %0 = call double @llvm.minnum.f64(double %f, double 1.0)
184   store double %0, double* %fp, align 8
185   %1 = add i64 %invar_address.dim.0.01, 1
186   %2 = icmp eq i64 %1, 2
187   br i1 %2, label %loop_exit, label %loop_body
189 loop_exit:
190   ret void
193 ; CHECK-LABEL: test3:
194 ; CHECK-NOT: mtctr
195 ; CHECK: bl fmin
196 ; CHECK-NOT: bl fmin
197 ; CHECK-NOT: mtctr
198 ; CHECK: blr
200 define void @test3a(double %f, double* %fp) {
201 entry:
202   br label %loop_body
204 loop_body:
205   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
206   %0 = call double @fmin(double %f, double 1.0) readnone
207   store double %0, double* %fp, align 8
208   %1 = add i64 %invar_address.dim.0.01, 1
209   %2 = icmp eq i64 %1, 2
210   br i1 %2, label %loop_exit, label %loop_body
212 loop_exit:
213   ret void
216 ; CHECK-LABEL: test3a:
217 ; CHECK-NOT: mtctr
218 ; CHECK: bl fmin
219 ; CHECK-NOT: bl fmin
220 ; CHECK-NOT: mtctr
221 ; CHECK: blr
223 define void @test4(double %f, double* %fp) {
224 entry:
225   br label %loop_body
227 loop_body:
228   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
229   %0 = call double @llvm.maxnum.f64(double %f, double 1.0)
230   store double %0, double* %fp, align 8
231   %1 = add i64 %invar_address.dim.0.01, 1
232   %2 = icmp eq i64 %1, 2
233   br i1 %2, label %loop_exit, label %loop_body
235 loop_exit:
236   ret void
239 ; CHECK-LABEL: test4:
240 ; CHECK-NOT: mtctr
241 ; CHECK: bl fmax
242 ; CHECK-NOT: bl fmax
243 ; CHECK-NOT: mtctr
244 ; CHECK: blr
246 define void @test4a(double %f, double* %fp) {
247 entry:
248   br label %loop_body
250 loop_body:
251   %invar_address.dim.0.01 = phi i64 [ 0, %entry ], [ %1, %loop_body ]
252   %0 = call double @fmax(double %f, double 1.0) readnone
253   store double %0, double* %fp, align 8
254   %1 = add i64 %invar_address.dim.0.01, 1
255   %2 = icmp eq i64 %1, 2
256   br i1 %2, label %loop_exit, label %loop_body
258 loop_exit:
259   ret void
262 ; CHECK-LABEL: test4a:
263 ; CHECK-NOT: mtctr
264 ; CHECK: bl fmax
265 ; CHECK-NOT: bl fmax
266 ; CHECK-NOT: mtctr
267 ; CHECK: blr