[llvm] r254145 - [SimplifyLibCalls] Don't depend on a called function having a name, it might be an indirect call.
Benjamin Kramer via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 26 01:51:17 PST 2015
Author: d0k
Date: Thu Nov 26 03:51:17 2015
New Revision: 254145
URL: http://llvm.org/viewvc/llvm-project?rev=254145&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/trunk/test/Transforms/InstCombine/pow-exp.ll
llvm/trunk/test/Transforms/InstCombine/sincospi.ll
llvm/trunk/test/Transforms/InstCombine/tan.ll
Modified: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=254145&r1=254144&r2=254145&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp Thu Nov 26 03:51:17 2015
@@ -1112,14 +1112,12 @@ Value *LibCallSimplifier::optimizePow(Ca
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(Ca
// 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
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) {
Modified: llvm/trunk/test/Transforms/InstCombine/pow-exp.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/pow-exp.ll?rev=254145&r1=254144&r2=254145&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/pow-exp.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/pow-exp.ll Thu Nov 26 03:51:17 2015
@@ -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" }
Modified: llvm/trunk/test/Transforms/InstCombine/sincospi.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/sincospi.ll?rev=254145&r1=254144&r2=254145&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/sincospi.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/sincospi.ll Thu Nov 26 03:51:17 2015
@@ -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
+}
Modified: llvm/trunk/test/Transforms/InstCombine/tan.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/tan.ll?rev=254145&r1=254144&r2=254145&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/tan.ll (original)
+++ llvm/trunk/test/Transforms/InstCombine/tan.ll Thu Nov 26 03:51:17 2015
@@ -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" }
More information about the llvm-commits
mailing list