diff options
Diffstat (limited to 'llvm/test/Verifier/statepoint.ll')
-rw-r--r-- | llvm/test/Verifier/statepoint.ll | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/test/Verifier/statepoint.ll b/llvm/test/Verifier/statepoint.ll index c07a85b9bd3..8dba5c4d02a 100644 --- a/llvm/test/Verifier/statepoint.ll +++ b/llvm/test/Verifier/statepoint.ll @@ -4,6 +4,7 @@ declare void @use(...) declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token, i32, i32) declare i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(token, i32, i32) declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...) +declare token @llvm.experimental.gc.statepoint.p0f_isVoidp0s_structsf(i64, i32, void (%struct*)*, i32, i32, ...) declare i32 @"personality_function"() ;; Basic usage @@ -79,3 +80,20 @@ exceptional_return: %obj1.relocated1 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token %landing_pad, i32 12, i32 12) ret i8 addrspace(1)* %obj1.relocated1 } + +; Test for statepoint with sret attribute. +; This should be allowed as long as the wrapped function is not vararg. +%struct = type { i64, i64, i64 } + +declare void @fn_sret(%struct* sret) + +define void @test_sret() gc "statepoint-example" { + %x = alloca %struct + %statepoint_token = call token (i64, i32, void (%struct*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidp0s_structsf(i64 0, i32 0, void (%struct*)* @fn_sret, i32 1, i32 0, %struct* sret %x, i32 0, i32 0) + ret void + ; CHECK-LABEL: test_sret + ; CHECK: alloca + ; CHECK: statepoint + ; CHECK-SAME: sret + ; CHECK: ret +} |