1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00

[SimplifyLibCalls] Don't depend on a called function having a name, it might be an indirect call.

Fixes the crasher in PR25651 and related crashers using the same pattern.

llvm-svn: 254145
This commit is contained in:
Benjamin Kramer 2015-11-26 09:51:17 +00:00
parent c2df151fcb
commit a5c875d940
4 changed files with 35 additions and 11 deletions

View File

@ -1112,14 +1112,12 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
B.SetFastMathFlags(FMF);
LibFunc::Func Func;
Function *Callee = OpC->getCalledFunction();
StringRef FuncName = Callee->getName();
if (TLI->getLibFunc(FuncName, Func) && TLI->has(Func) &&
(Func == LibFunc::exp || Func == LibFunc::exp2))
Function *OpCCallee = OpC->getCalledFunction();
if (OpCCallee && TLI->getLibFunc(OpCCallee->getName(), Func) &&
TLI->has(Func) && (Func == LibFunc::exp || Func == LibFunc::exp2))
return EmitUnaryFloatFnCall(
B.CreateFMul(OpC->getArgOperand(0), Op2, "mul"), FuncName, B,
Callee->getAttributes());
B.CreateFMul(OpC->getArgOperand(0), Op2, "mul"),
OpCCallee->getName(), B, OpCCallee->getAttributes());
}
}
@ -1382,8 +1380,7 @@ Value *LibCallSimplifier::optimizeTan(CallInst *CI, IRBuilder<> &B) {
// tanl(atanl(x)) -> x
LibFunc::Func Func;
Function *F = OpC->getCalledFunction();
StringRef FuncName = F->getName();
if (TLI->getLibFunc(FuncName, Func) && TLI->has(Func) &&
if (F && TLI->getLibFunc(F->getName(), Func) && TLI->has(Func) &&
((Func == LibFunc::atan && Callee->getName() == "tan") ||
(Func == LibFunc::atanf && Callee->getName() == "tanf") ||
(Func == LibFunc::atanl && Callee->getName() == "tanl")))
@ -1458,9 +1455,9 @@ LibCallSimplifier::classifyArgUse(Value *Val, BasicBlock *BB, bool IsFloat,
return;
Function *Callee = CI->getCalledFunction();
StringRef FuncName = Callee->getName();
LibFunc::Func Func;
if (!TLI->getLibFunc(FuncName, Func) || !TLI->has(Func) || !isTrigLibCall(CI))
if (Callee && (!TLI->getLibFunc(Callee->getName(), Func) || !TLI->has(Func) ||
!isTrigLibCall(CI)))
return;
if (IsFloat) {

View File

@ -13,6 +13,15 @@ entry:
; CHECK: ret double %exp
; CHECK: }
define double @test2(double ()* %fptr, double %p1) #0 {
%call1 = call double %fptr()
%pow = call double @llvm.pow.f64(double %call1, double %p1)
ret double %pow
}
; CHECK-LABEL: @test2
; CHECK: llvm.pow.f64
declare double @exp(double) #1
declare double @llvm.pow.f64(double, double)
attributes #0 = { "unsafe-fp-math"="true" }

View File

@ -90,3 +90,12 @@ define double @test_constant_f64() {
; CHECK-NO-SINCOS: call double @__sinpi
; CHECK-NO-SINCOS: call double @__cospi
}
define double @test_fptr(double (double)* %fptr, double %p1) {
%sin = call double @__sinpi(double %p1) #0
%cos = call double %fptr(double %p1)
%res = fadd double %sin, %cos
ret double %res
; CHECK-LABEL: @test_fptr
; CHECK: __sinpi
}

View File

@ -10,6 +10,15 @@ entry:
; CHECK-LABEL: define float @mytan(
; CHECK: ret float %x
define float @test2(float ()* %fptr) #0 {
%call1 = call float %fptr()
%tan = call float @tanf(float %call1)
ret float %tan
}
; CHECK-LABEL: @test2
; CHECK: tanf
declare float @tanf(float) #0
declare float @atanf(float) #0
attributes #0 = { "unsafe-fp-math"="true" }