[SimplifyLibCalls] Don't depend on a called function having a name, it might be an...
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 26 Nov 2015 09:51:17 +0000 (09:51 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 26 Nov 2015 09:51:17 +0000 (09:51 +0000)
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

lib/Transforms/Utils/SimplifyLibCalls.cpp
test/Transforms/InstCombine/pow-exp.ll
test/Transforms/InstCombine/sincospi.ll
test/Transforms/InstCombine/tan.ll

index 8e0481df8dc4c57de251ac7d9509b3c530518f61..da852526f5095c79675116f72a203d7974e6e428 100644 (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) {
index 62e6fb4f3a369d9e17e310e6510abb398b4b9c85..7ac6fe4f8fd00d66a3da9edac6dd0e5036ef1950 100644 (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" }
index f49fb35cb76aa5f8cce1620fc1b59d5aa2bcdea8..10342c50096179034d21c94b07b623fe266942fa 100644 (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
+}
index 58e3bb355bd273f5cade187281de2c45ea6cf22c..15a832f253a9086719e0380d640a6e8e53d9ea6c 100644 (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" }