mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[SLC] Emit an intrinsic instead of a libcall for pow.
Differential Revision: https://reviews.llvm.org/D22104 llvm-svn: 277963
This commit is contained in:
parent
6928f5a06e
commit
fa5db7cc65
@ -993,16 +993,20 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
|
||||
Ret = optimizeUnaryDoubleFP(CI, B, true);
|
||||
|
||||
Value *Op1 = CI->getArgOperand(0), *Op2 = CI->getArgOperand(1);
|
||||
|
||||
// pow(1.0, x) -> 1.0
|
||||
if (match(Op1, m_SpecificFP(1.0)))
|
||||
return Op1;
|
||||
// pow(2.0, x) -> llvm.exp2(x)
|
||||
if (match(Op1, m_SpecificFP(2.0))) {
|
||||
Value *Exp2 = Intrinsic::getDeclaration(CI->getModule(), Intrinsic::exp2,
|
||||
CI->getType());
|
||||
return B.CreateCall(Exp2, Op2, "exp2");
|
||||
}
|
||||
|
||||
// There's no llvm.exp10 intrinsic yet, but, maybe, some day there will
|
||||
// be one.
|
||||
if (ConstantFP *Op1C = dyn_cast<ConstantFP>(Op1)) {
|
||||
// pow(1.0, x) -> 1.0
|
||||
if (Op1C->isExactlyValue(1.0))
|
||||
return Op1C;
|
||||
// pow(2.0, x) -> exp2(x)
|
||||
if (Op1C->isExactlyValue(2.0) &&
|
||||
hasUnaryFloatFn(TLI, Op1->getType(), LibFunc::exp2, LibFunc::exp2f,
|
||||
LibFunc::exp2l))
|
||||
return emitUnaryFloatFnCall(Op2, TLI->getName(LibFunc::exp2), B,
|
||||
Callee->getAttributes());
|
||||
// pow(10.0, x) -> exp10(x)
|
||||
if (Op1C->isExactlyValue(10.0) &&
|
||||
hasUnaryFloatFn(TLI, Op1->getType(), LibFunc::exp10, LibFunc::exp10f,
|
||||
|
@ -37,7 +37,7 @@ define double @test_simplify2(double %x) {
|
||||
define float @test_simplify3(float %x) {
|
||||
; CHECK-LABEL: @test_simplify3(
|
||||
%retval = call float @powf(float 2.0, float %x)
|
||||
; CHECK-NEXT: [[EXP2F:%[a-z0-9]+]] = call float @exp2f(float %x) [[NUW_RO:#[0-9]+]]
|
||||
; CHECK-NEXT: [[EXP2F:%[a-z0-9]+]] = call float @llvm.exp2.f32(float %x)
|
||||
ret float %retval
|
||||
; CHECK-NEXT: ret float [[EXP2F]]
|
||||
}
|
||||
@ -45,7 +45,7 @@ define float @test_simplify3(float %x) {
|
||||
define double @test_simplify4(double %x) {
|
||||
; CHECK-LABEL: @test_simplify4(
|
||||
%retval = call double @pow(double 2.0, double %x)
|
||||
; CHECK-NEXT: [[EXP2:%[a-z0-9]+]] = call double @exp2(double %x) [[NUW_RO]]
|
||||
; CHECK-NEXT: [[EXP2:%[a-z0-9]+]] = call double @llvm.exp2.f64(double %x)
|
||||
ret double %retval
|
||||
; CHECK-NEXT: ret double [[EXP2]]
|
||||
}
|
||||
@ -71,7 +71,7 @@ define double @test_simplify6(double %x) {
|
||||
define float @test_simplify7(float %x) {
|
||||
; CHECK-LABEL: @test_simplify7(
|
||||
%retval = call float @powf(float %x, float 0.5)
|
||||
; CHECK-NEXT: [[SQRTF:%[a-z0-9]+]] = call float @sqrtf(float %x) [[NUW_RO]]
|
||||
; CHECK-NEXT: [[SQRTF:%[a-z0-9]+]] = call float @sqrtf(float %x) [[NUW_RO:#[0-9]+]]
|
||||
; CHECK-NEXT: [[FABSF:%[a-z0-9]+]] = call float @fabsf(float [[SQRTF]]) [[NUW_RO]]
|
||||
; CHECK-NEXT: [[FCMP:%[a-z0-9]+]] = fcmp oeq float %x, 0xFFF0000000000000
|
||||
; CHECK-NEXT: [[SELECT:%[a-z0-9]+]] = select i1 [[FCMP]], float 0x7FF0000000000000, float [[FABSF]]
|
||||
|
Loading…
x
Reference in New Issue
Block a user