ValueTracking: Teach isKnownNeverInfinity about min/max functions
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sun, 4 Dec 2022 14:18:49 +0000 (09:18 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Tue, 20 Dec 2022 17:52:59 +0000 (12:52 -0500)
llvm/lib/Analysis/ValueTracking.cpp
llvm/test/Transforms/InstSimplify/floating-point-compare.ll

index c25506e..4181831 100644 (file)
@@ -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;
       }
index a2628d5..019069a 100644 (file)
@@ -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