[PATCH] D98235: [InstCombine][SimplifyLibCalls] An extra sqrtf was produced because of transformations in optimizePow function
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 10 09:33:19 PST 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rG7c49f3c75be9: [InstCombine][SimplifyLibCalls] An extra sqrtf was produced because of… (authored by vdsered, committed by spatel).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98235/new/
https://reviews.llvm.org/D98235
Files:
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/test/Transforms/InstCombine/pow-4.ll
Index: llvm/test/Transforms/InstCombine/pow-4.ll
===================================================================
--- llvm/test/Transforms/InstCombine/pow-4.ll
+++ llvm/test/Transforms/InstCombine/pow-4.ll
@@ -1,7 +1,6 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -instcombine -S < %s | FileCheck %s --check-prefixes=CHECK,SQRT
; RUN: opt -instcombine -S < %s -disable-builtin sqrt | FileCheck %s --check-prefixes=CHECK,NOSQRT
-
declare double @llvm.pow.f64(double, double)
declare float @llvm.pow.f32(float, float)
declare <2 x double> @llvm.pow.v2f64(<2 x double>, <2 x double>)
@@ -235,12 +234,10 @@
}
; (float)pow((double)(float)x, 0.5)
-; FIXME: One call to `sqrtf` would suffice (PR47613).
define float @shrink_pow_libcall_half(float %x) {
; SQRT-LABEL: @shrink_pow_libcall_half(
-; SQRT-NEXT: [[SQRTF:%.*]] = call fast float @sqrtf(float [[X:%.*]])
-; SQRT-NEXT: [[SQRTF1:%.*]] = call fast float @sqrtf(float [[X]])
-; SQRT-NEXT: ret float [[SQRTF1]]
+; SQRT-NEXT: [[SQRTF:%.*]] = call fast float @sqrtf(float [[X]])
+; SQRT-NEXT: ret float [[SQRTF]]
;
; NOSQRT-LABEL: @shrink_pow_libcall_half(
; NOSQRT-NEXT: [[SQRTF:%.*]] = call fast float @sqrtf(float [[X:%.*]])
Index: llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
===================================================================
--- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -1704,20 +1704,12 @@
StringRef Name = Callee->getName();
Type *Ty = Pow->getType();
Module *M = Pow->getModule();
- Value *Shrunk = nullptr;
bool AllowApprox = Pow->hasApproxFunc();
bool Ignored;
// Propagate the math semantics from the call to any created instructions.
IRBuilderBase::FastMathFlagGuard Guard(B);
B.setFastMathFlags(Pow->getFastMathFlags());
-
- // Shrink pow() to powf() if the arguments are single precision,
- // unless the result is expected to be double precision.
- if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
- hasFloatVersion(Name))
- Shrunk = optimizeBinaryDoubleFP(Pow, B, true);
-
// Evaluate special cases related to the base.
// pow(1.0, x) -> 1.0
@@ -1818,7 +1810,15 @@
return createPowWithIntegerExponent(Base, ExpoI, M, B);
}
- return Shrunk;
+ // Shrink pow() to powf() if the arguments are single precision,
+ // unless the result is expected to be double precision.
+ if (UnsafeFPShrink && Name == TLI->getName(LibFunc_pow) &&
+ hasFloatVersion(Name)) {
+ if (Value *Shrunk = optimizeBinaryDoubleFP(Pow, B, true))
+ return Shrunk;
+ }
+
+ return nullptr;
}
Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilderBase &B) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98235.329690.patch
Type: text/x-patch
Size: 2765 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210310/2173914b/attachment.bin>
More information about the llvm-commits
mailing list