Skip to content

Commit da81f91

Browse files
committed
Add f[min][max]imum_num libcalls to remaining analyses
1 parent a486253 commit da81f91

File tree

7 files changed

+60
-10
lines changed

7 files changed

+60
-10
lines changed

llvm/include/llvm/Analysis/TargetLibraryInfo.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,10 @@ class TargetLibraryInfo {
410410
case LibFunc_floor: case LibFunc_floorf: case LibFunc_floorl:
411411
case LibFunc_fmax: case LibFunc_fmaxf: case LibFunc_fmaxl:
412412
case LibFunc_fmin: case LibFunc_fminf: case LibFunc_fminl:
413+
case LibFunc_fmaximum_num: case LibFunc_fmaximum_numf:
414+
case LibFunc_fmaximum_numl:
415+
case LibFunc_fminimum_num: case LibFunc_fminimum_numf:
416+
case LibFunc_fminimum_numl:
413417
case LibFunc_ldexp: case LibFunc_ldexpf: case LibFunc_ldexpl:
414418
case LibFunc_log2: case LibFunc_log2f: case LibFunc_log2l:
415419
case LibFunc_memcmp: case LibFunc_bcmp: case LibFunc_strcmp:

llvm/include/llvm/Transforms/Utils/SimplifyLibCalls.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ class LibCallSimplifier {
205205
Value *replacePowWithSqrt(CallInst *Pow, IRBuilderBase &B);
206206
Value *optimizeExp2(CallInst *CI, IRBuilderBase &B);
207207
Value *optimizeFMinFMax(CallInst *CI, IRBuilderBase &B);
208+
Value *optimizeFMinimumnumFMaximumnum(CallInst *CI, IRBuilderBase &B);
208209
Value *optimizeLog(CallInst *CI, IRBuilderBase &B);
209210
Value *optimizeSqrt(CallInst *CI, IRBuilderBase &B);
210211
Value *optimizeFMod(CallInst *CI, IRBuilderBase &B);

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4680,6 +4680,14 @@ Intrinsic::ID llvm::getIntrinsicForCallSite(const CallBase &CB,
46804680
case LibFunc_fmaxf:
46814681
case LibFunc_fmaxl:
46824682
return Intrinsic::maxnum;
4683+
case LibFunc_fminimum_num:
4684+
case LibFunc_fminimum_numf:
4685+
case LibFunc_fminimum_numl:
4686+
return Intrinsic::minimumnum;
4687+
case LibFunc_fmaximum_num:
4688+
case LibFunc_fmaximum_numf:
4689+
case LibFunc_fmaximum_numl:
4690+
return Intrinsic::maximumnum;
46834691
case LibFunc_copysign:
46844692
case LibFunc_copysignf:
46854693
case LibFunc_copysignl:

llvm/lib/Transforms/Instrumentation/NumericalStabilitySanitizer.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,12 @@ const KnownIntrinsic::LFEntry KnownIntrinsic::kLibfuncIntrinsics[] = {
14991499
{LibFunc_fminf, "llvm.minnum.f32"},
15001500
{LibFunc_fmin, "llvm.minnum.f64"},
15011501
{LibFunc_fminl, "llvm.minnum.f80"},
1502+
{LibFunc_fmaximum_numf, "llvm.maximumnum.f32"},
1503+
{LibFunc_fmaximum_num, "llvm.maximumnum.f64"},
1504+
{LibFunc_fmaximum_numl, "llvm.maximumnum.f80"},
1505+
{LibFunc_fminimum_numf, "llvm.minimumnum.f32"},
1506+
{LibFunc_fminimum_num, "llvm.minimumnum.f64"},
1507+
{LibFunc_fminimum_numl, "llvm.minimumnum.f80"},
15021508
{LibFunc_ceilf, "llvm.ceil.f32"},
15031509
{LibFunc_ceil, "llvm.ceil.f64"},
15041510
{LibFunc_ceill, "llvm.ceil.f80"},

llvm/lib/Transforms/Utils/BuildLibCalls.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1353,6 +1353,12 @@ bool llvm::inferNonMandatoryLibFuncAttrs(Function &F,
13531353
case LibFunc_fmin:
13541354
case LibFunc_fminf:
13551355
case LibFunc_fminl:
1356+
case LibFunc_fmaximum_num:
1357+
case LibFunc_fmaximum_numf:
1358+
case LibFunc_fmaximum_numl:
1359+
case LibFunc_fminimum_num:
1360+
case LibFunc_fminimum_numf:
1361+
case LibFunc_fminimum_numl:
13561362
case LibFunc_labs:
13571363
case LibFunc_llabs:
13581364
case LibFunc_nearbyint:

llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2543,6 +2543,30 @@ Value *LibCallSimplifier::optimizeFMinFMax(CallInst *CI, IRBuilderBase &B) {
25432543
CI->getArgOperand(1), FMF));
25442544
}
25452545

2546+
Value *LibCallSimplifier::optimizeFMinimumnumFMaximumnum(CallInst *CI,
2547+
IRBuilderBase &B) {
2548+
Module *M = CI->getModule();
2549+
2550+
// If we can shrink the call to a float function rather than a double
2551+
// function, do that first.
2552+
Function *Callee = CI->getCalledFunction();
2553+
StringRef Name = Callee->getName();
2554+
if ((Name == "fminimum_num" || Name == "fmaximum_num") &&
2555+
hasFloatVersion(M, Name))
2556+
if (Value *Ret = optimizeBinaryDoubleFP(CI, B, TLI))
2557+
return Ret;
2558+
2559+
// The new fminimum_num/fmaximum_num functions, unlike fmin/fmax, *are*
2560+
// sensitive to the sigh of zero, so we don't change the fast-math flags like
2561+
// we did for those.
2562+
2563+
Intrinsic::ID IID = Callee->getName().starts_with("fminimum_num")
2564+
? Intrinsic::minimumnum
2565+
: Intrinsic::maximumnum;
2566+
return copyFlags(*CI, B.CreateBinaryIntrinsic(IID, CI->getArgOperand(0),
2567+
CI->getArgOperand(1), CI));
2568+
}
2569+
25462570
Value *LibCallSimplifier::optimizeLog(CallInst *Log, IRBuilderBase &B) {
25472571
Function *LogFn = Log->getCalledFunction();
25482572
StringRef LogNm = LogFn->getName();
@@ -4123,6 +4147,13 @@ Value *LibCallSimplifier::optimizeFloatingPointLibCall(CallInst *CI,
41234147
case LibFunc_fmax:
41244148
case LibFunc_fmaxl:
41254149
return optimizeFMinFMax(CI, Builder);
4150+
case LibFunc_fminimum_numf:
4151+
case LibFunc_fminimum_num:
4152+
case LibFunc_fminimum_numl:
4153+
case LibFunc_fmaximum_numf:
4154+
case LibFunc_fmaximum_num:
4155+
case LibFunc_fmaximum_numl:
4156+
return optimizeFMinimumnumFMaximumnum(CI, Builder);
41264157
case LibFunc_cabs:
41274158
case LibFunc_cabsf:
41284159
case LibFunc_cabsl:

llvm/test/Transforms/InstCombine/float-shrink-compare.ll

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -465,11 +465,8 @@ define i1 @test18(float %x, float %y, float %z) {
465465

466466
define i1 @test_fminimum_num(float %x, float %y, float %z) {
467467
; CHECK-LABEL: @test_fminimum_num(
468-
; CHECK-NEXT: [[TMP1:%.*]] = fpext float [[X:%.*]] to double
469-
; CHECK-NEXT: [[TMP2:%.*]] = fpext float [[Y:%.*]] to double
470-
; CHECK-NEXT: [[TMP3:%.*]] = call double @fminimum_num(double [[TMP1]], double [[TMP2]]) #[[ATTR3:[0-9]+]]
471-
; CHECK-NEXT: [[TMP4:%.*]] = fpext float [[Z:%.*]] to double
472-
; CHECK-NEXT: [[TMP5:%.*]] = fcmp oeq double [[TMP3]], [[TMP4]]
468+
; CHECK-NEXT: [[FMINIMUM_NUMF:%.*]] = call float @llvm.minimumnum.f32(float [[X:%.*]], float [[Y:%.*]])
469+
; CHECK-NEXT: [[TMP5:%.*]] = fcmp oeq float [[FMINIMUM_NUMF]], [[Z:%.*]]
473470
; CHECK-NEXT: ret i1 [[TMP5]]
474471
;
475472
%1 = fpext float %x to double
@@ -482,11 +479,8 @@ define i1 @test_fminimum_num(float %x, float %y, float %z) {
482479

483480
define i1 @test_fmaximum_num(float %x, float %y, float %z) {
484481
; CHECK-LABEL: @test_fmaximum_num(
485-
; CHECK-NEXT: [[TMP1:%.*]] = fpext float [[X:%.*]] to double
486-
; CHECK-NEXT: [[TMP2:%.*]] = fpext float [[Y:%.*]] to double
487-
; CHECK-NEXT: [[TMP3:%.*]] = call double @fmaximum_num(double [[TMP1]], double [[TMP2]]) #[[ATTR3]]
488-
; CHECK-NEXT: [[TMP4:%.*]] = fpext float [[Z:%.*]] to double
489-
; CHECK-NEXT: [[TMP5:%.*]] = fcmp oeq double [[TMP3]], [[TMP4]]
482+
; CHECK-NEXT: [[FMAXIMUM_NUMF:%.*]] = call float @llvm.maximumnum.f32(float [[X:%.*]], float [[Y:%.*]])
483+
; CHECK-NEXT: [[TMP5:%.*]] = fcmp oeq float [[FMAXIMUM_NUMF]], [[Z:%.*]]
490484
; CHECK-NEXT: ret i1 [[TMP5]]
491485
;
492486
%1 = fpext float %x to double

0 commit comments

Comments
 (0)