From 4c4b944e835178419b4de36aa9992e56b038b381 Mon Sep 17 00:00:00 2001 From: Sanjoy Das Date: Fri, 15 May 2015 00:26:15 +0000 Subject: [PATCH] [PlaceSafepoints] Fix a bug that came in with rL236672. rL236672 would generate all invoke statepoints with deopt args set to a list containing the single element "0", instead of an empty list. Also add a test case that would have caught this. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237413 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/PlaceSafepoints.cpp | 2 +- .../PlaceSafepoints/statepoint-format.ll | 42 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 test/Transforms/PlaceSafepoints/statepoint-format.ll diff --git a/lib/Transforms/Scalar/PlaceSafepoints.cpp b/lib/Transforms/Scalar/PlaceSafepoints.cpp index 04750c9849a..53eed86b81f 100644 --- a/lib/Transforms/Scalar/PlaceSafepoints.cpp +++ b/lib/Transforms/Scalar/PlaceSafepoints.cpp @@ -949,7 +949,7 @@ static Value *ReplaceWithStatepoint(const CallSite &CS, /* to replace */ InvokeInst *Invoke = Builder.CreateGCStatepointInvoke( ID, NumPatchBytes, StatepointTarget, ToReplace->getNormalDest(), ToReplace->getUnwindDest(), makeArrayRef(CS.arg_begin(), CS.arg_end()), - Builder.getInt32(0), None, "safepoint_token"); + None, None, "safepoint_token"); // In case if we can handle this set of attributes - set up function // attributes directly on statepoint and return attributes later for diff --git a/test/Transforms/PlaceSafepoints/statepoint-format.ll b/test/Transforms/PlaceSafepoints/statepoint-format.ll new file mode 100644 index 00000000000..328b670873e --- /dev/null +++ b/test/Transforms/PlaceSafepoints/statepoint-format.ll @@ -0,0 +1,42 @@ +; RUN: opt -place-safepoints -S < %s | FileCheck %s + +; Ensure that the gc.statepoint calls / invokes we generate have the +; set of arguments we expect it to have. + +define i64 addrspace(1)* @test_invoke_format(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" { +; CHECK-LABEL: @test_invoke_format( +; CHECK-LABEL: entry: +; CHECK: invoke i32 (i64, i32, i64 addrspace(1)* (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i64p1i64f(i64 2882400000, i32 0, i64 addrspace(1)* (i64 addrspace(1)*)* @callee, i32 1, i32 0, i64 addrspace(1)* %obj, i32 0, i32 0) +entry: + %ret_val = invoke i64 addrspace(1)* @callee(i64 addrspace(1)* %obj) + to label %normal_return unwind label %exceptional_return + +normal_return: + ret i64 addrspace(1)* %ret_val + +exceptional_return: + %landing_pad4 = landingpad {i8*, i32} personality i32 ()* @personality + cleanup + ret i64 addrspace(1)* %obj1 +} + +define i64 addrspace(1)* @test_call_format(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" { +; CHECK-LABEL: @test_call_format( +; CHECK-LABEL: entry: +; CHECK: call i32 (i64, i32, i64 addrspace(1)* (i64 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i64p1i64f(i64 2882400000, i32 0, i64 addrspace(1)* (i64 addrspace(1)*)* @callee, i32 1, i32 0, i64 addrspace(1)* %obj, i32 0, i32 0) +entry: + %ret_val = call i64 addrspace(1)* @callee(i64 addrspace(1)* %obj) + ret i64 addrspace(1)* %ret_val +} + +; This function is inlined when inserting a poll. +declare void @do_safepoint() +define void @gc.safepoint_poll() { +; CHECK-LABEL: gc.safepoint_poll +entry: + call void @do_safepoint() + ret void +} + +declare i64 addrspace(1)* @callee(i64 addrspace(1)*) +declare i32 @personality()