1; RUN: opt -S -rewrite-statepoints-for-gc  < %s | FileCheck %s
2; RUN: opt -S -passes=rewrite-statepoints-for-gc  < %s | FileCheck %s
3
4
5; Ensure we're stipping attributes from the function signatures which are invalid
6; after inserting safepoints with explicit memory semantics
7
8declare void @f()
9
10define i8 addrspace(1)* @deref_arg(i8 addrspace(1)* dereferenceable(16) %arg) gc "statepoint-example" {
11; CHECK: define i8 addrspace(1)* @deref_arg(i8 addrspace(1)* %arg)
12  call void @f()
13  ret i8 addrspace(1)* %arg
14}
15
16define dereferenceable(16) i8 addrspace(1)* @deref_ret(i8 addrspace(1)* %arg) gc "statepoint-example" {
17; CHECK: define i8 addrspace(1)* @deref_ret(i8 addrspace(1)* %arg)
18  call void @f()
19  ret i8 addrspace(1)* %arg
20}
21
22define i8 addrspace(1)* @deref_or_null_arg(i8 addrspace(1)* dereferenceable_or_null(16) %arg) gc "statepoint-example" {
23; CHECK: define i8 addrspace(1)* @deref_or_null_arg(i8 addrspace(1)* %arg)
24  call void @f()
25  ret i8 addrspace(1)* %arg
26}
27
28define dereferenceable_or_null(16) i8 addrspace(1)* @deref_or_null_ret(i8 addrspace(1)* %arg) gc "statepoint-example" {
29; CHECK: define i8 addrspace(1)* @deref_or_null_ret(i8 addrspace(1)* %arg)
30  call void @f()
31  ret i8 addrspace(1)* %arg
32}
33
34define i8 addrspace(1)* @noalias_arg(i8 addrspace(1)* noalias %arg) gc "statepoint-example" {
35; CHECK: define i8 addrspace(1)* @noalias_arg(i8 addrspace(1)* %arg)
36  call void @f()
37  ret i8 addrspace(1)* %arg
38}
39
40define noalias i8 addrspace(1)* @noalias_ret(i8 addrspace(1)* %arg) gc "statepoint-example" {
41; CHECK: define i8 addrspace(1)* @noalias_ret(i8 addrspace(1)* %arg)
42  call void @f()
43  ret i8 addrspace(1)* %arg
44}
45
46define i8 addrspace(1)* @nofree(i8 addrspace(1)* nofree %arg) nofree gc "statepoint-example" {
47; CHECK: define i8 addrspace(1)* @nofree(i8 addrspace(1)* %arg) gc "statepoint-example" {
48  call void @f()
49  ret i8 addrspace(1)* %arg
50}
51
52define i8 addrspace(1)* @nosync(i8 addrspace(1)* %arg) nosync gc "statepoint-example" {
53; CHECK: define i8 addrspace(1)* @nosync(i8 addrspace(1)* %arg) gc "statepoint-example" {
54  call void @f()
55  ret i8 addrspace(1)* %arg
56}
57
58define i8 addrspace(1)* @readnone(i8 addrspace(1)* readnone %arg) readnone gc "statepoint-example" {
59; CHECK: define i8 addrspace(1)* @readnone(i8 addrspace(1)* %arg) gc "statepoint-example" {
60  call void @f()
61  ret i8 addrspace(1)* %arg
62}
63
64define i8 addrspace(1)* @readonly(i8 addrspace(1)* readonly %arg) readonly gc "statepoint-example" {
65; CHECK: define i8 addrspace(1)* @readonly(i8 addrspace(1)* %arg) gc "statepoint-example" {
66  call void @f()
67  ret i8 addrspace(1)* %arg
68}
69
70define i8 addrspace(1)* @writeonly(i8 addrspace(1)* writeonly %arg) writeonly gc "statepoint-example" {
71; CHECK: define i8 addrspace(1)* @writeonly(i8 addrspace(1)* %arg) gc "statepoint-example" {
72  call void @f()
73  ret i8 addrspace(1)* %arg
74}
75
76define i8 addrspace(1)* @argmemonly(i8 addrspace(1)* %arg) argmemonly gc "statepoint-example" {
77; CHECK: define i8 addrspace(1)* @argmemonly(i8 addrspace(1)* %arg) gc "statepoint-example" {
78  call void @f()
79  ret i8 addrspace(1)* %arg
80}
81
82define i8 addrspace(1)* @inaccessiblememonly(i8 addrspace(1)* %arg) inaccessiblememonly gc "statepoint-example" {
83; CHECK: define i8 addrspace(1)* @inaccessiblememonly(i8 addrspace(1)* %arg) gc "statepoint-example" {
84  call void @f()
85  ret i8 addrspace(1)* %arg
86}
87
88define i8 addrspace(1)* @inaccessiblemem_or_argmemonly(i8 addrspace(1)* %arg) inaccessiblemem_or_argmemonly gc "statepoint-example" {
89; CHECK: define i8 addrspace(1)* @inaccessiblemem_or_argmemonly(i8 addrspace(1)* %arg) gc "statepoint-example" {
90  call void @f()
91  ret i8 addrspace(1)* %arg
92}
93
94