[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