[llvm] 41dd02e - ValueTracking: Teach isKnownNeverInfinity about min/max functions

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 20 09:53:06 PST 2022


Author: Matt Arsenault
Date: 2022-12-20T12:52:59-05:00
New Revision: 41dd02e8575144e576e9ad111bbdc3f856c58445

URL: https://github.com/llvm/llvm-project/commit/41dd02e8575144e576e9ad111bbdc3f856c58445
DIFF: https://github.com/llvm/llvm-project/commit/41dd02e8575144e576e9ad111bbdc3f856c58445.diff

LOG: ValueTracking: Teach isKnownNeverInfinity about min/max functions

Added: 
    

Modified: 
    llvm/lib/Analysis/ValueTracking.cpp
    llvm/test/Transforms/InstSimplify/floating-point-compare.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index c25506e5030f..4181831c284c 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -3822,6 +3822,12 @@ bool llvm::isKnownNeverInfinity(const Value *V, const TargetLibraryInfo *TLI,
       case Intrinsic::fptrunc_round:
         // Requires knowing the value range.
         return false;
+      case Intrinsic::minnum:
+      case Intrinsic::maxnum:
+      case Intrinsic::minimum:
+      case Intrinsic::maximum:
+        return isKnownNeverInfinity(Inst->getOperand(0), TLI, Depth + 1) &&
+               isKnownNeverInfinity(Inst->getOperand(1), TLI, Depth + 1);
       default:
         break;
       }

diff  --git a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
index a2628d5c777d..019069ae14d1 100644
--- a/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
+++ b/llvm/test/Transforms/InstSimplify/floating-point-compare.ll
@@ -1663,11 +1663,7 @@ define i1 @isKnownNeverInfinity_ceil_x86_fp80(x86_fp80 %x) {
 
 define i1 @isKnownNeverInfinity_minnum(double %x, double %y) {
 ; CHECK-LABEL: @isKnownNeverInfinity_minnum(
-; CHECK-NEXT:    [[NINF_X:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[NINF_Y:%.*]] = fadd ninf double [[Y:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.minnum.f64(double [[NINF_X]], double [[NINF_Y]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 true
 ;
   %ninf.x = fadd ninf double %x, 1.0
   %ninf.y = fadd ninf double %y, 1.0
@@ -1706,11 +1702,7 @@ declare double @llvm.minnum.f64(double, double)
 
 define i1 @isKnownNeverInfinity_maxnum(double %x, double %y) {
 ; CHECK-LABEL: @isKnownNeverInfinity_maxnum(
-; CHECK-NEXT:    [[NINF_X:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[NINF_Y:%.*]] = fadd ninf double [[Y:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.maxnum.f64(double [[NINF_X]], double [[NINF_Y]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 true
 ;
   %ninf.x = fadd ninf double %x, 1.0
   %ninf.y = fadd ninf double %y, 1.0
@@ -1749,11 +1741,7 @@ declare double @llvm.maxnum.f64(double, double)
 
 define i1 @isKnownNeverInfinity_minimum(double %x, double %y) {
 ; CHECK-LABEL: @isKnownNeverInfinity_minimum(
-; CHECK-NEXT:    [[NINF_X:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[NINF_Y:%.*]] = fadd ninf double [[Y:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.minimum.f64(double [[NINF_X]], double [[NINF_Y]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 true
 ;
   %ninf.x = fadd ninf double %x, 1.0
   %ninf.y = fadd ninf double %y, 1.0
@@ -1792,11 +1780,7 @@ declare double @llvm.minimum.f64(double, double)
 
 define i1 @isKnownNeverInfinity_maximum(double %x, double %y) {
 ; CHECK-LABEL: @isKnownNeverInfinity_maximum(
-; CHECK-NEXT:    [[NINF_X:%.*]] = fadd ninf double [[X:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[NINF_Y:%.*]] = fadd ninf double [[Y:%.*]], 1.000000e+00
-; CHECK-NEXT:    [[OP:%.*]] = call double @llvm.maximum.f64(double [[NINF_X]], double [[NINF_Y]])
-; CHECK-NEXT:    [[CMP:%.*]] = fcmp une double [[OP]], 0x7FF0000000000000
-; CHECK-NEXT:    ret i1 [[CMP]]
+; CHECK-NEXT:    ret i1 true
 ;
   %ninf.x = fadd ninf double %x, 1.0
   %ninf.y = fadd ninf double %y, 1.0


        


More information about the llvm-commits mailing list