declare i32 @fn_argmemonly(i32*) argmemonly
define i32 @test_call_argmemonly(i32* %ptr) {
+; CHECK: Function Attrs: argmemonly
; CHECK-LABEL: @test_call_argmemonly(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[C:%.*]] = call i32 @fn_argmemonly(i32* [[PTR:%.*]])
%l.2 = load i32, i32* %a
ret i32 %l.2
}
+
+declare void @fn_inaccessiblememonly() inaccessiblememonly
+
+define void @test_inaccessiblememonly() {
+; CHECK-LABEL: @test_inaccessiblememonly(
+; CHECK-NEXT: call void @fn_inaccessiblememonly()
+; CHECK-NEXT: ret void
+;
+ call void @fn_inaccessiblememonly()
+ ret void
+}
+
+define void @test_inaccessiblememonly_readonly() {
+; CHECK: Function Attrs: nofree readonly
+; CHECK-LABEL: @test_inaccessiblememonly_readonly(
+; CHECK-NEXT: call void @fn_inaccessiblememonly() #[[ATTR13:[0-9]+]]
+; CHECK-NEXT: ret void
+;
+ call void @fn_inaccessiblememonly() readonly
+ ret void
+}
+
+define void @test_inaccessibleorargmemonly_readonly(i32* %arg) {
+; CHECK: Function Attrs: nofree readonly
+; CHECK-LABEL: @test_inaccessibleorargmemonly_readonly(
+; CHECK-NEXT: [[TMP1:%.*]] = load i32, i32* [[ARG:%.*]], align 4
+; CHECK-NEXT: call void @fn_inaccessiblememonly() #[[ATTR13]]
+; CHECK-NEXT: ret void
+;
+ load i32, i32* %arg
+ call void @fn_inaccessiblememonly() readonly
+ ret void
+}
+
+define void @test_inaccessibleorargmemonly_readwrite(i32* %arg) {
+; CHECK-LABEL: @test_inaccessibleorargmemonly_readwrite(
+; CHECK-NEXT: store i32 0, i32* [[ARG:%.*]], align 4
+; CHECK-NEXT: call void @fn_inaccessiblememonly() #[[ATTR13]]
+; CHECK-NEXT: ret void
+;
+ store i32 0, i32* %arg
+ call void @fn_inaccessiblememonly() readonly
+ ret void
+}