diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 47369db4b46..ad9d40b6c12 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -3486,8 +3486,8 @@ static Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, return getTrue(RetTy); break; case FCmpInst::FCMP_ULT: - // TODO: This should match 'oge'. - if (FMF.noNaNs() && CannotBeOrderedLessThanZero(LHS, Q.TLI)) + if ((FMF.noNaNs() || isKnownNeverNaN(LHS, Q.TLI)) && + CannotBeOrderedLessThanZero(LHS, Q.TLI)) return getFalse(RetTy); break; case FCmpInst::FCMP_OLT: diff --git a/test/Transforms/InstSimplify/floating-point-compare.ll b/test/Transforms/InstSimplify/floating-point-compare.ll index b02248d3afc..c44ce6988b4 100644 --- a/test/Transforms/InstSimplify/floating-point-compare.ll +++ b/test/Transforms/InstSimplify/floating-point-compare.ll @@ -313,9 +313,7 @@ define <2 x i1> @UIToFP_is_not_negative_vec(<2 x i32> %x) { define i1 @UIToFP_is_not_negative_or_nan(i32 %x) { ; CHECK-LABEL: @UIToFP_is_not_negative_or_nan( -; CHECK-NEXT: [[A:%.*]] = uitofp i32 [[X:%.*]] to float -; CHECK-NEXT: [[R:%.*]] = fcmp ult float [[A]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 false ; %a = uitofp i32 %x to float %r = fcmp ult float %a, 0.000000e+00 @@ -324,9 +322,7 @@ define i1 @UIToFP_is_not_negative_or_nan(i32 %x) { define <2 x i1> @UIToFP_is_not_negative_or_nan_vec(<2 x i32> %x) { ; CHECK-LABEL: @UIToFP_is_not_negative_or_nan_vec( -; CHECK-NEXT: [[A:%.*]] = uitofp <2 x i32> [[X:%.*]] to <2 x float> -; CHECK-NEXT: [[R:%.*]] = fcmp ult <2 x float> [[A]], zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[R]] +; CHECK-NEXT: ret <2 x i1> zeroinitializer ; %a = uitofp <2 x i32> %x to <2 x float> %r = fcmp ult <2 x float> %a, zeroinitializer @@ -425,9 +421,7 @@ define <2 x i1> @fabs_is_not_negative_vec(<2 x double> %x) { define i1 @fabs_nnan_is_not_negative(double %x) { ; CHECK-LABEL: @fabs_nnan_is_not_negative( -; CHECK-NEXT: [[FABS:%.*]] = tail call nnan double @llvm.fabs.f64(double [[X:%.*]]) -; CHECK-NEXT: [[CMP:%.*]] = fcmp ult double [[FABS]], 0.000000e+00 -; CHECK-NEXT: ret i1 [[CMP]] +; CHECK-NEXT: ret i1 false ; %fabs = tail call nnan double @llvm.fabs.f64(double %x) %cmp = fcmp ult double %fabs, 0.0 @@ -436,9 +430,7 @@ define i1 @fabs_nnan_is_not_negative(double %x) { define <2 x i1> @fabs_nnan_is_not_negative_vec(<2 x double> %x) { ; CHECK-LABEL: @fabs_nnan_is_not_negative_vec( -; CHECK-NEXT: [[FABS:%.*]] = tail call nnan <2 x double> @llvm.fabs.v2f64(<2 x double> [[X:%.*]]) -; CHECK-NEXT: [[CMP:%.*]] = fcmp ult <2 x double> [[FABS]], zeroinitializer -; CHECK-NEXT: ret <2 x i1> [[CMP]] +; CHECK-NEXT: ret <2 x i1> zeroinitializer ; %fabs = tail call nnan <2 x double> @llvm.fabs.v2f64(<2 x double> %x) %cmp = fcmp ult <2 x double> %fabs, zeroinitializer