From: Manuel Jacob Date: Tue, 5 Jan 2016 23:59:08 +0000 (+0000) Subject: [Statepoints] Check for the "gc-leaf-function" attribute on call sites as well. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7b845c18dbd7df8f596f144948b2c59996c73e02;p=oota-llvm.git [Statepoints] Check for the "gc-leaf-function" attribute on call sites as well. Reviewers: sanjoy, reames Subscribers: sanjoy, llvm-commits Differential Revision: http://reviews.llvm.org/D15900 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256875 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/Local.cpp b/lib/Transforms/Utils/Local.cpp index 3f46c5ebf45..0e386ac83e9 100644 --- a/lib/Transforms/Utils/Local.cpp +++ b/lib/Transforms/Utils/Local.cpp @@ -1553,8 +1553,8 @@ bool llvm::callsGCLeafFunction(ImmutableCallSite CS) { return true; // Check if the function is specifically marked as a gc leaf function. - // - // TODO: we should be checking the attributes on the call site as well. + if (CS.hasFnAttr("gc-leaf-function")) + return true; if (const Function *F = CS.getCalledFunction()) return F->hasFnAttribute("gc-leaf-function"); diff --git a/test/Transforms/PlaceSafepoints/leaf-function.ll b/test/Transforms/PlaceSafepoints/leaf-function.ll index 5054ad8e118..2f4193827ae 100644 --- a/test/Transforms/PlaceSafepoints/leaf-function.ll +++ b/test/Transforms/PlaceSafepoints/leaf-function.ll @@ -1,6 +1,7 @@ ; RUN: opt %s -S -place-safepoints | FileCheck %s declare void @foo() "gc-leaf-function" +declare void @bar() ; Calls of functions with the "gc-leaf-function" attribute shouldn't be turned ; into a safepoint. An entry safepoint should get inserted, though. @@ -14,6 +15,16 @@ entry: ret void } +define void @test_leaf_function_call() gc "statepoint-example" { +; CHECK-LABEL: test_leaf_function_call +; CHECK: gc.statepoint.p0f_isVoidf +; CHECK-NOT: statepoint +; CHECK-NOT: gc.result +entry: + call void @bar() "gc-leaf-function" + ret void +} + ; This function is inlined when inserting a poll. declare void @do_safepoint() define void @gc.safepoint_poll() {