@@ -256,19 +256,54 @@ define double @select_fcmp_ole_zero(double %x) {
256256; CHECK-LABEL: @select_fcmp_ole_zero(
257257; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
258258; CHECK-NEXT: ret double [[FABS]]
259+ ;
260+ %lezero = fcmp nnan ole double %x , 0 .0
261+ %negx = fsub double 0 .0 , %x
262+ %fabs = select i1 %lezero , double %negx , double %x
263+ ret double %fabs
264+ }
265+
266+ define double @select_fcmp_ole_zero_no_nnan (double %x ) {
267+ ; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan(
268+ ; CHECK-NEXT: [[LEZERO:%.*]] = fcmp ole double [[X:%.*]], 0.000000e+00
269+ ; CHECK-NEXT: [[NEGX:%.*]] = fsub double 0.000000e+00, [[X]]
270+ ; CHECK-NEXT: [[FABS:%.*]] = select i1 [[LEZERO]], double [[NEGX]], double [[X]]
271+ ; CHECK-NEXT: ret double [[FABS]]
259272;
260273 %lezero = fcmp ole double %x , 0 .0
261274 %negx = fsub double 0 .0 , %x
262275 %fabs = select i1 %lezero , double %negx , double %x
263276 ret double %fabs
264277}
265278
279+ define double @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan (double nofpclass(nan) %x ) {
280+ ; CHECK-LABEL: @select_fcmp_ole_zero_no_nnan_input_nofpclass_nan(
281+ ; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
282+ ; CHECK-NEXT: ret double [[FABS]]
283+ ;
284+ %lezero = fcmp ole double %x , 0 .0
285+ %negx = fsub double 0 .0 , %x
286+ %fabs = select i1 %lezero , double %negx , double %x
287+ ret double %fabs
288+ }
289+
290+ define double @select_fcmp_ole_zero_select_nnan (double %x ) {
291+ ; CHECK-LABEL: @select_fcmp_ole_zero_select_nnan(
292+ ; CHECK-NEXT: [[FABS:%.*]] = call nnan double @llvm.fabs.f64(double [[X:%.*]])
293+ ; CHECK-NEXT: ret double [[FABS]]
294+ ;
295+ %lezero = fcmp ole double %x , 0 .0
296+ %negx = fsub double 0 .0 , %x
297+ %fabs = select nnan i1 %lezero , double %negx , double %x
298+ ret double %fabs
299+ }
300+
266301define double @select_fcmp_nnan_ole_zero (double %x ) {
267302; CHECK-LABEL: @select_fcmp_nnan_ole_zero(
268303; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
269304; CHECK-NEXT: ret double [[FABS]]
270305;
271- %lezero = fcmp ole double %x , 0 .0
306+ %lezero = fcmp nnan ole double %x , 0 .0
272307 %negx = fsub nnan double 0 .0 , %x
273308 %fabs = select i1 %lezero , double %negx , double %x
274309 ret double %fabs
@@ -279,7 +314,7 @@ define double @select_nnan_fcmp_nnan_ole_zero(double %x) {
279314; CHECK-NEXT: [[FABS:%.*]] = call nnan double @llvm.fabs.f64(double [[X:%.*]])
280315; CHECK-NEXT: ret double [[FABS]]
281316;
282- %lezero = fcmp ole double %x , 0 .0
317+ %lezero = fcmp nnan ole double %x , 0 .0
283318 %negx = fsub nnan double 0 .0 , %x
284319 %fabs = select nnan i1 %lezero , double %negx , double %x
285320 ret double %fabs
@@ -292,7 +327,7 @@ define double @select_fcmp_nnan_ule_zero(double %x) {
292327; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
293328; CHECK-NEXT: ret double [[FABS]]
294329;
295- %lezero = fcmp ule double %x , 0 .0
330+ %lezero = fcmp nnan ule double %x , 0 .0
296331 %negx = fsub nnan double 0 .0 , %x
297332 %fabs = select i1 %lezero , double %negx , double %x
298333 ret double %fabs
@@ -320,7 +355,7 @@ define <2 x float> @select_fcmp_nnan_ole_negzero(<2 x float> %x) {
320355; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
321356; CHECK-NEXT: ret <2 x float> [[FABS]]
322357;
323- %lezero = fcmp ole <2 x float > %x , <float -0 .0 , float -0 .0 >
358+ %lezero = fcmp nnan ole <2 x float > %x , <float -0 .0 , float -0 .0 >
324359 %negx = fsub nnan <2 x float > <float 0 .0 , float poison>, %x
325360 %fabs = select <2 x i1 > %lezero , <2 x float > %negx , <2 x float > %x
326361 ret <2 x float > %fabs
@@ -331,7 +366,7 @@ define <2 x float> @select_nnan_fcmp_nnan_ole_negzero(<2 x float> %x) {
331366; CHECK-NEXT: [[FABS:%.*]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
332367; CHECK-NEXT: ret <2 x float> [[FABS]]
333368;
334- %lezero = fcmp ole <2 x float > %x , <float -0 .0 , float -0 .0 >
369+ %lezero = fcmp nnan ole <2 x float > %x , <float -0 .0 , float -0 .0 >
335370 %negx = fsub nnan <2 x float > <float 0 .0 , float poison>, %x
336371 %fabs = select nnan <2 x i1 > %lezero , <2 x float > %negx , <2 x float > %x
337372 ret <2 x float > %fabs
@@ -344,7 +379,7 @@ define fp128 @select_fcmp_ogt_zero(fp128 %x) {
344379; CHECK-NEXT: [[FABS:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
345380; CHECK-NEXT: ret fp128 [[FABS]]
346381;
347- %gtzero = fcmp ogt fp128 %x , zeroinitializer
382+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
348383 %negx = fsub fp128 zeroinitializer , %x
349384 %fabs = select i1 %gtzero , fp128 %x , fp128 %negx
350385 ret fp128 %fabs
@@ -382,7 +417,7 @@ define fp128 @select_fcmp_nnan_ogt_zero(fp128 %x) {
382417; CHECK-NEXT: [[FABS:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
383418; CHECK-NEXT: ret fp128 [[FABS]]
384419;
385- %gtzero = fcmp ogt fp128 %x , zeroinitializer
420+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
386421 %negx = fsub nnan fp128 zeroinitializer , %x
387422 %fabs = select i1 %gtzero , fp128 %x , fp128 %negx
388423 ret fp128 %fabs
@@ -393,7 +428,7 @@ define fp128 @select_nnan_fcmp_nnan_ogt_zero(fp128 %x) {
393428; CHECK-NEXT: [[FABS:%.*]] = call nnan fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
394429; CHECK-NEXT: ret fp128 [[FABS]]
395430;
396- %gtzero = fcmp ogt fp128 %x , zeroinitializer
431+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
397432 %negx = fsub nnan fp128 zeroinitializer , %x
398433 %fabs = select nnan i1 %gtzero , fp128 %x , fp128 %negx
399434 ret fp128 %fabs
@@ -406,7 +441,7 @@ define half @select_fcmp_nnan_ogt_negzero(half %x) {
406441; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
407442; CHECK-NEXT: ret half [[FABS]]
408443;
409- %gtzero = fcmp ogt half %x , -0 .0
444+ %gtzero = fcmp nnan ogt half %x , -0 .0
410445 %negx = fsub nnan half 0 .0 , %x
411446 %fabs = select i1 %gtzero , half %x , half %negx
412447 ret half %fabs
@@ -417,7 +452,7 @@ define half @select_nnan_fcmp_nnan_ogt_negzero(half %x) {
417452; CHECK-NEXT: [[FABS:%.*]] = call nnan half @llvm.fabs.f16(half [[X:%.*]])
418453; CHECK-NEXT: ret half [[FABS]]
419454;
420- %gtzero = fcmp ogt half %x , -0 .0
455+ %gtzero = fcmp nnan ogt half %x , -0 .0
421456 %negx = fsub nnan half 0 .0 , %x
422457 %fabs = select nnan i1 %gtzero , half %x , half %negx
423458 ret half %fabs
@@ -430,7 +465,7 @@ define half @select_fcmp_nnan_ugt_negzero(half %x) {
430465; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
431466; CHECK-NEXT: ret half [[FABS]]
432467;
433- %gtzero = fcmp ugt half %x , -0 .0
468+ %gtzero = fcmp nnan ugt half %x , -0 .0
434469 %negx = fsub nnan half 0 .0 , %x
435470 %fabs = select i1 %gtzero , half %x , half %negx
436471 ret half %fabs
0 commit comments