From 7b845c18dbd7df8f596f144948b2c59996c73e02 Mon Sep 17 00:00:00 2001 From: Manuel Jacob Date: Tue, 5 Jan 2016 23:59:08 +0000 Subject: [PATCH] [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 --- lib/Transforms/Utils/Local.cpp | 4 ++-- test/Transforms/PlaceSafepoints/leaf-function.ll | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) 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() { -- 2.34.1