[llvm] r221802 - CGSCC should not treat intrinsic calls like function calls (PR21403)

Sanjay Patel spatel at rotateright.com
Wed Nov 12 10:25:48 PST 2014


Author: spatel
Date: Wed Nov 12 12:25:47 2014
New Revision: 221802

URL: http://llvm.org/viewvc/llvm-project?rev=221802&view=rev
Log:
CGSCC should not treat intrinsic calls like function calls (PR21403)

Make the handling of calls to intrinsics in CGSCC consistent: 
they are not treated like regular function calls because they
are never lowered to function calls.

Without this patch, we can get dangling pointer asserts from
the subsequent loop that processes callsites because it already
ignores intrinsics.

See http://llvm.org/bugs/show_bug.cgi?id=21403 for more details / discussion.

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


Added:
    llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll
Modified:
    llvm/trunk/lib/Analysis/IPA/CallGraphSCCPass.cpp

Modified: llvm/trunk/lib/Analysis/IPA/CallGraphSCCPass.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IPA/CallGraphSCCPass.cpp?rev=221802&r1=221801&r2=221802&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/IPA/CallGraphSCCPass.cpp (original)
+++ llvm/trunk/lib/Analysis/IPA/CallGraphSCCPass.cpp Wed Nov 12 12:25:47 2014
@@ -243,7 +243,14 @@ bool CGPassManager::RefreshCallGraph(Cal
       
       assert(!CallSites.count(I->first) &&
              "Call site occurs in node multiple times");
-      CallSites.insert(std::make_pair(I->first, I->second));
+      
+      CallSite CS(I->first);
+      if (CS) {
+        Function *Callee = CS.getCalledFunction();
+        // Ignore intrinsics because they're not really function calls.
+        if (!Callee || !(Callee->isIntrinsic()))
+          CallSites.insert(std::make_pair(I->first, I->second));
+      }
       ++I;
     }
     

Added: llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll?rev=221802&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/no_cgscc_assert.ll Wed Nov 12 12:25:47 2014
@@ -0,0 +1,19 @@
+; RUN: opt < %s -inline -instcombine -S | FileCheck %s
+
+; PR21403: http://llvm.org/bugs/show_bug.cgi?id=21403
+; When the call to sqrtf is replaced by an intrinsic call to fabs,
+; it should not cause a problem in CGSCC. 
+
+define float @bar(float %f) #0 {
+  %mul = fmul fast float %f, %f
+  %call1 = call float @sqrtf(float %mul) #0
+  ret float %call1
+
+; CHECK-LABEL: @bar(
+; CHECK-NEXT: call float @llvm.fabs.f32
+; CHECK-NEXT: ret float
+}
+
+declare float @sqrtf(float) #0
+
+attributes #0 = { readnone "unsafe-fp-math"="true" }





More information about the llvm-commits mailing list