[PATCH] Inliner should not add callgraph edges for intrinsic calls (PR22857)

Sanjay Patel spatel at rotateright.com
Wed Mar 11 08:15:03 PDT 2015


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D8231

Files:
  llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
  llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll

Index: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
@@ -693,8 +693,15 @@
     // If the call was inlined, but then constant folded, there is no edge to
     // add.  Check for this case.
     Instruction *NewCall = dyn_cast<Instruction>(VMI->second);
-    if (!NewCall) continue;
+    if (!NewCall)
+      continue;
 
+    // We do not treat intrinsic calls like real function calls because we
+    // expect them to become inline code; do not add an edge for an intrinsic.
+    CallSite CS = CallSite(NewCall);
+    if (CS && CS.getCalledFunction() && CS.getCalledFunction()->isIntrinsic())
+      continue;
+    
     // Remember that this call site got inlined for the client of
     // InlineFunction.
     IFI.InlinedCalls.push_back(NewCall);
Index: llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll
===================================================================
--- llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll
+++ llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll
@@ -0,0 +1,30 @@
+; RUN: opt < %s -inline -instcombine -S | FileCheck %s
+
+; PR22857: http://llvm.org/bugs/show_bug.cgi?id=22857
+; The inliner should not add an edge to an intrinsic and
+; then assert that it did not add an edge to an intrinsic!
+
+define float @foo(float %f1) #0 {
+  %call = call float @bar(float %f1)
+  ret float %call
+
+; CHECK-LABEL: @foo(
+; CHECK-NEXT: call float @llvm.fabs.f32
+; CHECK-NEXT: ret float
+}
+
+define float @bar(float %f1) #0 {
+  %call = call float @sqr(float %f1)
+  %call1 = call float @sqrtf(float %call) #0
+  ret float %call1
+}
+
+define float @sqr(float %f) #0 {
+  %mul = fmul fast float %f, %f
+  ret float %mul
+}
+
+declare float @sqrtf(float) #0
+
+attributes #0 = { "unsafe-fp-math"="true" }
+

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D8231.21722.patch
Type: text/x-patch
Size: 1965 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150311/1836f1eb/attachment.bin>


More information about the llvm-commits mailing list