@@ -256,6 +256,19 @@ 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
@@ -268,7 +281,7 @@ define double @select_fcmp_nnan_ole_zero(double %x) {
268281; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
269282; CHECK-NEXT: ret double [[FABS]]
270283;
271- %lezero = fcmp ole double %x , 0 .0
284+ %lezero = fcmp nnan ole double %x , 0 .0
272285 %negx = fsub nnan double 0 .0 , %x
273286 %fabs = select i1 %lezero , double %negx , double %x
274287 ret double %fabs
@@ -279,7 +292,7 @@ define double @select_nnan_fcmp_nnan_ole_zero(double %x) {
279292; CHECK-NEXT: [[FABS:%.*]] = call nnan double @llvm.fabs.f64(double [[X:%.*]])
280293; CHECK-NEXT: ret double [[FABS]]
281294;
282- %lezero = fcmp ole double %x , 0 .0
295+ %lezero = fcmp nnan ole double %x , 0 .0
283296 %negx = fsub nnan double 0 .0 , %x
284297 %fabs = select nnan i1 %lezero , double %negx , double %x
285298 ret double %fabs
@@ -292,7 +305,7 @@ define double @select_fcmp_nnan_ule_zero(double %x) {
292305; CHECK-NEXT: [[FABS:%.*]] = call double @llvm.fabs.f64(double [[X:%.*]])
293306; CHECK-NEXT: ret double [[FABS]]
294307;
295- %lezero = fcmp ule double %x , 0 .0
308+ %lezero = fcmp nnan ule double %x , 0 .0
296309 %negx = fsub nnan double 0 .0 , %x
297310 %fabs = select i1 %lezero , double %negx , double %x
298311 ret double %fabs
@@ -320,7 +333,7 @@ define <2 x float> @select_fcmp_nnan_ole_negzero(<2 x float> %x) {
320333; CHECK-NEXT: [[FABS:%.*]] = call <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
321334; CHECK-NEXT: ret <2 x float> [[FABS]]
322335;
323- %lezero = fcmp ole <2 x float > %x , <float -0 .0 , float -0 .0 >
336+ %lezero = fcmp nnan ole <2 x float > %x , <float -0 .0 , float -0 .0 >
324337 %negx = fsub nnan <2 x float > <float 0 .0 , float poison>, %x
325338 %fabs = select <2 x i1 > %lezero , <2 x float > %negx , <2 x float > %x
326339 ret <2 x float > %fabs
@@ -331,7 +344,7 @@ define <2 x float> @select_nnan_fcmp_nnan_ole_negzero(<2 x float> %x) {
331344; CHECK-NEXT: [[FABS:%.*]] = call nnan <2 x float> @llvm.fabs.v2f32(<2 x float> [[X:%.*]])
332345; CHECK-NEXT: ret <2 x float> [[FABS]]
333346;
334- %lezero = fcmp ole <2 x float > %x , <float -0 .0 , float -0 .0 >
347+ %lezero = fcmp nnan ole <2 x float > %x , <float -0 .0 , float -0 .0 >
335348 %negx = fsub nnan <2 x float > <float 0 .0 , float poison>, %x
336349 %fabs = select nnan <2 x i1 > %lezero , <2 x float > %negx , <2 x float > %x
337350 ret <2 x float > %fabs
@@ -344,7 +357,7 @@ define fp128 @select_fcmp_ogt_zero(fp128 %x) {
344357; CHECK-NEXT: [[FABS:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
345358; CHECK-NEXT: ret fp128 [[FABS]]
346359;
347- %gtzero = fcmp ogt fp128 %x , zeroinitializer
360+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
348361 %negx = fsub fp128 zeroinitializer , %x
349362 %fabs = select i1 %gtzero , fp128 %x , fp128 %negx
350363 ret fp128 %fabs
@@ -382,7 +395,7 @@ define fp128 @select_fcmp_nnan_ogt_zero(fp128 %x) {
382395; CHECK-NEXT: [[FABS:%.*]] = call fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
383396; CHECK-NEXT: ret fp128 [[FABS]]
384397;
385- %gtzero = fcmp ogt fp128 %x , zeroinitializer
398+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
386399 %negx = fsub nnan fp128 zeroinitializer , %x
387400 %fabs = select i1 %gtzero , fp128 %x , fp128 %negx
388401 ret fp128 %fabs
@@ -393,7 +406,7 @@ define fp128 @select_nnan_fcmp_nnan_ogt_zero(fp128 %x) {
393406; CHECK-NEXT: [[FABS:%.*]] = call nnan fp128 @llvm.fabs.f128(fp128 [[X:%.*]])
394407; CHECK-NEXT: ret fp128 [[FABS]]
395408;
396- %gtzero = fcmp ogt fp128 %x , zeroinitializer
409+ %gtzero = fcmp nnan ogt fp128 %x , zeroinitializer
397410 %negx = fsub nnan fp128 zeroinitializer , %x
398411 %fabs = select nnan i1 %gtzero , fp128 %x , fp128 %negx
399412 ret fp128 %fabs
@@ -406,7 +419,7 @@ define half @select_fcmp_nnan_ogt_negzero(half %x) {
406419; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
407420; CHECK-NEXT: ret half [[FABS]]
408421;
409- %gtzero = fcmp ogt half %x , -0 .0
422+ %gtzero = fcmp nnan ogt half %x , -0 .0
410423 %negx = fsub nnan half 0 .0 , %x
411424 %fabs = select i1 %gtzero , half %x , half %negx
412425 ret half %fabs
@@ -417,7 +430,7 @@ define half @select_nnan_fcmp_nnan_ogt_negzero(half %x) {
417430; CHECK-NEXT: [[FABS:%.*]] = call nnan half @llvm.fabs.f16(half [[X:%.*]])
418431; CHECK-NEXT: ret half [[FABS]]
419432;
420- %gtzero = fcmp ogt half %x , -0 .0
433+ %gtzero = fcmp nnan ogt half %x , -0 .0
421434 %negx = fsub nnan half 0 .0 , %x
422435 %fabs = select nnan i1 %gtzero , half %x , half %negx
423436 ret half %fabs
@@ -430,7 +443,7 @@ define half @select_fcmp_nnan_ugt_negzero(half %x) {
430443; CHECK-NEXT: [[FABS:%.*]] = call half @llvm.fabs.f16(half [[X:%.*]])
431444; CHECK-NEXT: ret half [[FABS]]
432445;
433- %gtzero = fcmp ugt half %x , -0 .0
446+ %gtzero = fcmp nnan ugt half %x , -0 .0
434447 %negx = fsub nnan half 0 .0 , %x
435448 %fabs = select i1 %gtzero , half %x , half %negx
436449 ret half %fabs
0 commit comments