Index: llvm/trunk/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp +++ llvm/trunk/lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp @@ -32,10 +32,6 @@ if (Call->onlyReadsMemory()) return false; - // The call must have the expected result type. - if (!Call->getType()->isFloatingPointTy()) - return false; - // Do the following transformation: // // (before) @@ -96,11 +92,14 @@ if (!Call || !(CalledFunc = Call->getCalledFunction())) continue; + if (Call->isNoBuiltin()) + continue; + // Skip if function either has local linkage or is not a known library // function. LibFunc LF; - if (CalledFunc->hasLocalLinkage() || !CalledFunc->hasName() || - !TLI->getLibFunc(CalledFunc->getName(), LF)) + if (CalledFunc->hasLocalLinkage() || + !TLI->getLibFunc(*CalledFunc, LF) || !TLI->has(LF)) continue; switch (LF) { Index: llvm/trunk/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll =================================================================== --- llvm/trunk/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll +++ llvm/trunk/test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll @@ -4,6 +4,7 @@ target triple = "x86_64-unknown-linux-gnu" declare i32 @sqrt() +declare float @sqrtf() ; CHECK-LABEL: @foo define i32 @foo() { @@ -12,3 +13,11 @@ %r = call i32 @sqrt() ret i32 %r } + +; CHECK-LABEL: @bar +define float @bar() { + ; CHECK: call{{.*}}@sqrtf + ; CHECK-NOT: call{{.*}}@sqrtf + %r = call float @sqrtf() + ret float %r +} Index: llvm/trunk/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll =================================================================== --- llvm/trunk/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll +++ llvm/trunk/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll @@ -0,0 +1,12 @@ +; RUN: opt -S -partially-inline-libcalls -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s +; RUN: opt -S -passes=partially-inline-libcalls -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s + +define float @f(float %val) { +; CHECK-LABEL: @f +; CHECK: call{{.*}}@sqrtf +; CHECK-NOT: call{{.*}}@sqrtf + %res = tail call float @sqrtf(float %val) nobuiltin + ret float %res +} + +declare float @sqrtf(float)