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