Index: llvm/lib/Analysis/ValueTracking.cpp =================================================================== --- llvm/lib/Analysis/ValueTracking.cpp +++ llvm/lib/Analysis/ValueTracking.cpp @@ -3811,7 +3811,17 @@ case Intrinsic::canonicalize: case Intrinsic::copysign: case Intrinsic::arithmetic_fence: + case Intrinsic::floor: + case Intrinsic::ceil: + case Intrinsic::trunc: + case Intrinsic::rint: + case Intrinsic::nearbyint: + case Intrinsic::round: + case Intrinsic::roundeven: return isKnownNeverInfinity(Inst->getOperand(0), TLI, Depth + 1); + case Intrinsic::fptrunc_round: + // Requires knowing the value range. + return false; default: 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 @@ -1373,10 +1373,7 @@ define i1 @isKnownNeverInfinity_floor(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_floor( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.floor.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.floor.f64(double %a) @@ -1399,10 +1396,7 @@ define i1 @isKnownNeverInfinity_ceil(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_ceil( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.ceil.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.ceil.f64(double %a) @@ -1425,10 +1419,7 @@ define i1 @isKnownNeverInfinity_trunc(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_trunc( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.trunc.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.trunc.f64(double %a) @@ -1451,10 +1442,7 @@ define i1 @isKnownNeverInfinity_rint(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_rint( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.rint.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.rint.f64(double %a) @@ -1477,10 +1465,7 @@ define i1 @isKnownNeverInfinity_nearbyint(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_nearbyint( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.nearbyint.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.nearbyint.f64(double %a) @@ -1503,10 +1488,7 @@ define i1 @isKnownNeverInfinity_round(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_round( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.round.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.round.f64(double %a) @@ -1529,10 +1511,7 @@ define i1 @isKnownNeverInfinity_roundeven(double %x) { ; CHECK-LABEL: @isKnownNeverInfinity_roundeven( -; CHECK-NEXT: [[A:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00 -; CHECK-NEXT: [[E:%.*]] = call double @llvm.roundeven.f64(double [[A]]) -; CHECK-NEXT: [[R:%.*]] = fcmp une double [[E]], 0x7FF0000000000000 -; CHECK-NEXT: ret i1 [[R]] +; CHECK-NEXT: ret i1 true ; %a = fadd ninf double %x, 1.0 %e = call double @llvm.roundeven.f64(double %a)