]> granicus.if.org Git - llvm/commitdiff
[PartialInlineLibCalls] Teach PartialInlineLibCalls to honor nobuiltin, properly...
authorCraig Topper <craig.topper@intel.com>
Sat, 28 Oct 2017 00:36:58 +0000 (00:36 +0000)
committerCraig Topper <craig.topper@intel.com>
Sat, 28 Oct 2017 00:36:58 +0000 (00:36 +0000)
Summary:
We shouldn't do this transformation if the function is marked nobuitlin.

We were only checking that the return type is floating point, we really should be checking the argument types and argument count as well. This can be accomplished by using the other version of getLibFunc that takes the Function and not just the name.

We should also be checking TLI::has since sqrtf is a macro on Windows.

Fixes PR32559.

Reviewers: hfinkel, spatel, davide, efriedma

Reviewed By: davide, efriedma

Subscribers: efriedma, llvm-commits, eraman

Differential Revision: https://reviews.llvm.org/D39381

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@316819 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/PartiallyInlineLibCalls.cpp
test/Transforms/PartiallyInlineLibCalls/bad-prototype.ll
test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll [new file with mode: 0644]

index 1bfecea2f61e6f263cfaf7e8013236f34db6d4b1..a044fe38b76b52b7fe7ffe9a1356fd2acf9e0be0 100644 (file)
@@ -32,10 +32,6 @@ static bool optimizeSQRT(CallInst *Call, Function *CalledFunc,
   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 @@ static bool runPartiallyInlineLibCalls(Function &F, TargetLibraryInfo *TLI,
       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 e4d4cf7827aa0db9318d3b4ca848c669f04f8aba..78c192e8c5c336e070a044e30b38832f4a3e3e9d 100644 (file)
@@ -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 @@ define i32 @foo() {
   %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
+}
diff --git a/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll b/test/Transforms/PartiallyInlineLibCalls/nobuiltin.ll
new file mode 100644 (file)
index 0000000..c648ce0
--- /dev/null
@@ -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)