[llvm] r231927 - Inliner should not add callgraph edges for intrinsic calls (PR22857)

Sanjay Patel spatel at rotateright.com
Wed Mar 11 08:12:32 PDT 2015


Author: spatel
Date: Wed Mar 11 10:12:32 2015
New Revision: 231927

URL: http://llvm.org/viewvc/llvm-project?rev=231927&view=rev
Log:
Inliner should not add callgraph edges for intrinsic calls (PR22857)

The CallGraphNode function "addCalledFunction()" asserts that edges are not to intrinsics.

This patch makes sure that the Inliner does not add such an edge to the callgraph.

Fix for clang crash by assertion: https://llvm.org/bugs/show_bug.cgi?id=22857

Differential Revision: http://reviews.llvm.org/D8231


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

Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=231927&r1=231926&r2=231927&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Wed Mar 11 10:12:32 2015
@@ -693,8 +693,15 @@ static void UpdateCallGraphAfterInlining
     // 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);

Added: llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll?rev=231927&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/inline-intrinsic-assert.ll Wed Mar 11 10:12:32 2015
@@ -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" }
+





More information about the llvm-commits mailing list