@@ -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+
25462570Value *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:
0 commit comments