Mercurial > hg > CbC > CbC_llvm
comparison test/Transforms/InstCombine/minnum.ll @ 83:60c9769439b8 LLVM3.7
LLVM 3.7
author | Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 18 Feb 2015 14:55:36 +0900 |
parents | |
children | c2174574ed3a |
comparison
equal
deleted
inserted
replaced
78:af83660cff7b | 83:60c9769439b8 |
---|---|
1 ; RUN: opt -S -instcombine < %s | FileCheck %s | |
2 | |
3 declare float @llvm.minnum.f32(float, float) #0 | |
4 declare float @llvm.minnum.v2f32(<2 x float>, <2 x float>) #0 | |
5 declare <4 x float> @llvm.minnum.v4f32(<4 x float>, <4 x float>) #0 | |
6 | |
7 declare double @llvm.minnum.f64(double, double) #0 | |
8 declare <2 x double> @llvm.minnum.v2f64(<2 x double>, <2 x double>) #0 | |
9 | |
10 declare float @llvm.maxnum.f32(float, float) #0 | |
11 | |
12 ; CHECK-LABEL: @constant_fold_minnum_f32 | |
13 ; CHECK-NEXT: ret float 1.000000e+00 | |
14 define float @constant_fold_minnum_f32() #0 { | |
15 %x = call float @llvm.minnum.f32(float 1.0, float 2.0) #0 | |
16 ret float %x | |
17 } | |
18 | |
19 ; CHECK-LABEL: @constant_fold_minnum_f32_inv | |
20 ; CHECK-NEXT: ret float 1.000000e+00 | |
21 define float @constant_fold_minnum_f32_inv() #0 { | |
22 %x = call float @llvm.minnum.f32(float 2.0, float 1.0) #0 | |
23 ret float %x | |
24 } | |
25 | |
26 ; CHECK-LABEL: @constant_fold_minnum_f32_nan0 | |
27 ; CHECK-NEXT: ret float 2.000000e+00 | |
28 define float @constant_fold_minnum_f32_nan0() #0 { | |
29 %x = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 2.0) #0 | |
30 ret float %x | |
31 } | |
32 | |
33 ; CHECK-LABEL: @constant_fold_minnum_f32_nan1 | |
34 ; CHECK-NEXT: ret float 2.000000e+00 | |
35 define float @constant_fold_minnum_f32_nan1() #0 { | |
36 %x = call float @llvm.minnum.f32(float 2.0, float 0x7FF8000000000000) #0 | |
37 ret float %x | |
38 } | |
39 | |
40 ; CHECK-LABEL: @constant_fold_minnum_f32_nan_nan | |
41 ; CHECK-NEXT: ret float 0x7FF8000000000000 | |
42 define float @constant_fold_minnum_f32_nan_nan() #0 { | |
43 %x = call float @llvm.minnum.f32(float 0x7FF8000000000000, float 0x7FF8000000000000) #0 | |
44 ret float %x | |
45 } | |
46 | |
47 ; CHECK-LABEL: @constant_fold_minnum_f32_p0_p0 | |
48 ; CHECK-NEXT: ret float 0.000000e+00 | |
49 define float @constant_fold_minnum_f32_p0_p0() #0 { | |
50 %x = call float @llvm.minnum.f32(float 0.0, float 0.0) #0 | |
51 ret float %x | |
52 } | |
53 | |
54 ; CHECK-LABEL: @constant_fold_minnum_f32_p0_n0 | |
55 ; CHECK-NEXT: ret float 0.000000e+00 | |
56 define float @constant_fold_minnum_f32_p0_n0() #0 { | |
57 %x = call float @llvm.minnum.f32(float 0.0, float -0.0) #0 | |
58 ret float %x | |
59 } | |
60 | |
61 ; CHECK-LABEL: @constant_fold_minnum_f32_n0_p0 | |
62 ; CHECK-NEXT: ret float -0.000000e+00 | |
63 define float @constant_fold_minnum_f32_n0_p0() #0 { | |
64 %x = call float @llvm.minnum.f32(float -0.0, float 0.0) #0 | |
65 ret float %x | |
66 } | |
67 | |
68 ; CHECK-LABEL: @constant_fold_minnum_f32_n0_n0 | |
69 ; CHECK-NEXT: ret float -0.000000e+00 | |
70 define float @constant_fold_minnum_f32_n0_n0() #0 { | |
71 %x = call float @llvm.minnum.f32(float -0.0, float -0.0) #0 | |
72 ret float %x | |
73 } | |
74 | |
75 ; CHECK-LABEL: @constant_fold_minnum_v4f32 | |
76 ; CHECK-NEXT: ret <4 x float> <float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 5.000000e+00> | |
77 define <4 x float> @constant_fold_minnum_v4f32() #0 { | |
78 %x = call <4 x float> @llvm.minnum.v4f32(<4 x float> <float 1.0, float 8.0, float 3.0, float 9.0>, <4 x float> <float 2.0, float 2.0, float 10.0, float 5.0>) | |
79 ret <4 x float> %x | |
80 } | |
81 | |
82 ; CHECK-LABEL: @constant_fold_minnum_f64 | |
83 ; CHECK-NEXT: ret double 1.000000e+00 | |
84 define double @constant_fold_minnum_f64() #0 { | |
85 %x = call double @llvm.minnum.f64(double 1.0, double 2.0) #0 | |
86 ret double %x | |
87 } | |
88 | |
89 ; CHECK-LABEL: @constant_fold_minnum_f64_nan0 | |
90 ; CHECK-NEXT: ret double 2.000000e+00 | |
91 define double @constant_fold_minnum_f64_nan0() #0 { | |
92 %x = call double @llvm.minnum.f64(double 0x7FF8000000000000, double 2.0) #0 | |
93 ret double %x | |
94 } | |
95 | |
96 ; CHECK-LABEL: @constant_fold_minnum_f64_nan1 | |
97 ; CHECK-NEXT: ret double 2.000000e+00 | |
98 define double @constant_fold_minnum_f64_nan1() #0 { | |
99 %x = call double @llvm.minnum.f64(double 2.0, double 0x7FF8000000000000) #0 | |
100 ret double %x | |
101 } | |
102 | |
103 ; CHECK-LABEL: @constant_fold_minnum_f64_nan_nan | |
104 ; CHECK-NEXT: ret double 0x7FF8000000000000 | |
105 define double @constant_fold_minnum_f64_nan_nan() #0 { | |
106 %x = call double @llvm.minnum.f64(double 0x7FF8000000000000, double 0x7FF8000000000000) #0 | |
107 ret double %x | |
108 } | |
109 | |
110 ; CHECK-LABEL: @canonicalize_constant_minnum_f32 | |
111 ; CHECK: call float @llvm.minnum.f32(float %x, float 1.000000e+00) | |
112 define float @canonicalize_constant_minnum_f32(float %x) #0 { | |
113 %y = call float @llvm.minnum.f32(float 1.0, float %x) #0 | |
114 ret float %y | |
115 } | |
116 | |
117 ; CHECK-LABEL: @noop_minnum_f32 | |
118 ; CHECK-NEXT: ret float %x | |
119 define float @noop_minnum_f32(float %x) #0 { | |
120 %y = call float @llvm.minnum.f32(float %x, float %x) #0 | |
121 ret float %y | |
122 } | |
123 | |
124 ; CHECK-LABEL: @minnum_f32_nan_val | |
125 ; CHECK-NEXT: ret float %x | |
126 define float @minnum_f32_nan_val(float %x) #0 { | |
127 %y = call float @llvm.minnum.f32(float 0x7FF8000000000000, float %x) #0 | |
128 ret float %y | |
129 } | |
130 | |
131 ; CHECK-LABEL: @minnum_f32_val_nan | |
132 ; CHECK-NEXT: ret float %x | |
133 define float @minnum_f32_val_nan(float %x) #0 { | |
134 %y = call float @llvm.minnum.f32(float %x, float 0x7FF8000000000000) #0 | |
135 ret float %y | |
136 } | |
137 | |
138 ; CHECK-LABEL: @fold_minnum_f32_undef_undef | |
139 ; CHECK-NEXT: ret float undef | |
140 define float @fold_minnum_f32_undef_undef(float %x) nounwind { | |
141 %val = call float @llvm.minnum.f32(float undef, float undef) #0 | |
142 ret float %val | |
143 } | |
144 | |
145 ; CHECK-LABEL: @fold_minnum_f32_val_undef | |
146 ; CHECK-NEXT: ret float %x | |
147 define float @fold_minnum_f32_val_undef(float %x) nounwind { | |
148 %val = call float @llvm.minnum.f32(float %x, float undef) #0 | |
149 ret float %val | |
150 } | |
151 | |
152 ; CHECK-LABEL: @fold_minnum_f32_undef_val | |
153 ; CHECK-NEXT: ret float %x | |
154 define float @fold_minnum_f32_undef_val(float %x) nounwind { | |
155 %val = call float @llvm.minnum.f32(float undef, float %x) #0 | |
156 ret float %val | |
157 } | |
158 | |
159 ; CHECK-LABEL: @minnum_x_minnum_x_y | |
160 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y) | |
161 ; CHECK-NEXT: ret float | |
162 define float @minnum_x_minnum_x_y(float %x, float %y) #0 { | |
163 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
164 %b = call float @llvm.minnum.f32(float %x, float %a) #0 | |
165 ret float %b | |
166 } | |
167 | |
168 ; CHECK-LABEL: @minnum_y_minnum_x_y | |
169 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y) | |
170 ; CHECK-NEXT: ret float | |
171 define float @minnum_y_minnum_x_y(float %x, float %y) #0 { | |
172 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
173 %b = call float @llvm.minnum.f32(float %y, float %a) #0 | |
174 ret float %b | |
175 } | |
176 | |
177 ; CHECK-LABEL: @minnum_z_minnum_x_y | |
178 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y) | |
179 ; CHECK-NEXT: call float @llvm.minnum.f32(float %z, float %a) | |
180 ; CHECK-NEXT: ret float | |
181 define float @minnum_z_minnum_x_y(float %x, float %y, float %z) #0 { | |
182 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
183 %b = call float @llvm.minnum.f32(float %z, float %a) #0 | |
184 ret float %b | |
185 } | |
186 | |
187 ; CHECK-LABEL: @minnum_minnum_x_y_z | |
188 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y) | |
189 ; CHECK-NEXT: call float @llvm.minnum.f32(float %a, float %z) | |
190 ; CHECK-NEXT: ret float | |
191 define float @minnum_minnum_x_y_z(float %x, float %y, float %z) #0 { | |
192 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
193 %b = call float @llvm.minnum.f32(float %a, float %z) #0 | |
194 ret float %b | |
195 } | |
196 | |
197 ; CHECK-LABEL: @minnum4 | |
198 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float %y) | |
199 ; CHECK-NEXT: call float @llvm.minnum.f32(float %z, float %w) | |
200 ; CHECK-NEXT: call float @llvm.minnum.f32(float %a, float %b) | |
201 ; CHECK-NEXT: ret float | |
202 define float @minnum4(float %x, float %y, float %z, float %w) #0 { | |
203 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
204 %b = call float @llvm.minnum.f32(float %z, float %w) #0 | |
205 %c = call float @llvm.minnum.f32(float %a, float %b) #0 | |
206 ret float %c | |
207 } | |
208 | |
209 ; CHECK-LABEL: @minnum_x_maxnum_x_y | |
210 ; CHECK-NEXT: call float @llvm.maxnum.f32 | |
211 ; CHECK-NEXT: call float @llvm.minnum.f32 | |
212 ; CHECK-NEXT: ret float | |
213 define float @minnum_x_maxnum_x_y(float %x, float %y) #0 { | |
214 %a = call float @llvm.maxnum.f32(float %x, float %y) #0 | |
215 %b = call float @llvm.minnum.f32(float %x, float %a) #0 | |
216 ret float %b | |
217 } | |
218 | |
219 ; CHECK-LABEL: @maxnum_x_minnum_x_y | |
220 ; CHECK-NEXT: call float @llvm.minnum.f32 | |
221 ; CHECK-NEXT: call float @llvm.maxnum.f32 | |
222 ; CHECK-NEXT: ret float | |
223 define float @maxnum_x_minnum_x_y(float %x, float %y) #0 { | |
224 %a = call float @llvm.minnum.f32(float %x, float %y) #0 | |
225 %b = call float @llvm.maxnum.f32(float %x, float %a) #0 | |
226 ret float %b | |
227 } | |
228 | |
229 ; CHECK-LABEL: @fold_minnum_f32_inf_val | |
230 ; CHECK-NEXT: call float @llvm.minnum.f32(float %x, float 0x7FF0000000000000) | |
231 ; CHECK-NEXT: ret float | |
232 define float @fold_minnum_f32_inf_val(float %x) nounwind { | |
233 %val = call float @llvm.minnum.f32(float 0x7FF0000000000000, float %x) #0 | |
234 ret float %val | |
235 } | |
236 | |
237 ; CHECK-LABEL: @fold_minnum_f32_minf_val | |
238 ; CHECK-NEXT: ret float 0xFFF0000000000000 | |
239 define float @fold_minnum_f32_minf_val(float %x) nounwind { | |
240 %val = call float @llvm.minnum.f32(float 0xFFF0000000000000, float %x) #0 | |
241 ret float %val | |
242 } | |
243 | |
244 attributes #0 = { nounwind readnone } |