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:
parent
c2df151fcb
commit
a5c875d940
@ -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) {
|
||||
|
@ -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" }
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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" }
|
||||
|
Loading…
x
Reference in New Issue
Block a user