Index: lib/Transforms/Utils/Local.cpp =================================================================== --- lib/Transforms/Utils/Local.cpp +++ lib/Transforms/Utils/Local.cpp @@ -1553,8 +1553,8 @@ 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"); Index: test/Transforms/PlaceSafepoints/leaf-function.ll =================================================================== --- test/Transforms/PlaceSafepoints/leaf-function.ll +++ 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 @@ 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() {