Index: llvm/lib/Analysis/InstructionSimplify.cpp =================================================================== --- llvm/lib/Analysis/InstructionSimplify.cpp +++ llvm/lib/Analysis/InstructionSimplify.cpp @@ -3477,7 +3477,8 @@ if (match(RHS, m_AnyZeroFP())) { switch (Pred) { case FCmpInst::FCMP_OGE: - if (FMF.noNaNs() && CannotBeOrderedLessThanZero(LHS, Q.TLI)) + if (isKnownNeverNaN(LHS, Q.TLI) && + CannotBeOrderedLessThanZero(LHS, Q.TLI)) return getTrue(RetTy); break; case FCmpInst::FCMP_UGE: @@ -3485,6 +3486,7 @@ return getTrue(RetTy); break; case FCmpInst::FCMP_ULT: + // TODO: This should match 'oge'. if (FMF.noNaNs() && CannotBeOrderedLessThanZero(LHS, Q.TLI)) return getFalse(RetTy); break; Index: llvm/test/Transforms/InstSimplify/floating-point-compare.ll =================================================================== --- llvm/test/Transforms/InstSimplify/floating-point-compare.ll +++ llvm/test/Transforms/InstSimplify/floating-point-compare.ll @@ -257,9 +257,7 @@ define i1 @UIToFP_is_positive_or_zero(i32 %x) { ; CHECK-LABEL: @UIToFP_is_positive_or_zero( -; CHECK-NEXT: [[A:%.*]] = uitofp i32 [[X:%.*]] to float -; CHECK-NEXT: [[R:%.*]] = fcmp oge float [[A]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = uitofp i32 %x to float %r = fcmp oge float %a, 0.000000e+00 @@ -268,9 +266,7 @@ define <2 x i1> @UIToFP_is_positive_or_zero_vec(<2 x i32> %x) { ; CHECK-LABEL: @UIToFP_is_positive_or_zero_vec( -; CHECK-NEXT: [[A:%.*]] = uitofp <2 x i32> [[X:%.*]] to <2 x float> -; CHECK-NEXT: [[R:%.*]] = fcmp oge <2 x float> [[A]], zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[R]] +; CHECK-NEXT: ret <2 x i1> ; %a = uitofp <2 x i32> %x to <2 x float> %r = fcmp oge <2 x float> %a, zeroinitializer @@ -351,9 +347,7 @@ define i1 @fabs_nnan_is_positive_or_zero(double %x) { ; CHECK-LABEL: @fabs_nnan_is_positive_or_zero( -; CHECK-NEXT: [[FABS:%.*]] = tail call nnan double @llvm.fabs.f64(double [[X:%.*]]) -; CHECK-NEXT: [[CMP:%.*]] = fcmp oge double [[FABS]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: ret i1 true ; %fabs = tail call nnan double @llvm.fabs.f64(double %x) %cmp = fcmp oge double %fabs, 0.0 @@ -362,9 +356,7 @@ define <2 x i1> @fabs_nnan_is_positive_or_zero_vec(<2 x double> %x) { ; CHECK-LABEL: @fabs_nnan_is_positive_or_zero_vec( -; CHECK-NEXT: [[FABS:%.*]] = tail call nnan <2 x double> @llvm.fabs.v2f64(<2 x double> [[X:%.*]]) -; CHECK-NEXT: [[CMP:%.*]] = fcmp oge <2 x double> [[FABS]], zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[CMP]] +; CHECK-NEXT: ret <2 x i1> ; %fabs = tail call nnan <2 x double> @llvm.fabs.v2f64(<2 x double> %x) %cmp = fcmp oge <2 x double> %fabs, zeroinitializer @@ -373,7 +365,9 @@ define i1 @fabs_fcmp-nnan_is_positive_or_zero(double %x) { ; CHECK-LABEL: @fabs_fcmp-nnan_is_positive_or_zero( -; CHECK-NEXT: ret i1 true +; CHECK-NEXT: [[FABS:%.*]] = tail call double @llvm.fabs.f64(double [[X:%.*]]) +; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge double [[FABS]], 0.000000e+00 +; CHECK-NEXT: ret i1 [[CMP]] ; %fabs = tail call double @llvm.fabs.f64(double %x) %cmp = fcmp nnan oge double %fabs, 0.0 @@ -382,7 +376,9 @@ define <2 x i1> @fabs_fcmp-nnan_is_positive_or_zero_vec(<2 x double> %x) { ; CHECK-LABEL: @fabs_fcmp-nnan_is_positive_or_zero_vec( -; CHECK-NEXT: ret <2 x i1> +; CHECK-NEXT: [[FABS:%.*]] = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> [[X:%.*]]) +; CHECK-NEXT: [[CMP:%.*]] = fcmp nnan oge <2 x double> [[FABS]], zeroinitializer +; CHECK-NEXT: ret <2 x i1> [[CMP]] ; %fabs = tail call <2 x double> @llvm.fabs.v2f64(<2 x double> %x) %cmp = fcmp nnan oge <2 x double> %fabs, zeroinitializer