Skip to content
This repository was archived by the owner on Mar 28, 2020. It is now read-only.

Commit 1ef057d

Browse files
committed
[InstSimplify] fold 'fcmp nnan oge X, 0.0' when X is not negative
This re-raises some of the open questions about how to apply and use fast-math-flags in IR from PR38086: https://bugs.llvm.org/show_bug.cgi?id=38086 ...but given the current implementation (no FMF on casts), this is likely the only way to predicate the transform. This is part of solving PR39475: https://bugs.llvm.org/show_bug.cgi?id=39475 Differential Revision: https://reviews.llvm.org/D53874 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@345725 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent 2f9c8a0 commit 1ef057d

File tree

3 files changed

+11
-14
lines changed

3 files changed

+11
-14
lines changed

lib/Analysis/InstructionSimplify.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3612,6 +3612,10 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
36123612
}
36133613
if (C->isZero()) {
36143614
switch (Pred) {
3615+
case FCmpInst::FCMP_OGE:
3616+
if (FMF.noNaNs() && CannotBeOrderedLessThanZero(LHS, Q.TLI))
3617+
return getTrue(RetTy);
3618+
break;
36153619
case FCmpInst::FCMP_UGE:
36163620
if (CannotBeOrderedLessThanZero(LHS, Q.TLI))
36173621
return getTrue(RetTy);

lib/Transforms/InstCombine/InstCombineCompares.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5433,15 +5433,16 @@ Instruction *InstCombiner::visitFCmpInst(FCmpInst &I) {
54335433
break;
54345434
// fabs(x) < 0 --> false
54355435
case FCmpInst::FCMP_OLT:
5436-
llvm_unreachable("handled by SimplifyFCmpInst");
5437-
// fabs(x) > 0 --> x != 0
5436+
llvm_unreachable("fcmp should have simplified");
5437+
// fabs(x) > 0 --> x != 0
54385438
case FCmpInst::FCMP_OGT:
54395439
return new FCmpInst(FCmpInst::FCMP_ONE, CI->getArgOperand(0), RHSC);
54405440
// fabs(x) <= 0 --> x == 0
54415441
case FCmpInst::FCMP_OLE:
54425442
return new FCmpInst(FCmpInst::FCMP_OEQ, CI->getArgOperand(0), RHSC);
54435443
// fabs(x) >= 0 --> !isnan(x)
54445444
case FCmpInst::FCMP_OGE:
5445+
assert(!I.hasNoNaNs() && "fcmp should have simplified");
54455446
return new FCmpInst(FCmpInst::FCMP_ORD, CI->getArgOperand(0), RHSC);
54465447
// fabs(x) == 0 --> x == 0
54475448
// fabs(x) != 0 --> x != 0

test/Transforms/InstSimplify/floating-point-compare.ll

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,7 @@ define <2 x i1> @UIToFP_is_nan_or_positive_or_zero_vec(<2 x i32> %x) {
254254

255255
define i1 @UIToFP_nnan_is_positive_or_zero(i32 %x) {
256256
; CHECK-LABEL: @UIToFP_nnan_is_positive_or_zero(
257-
; CHECK-NEXT: [[A:%.*]] = uitofp i32 [[X:%.*]] to float
258-
; CHECK-NEXT: [[R:%.*]] = fcmp nnan oge float [[A]], 0.000000e+00
259-
; CHECK-NEXT: ret i1 [[R]]
257+
; CHECK-NEXT: ret i1 true
260258
;
261259
%a = uitofp i32 %x to float
262260
%r = fcmp nnan oge float %a, 0.000000e+00
@@ -265,9 +263,7 @@ define i1 @UIToFP_nnan_is_positive_or_zero(i32 %x) {
265263

266264
define <2 x i1> @UIToFP_nnan_is_positive_or_zero_vec(<2 x i32> %x) {
267265
; CHECK-LABEL: @UIToFP_nnan_is_positive_or_zero_vec(
268-
; CHECK-NEXT: [[A:%.*]] = uitofp <2 x i32> [[X:%.*]] to <2 x float>
269-
; CHECK-NEXT: [[R:%.*]] = fcmp nnan oge <2 x float> [[A]], zeroinitializer
270-
; CHECK-NEXT: ret <2 x i1> [[R]]
266+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
271267
;
272268
%a = uitofp <2 x i32> %x to <2 x float>
273269
%r = fcmp nnan oge <2 x float> %a, zeroinitializer
@@ -334,9 +330,7 @@ define <2 x i1> @fabs_is_nan_or_positive_or_zero_vec(<2 x double> %x) {
334330

335331
define i1 @fabs_nnan_is_positive_or_zero(double %x) {
336332
; CHECK-LABEL: @fabs_nnan_is_positive_or_zero(
337-
; CHECK-NEXT: [[FABS:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]])
338-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge double [[FABS]], 0.000000e+00
339-
; CHECK-NEXT: ret i1 [[CMP]]
333+
; CHECK-NEXT: ret i1 true
340334
;
341335
%fabs = tail call double @llvm.fabs.f64(double %x)
342336
%cmp = fcmp nnan oge double %fabs, 0.0
@@ -345,9 +339,7 @@ define i1 @fabs_nnan_is_positive_or_zero(double %x) {
345339

346340
define <2 x i1> @fabs_nnan_is_positive_or_zero_vec(<2 x double> %x) {
347341
; CHECK-LABEL: @fabs_nnan_is_positive_or_zero_vec(
348-
; CHECK-NEXT: [[FABS:%.*]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> [[X:%.*]])
349-
; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <2 x double> [[FABS]], zeroinitializer
350-
; CHECK-NEXT: ret <2 x i1> [[CMP]]
342+
; CHECK-NEXT: ret <2 x i1> <i1 true, i1 true>
351343
;
352344
%fabs = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %x)
353345
%cmp = fcmp nnan oge <2 x double> %fabs, zeroinitializer

0 commit comments

Comments
 (0)