mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-13 09:14:38 +00:00
[LibCallSimplifier] propagate FMF when shrinking binary calls
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256682 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
31e470b254
commit
e193ff319c
@ -1033,6 +1033,10 @@ Value *LibCallSimplifier::optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B) {
|
||||
if (V2 == nullptr)
|
||||
return nullptr;
|
||||
|
||||
// Propagate fast-math flags from the existing call to the new call.
|
||||
IRBuilder<>::FastMathFlagGuard Guard(B);
|
||||
B.SetFastMathFlags(CI->getFastMathFlags());
|
||||
|
||||
// fmin((double)floatval1, (double)floatval2)
|
||||
// -> (double)fminf(floatval1, floatval2)
|
||||
// TODO: Handle intrinsics in the same way as in optimizeUnaryDoubleFP().
|
||||
|
@ -350,6 +350,22 @@ define double @tanh_test2(float %f) {
|
||||
; CHECK: call fast double @tanh(double %conv)
|
||||
}
|
||||
|
||||
; 'arcp' on an fmax() is meaningless. This test just proves that
|
||||
; flags are propagated for shrunken *binary* double FP calls.
|
||||
define float @max1(float %a, float %b) {
|
||||
%c = fpext float %a to double
|
||||
%d = fpext float %b to double
|
||||
%e = call arcp double @fmax(double %c, double %d)
|
||||
%f = fptrunc double %e to float
|
||||
ret float %f
|
||||
|
||||
; CHECK-LABEL: max1(
|
||||
; CHECK-NEXT: call arcp float @fmaxf(float %a, float %b)
|
||||
; CHECK-NEXT: ret
|
||||
}
|
||||
|
||||
declare double @fmax(double, double)
|
||||
|
||||
declare double @tanh(double) #1
|
||||
declare double @tan(double) #1
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user