From: Benjamin Kramer Date: Thu, 26 Nov 2015 09:51:17 +0000 (+0000) Subject: [SimplifyLibCalls] Don't depend on a called function having a name, it might be an... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7c7d1ee4c21dde71248681dff45b984689e977d7;p=oota-llvm.git [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254145 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp index 8e0481df8dc..da852526f50 100644 --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -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) { diff --git a/test/Transforms/InstCombine/pow-exp.ll b/test/Transforms/InstCombine/pow-exp.ll index 62e6fb4f3a3..7ac6fe4f8fd 100644 --- a/test/Transforms/InstCombine/pow-exp.ll +++ b/test/Transforms/InstCombine/pow-exp.ll @@ -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" } diff --git a/test/Transforms/InstCombine/sincospi.ll b/test/Transforms/InstCombine/sincospi.ll index f49fb35cb76..10342c50096 100644 --- a/test/Transforms/InstCombine/sincospi.ll +++ b/test/Transforms/InstCombine/sincospi.ll @@ -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 +} diff --git a/test/Transforms/InstCombine/tan.ll b/test/Transforms/InstCombine/tan.ll index 58e3bb355bd..15a832f253a 100644 --- a/test/Transforms/InstCombine/tan.ll +++ b/test/Transforms/InstCombine/tan.ll @@ -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" }