1; RUN: opt -inferattrs -function-attrs -S %s | FileCheck %s
2
3declare void @decl_readonly() readonly
4declare void @decl_readnone() readnone
5declare void @decl_argmemonly(i32*) argmemonly
6declare void @decl_unknown()
7
8define void @test_fn_mustprogress(i32* %ptr) mustprogress {
9; CHECK: Function Attrs: mustprogress
10; CHECK-LABEL: @test_fn_mustprogress(
11; CHECK-NOT:     call void @decl_readonly() #
12; CHECK-NOT:     call void @decl_readnone() #
13; CHECK-NOT:     call void @decl_unknown() #
14; CHECK-NOT:     call void @decl_argmemonly(i32* [[PTR:%.*]]) #
15; CHECK:         ret void
16;
17  call void @decl_readonly()
18  call void @decl_readnone()
19  call void @decl_unknown()
20  call void @decl_argmemonly(i32* %ptr)
21  ret void
22}
23
24define void @test_fn_willreturn(i32* %ptr) willreturn {
25; CHECK: Function Attrs: mustprogress willreturn
26; CHECK-LABEL: @test_fn_willreturn(
27; CHECK-NOT:     call void @decl_readonly() #
28; CHECK-NOT:    call void @decl_readnone() #
29; CHECK-NOT:     call void @decl_unknown() #
30; CHECK-NOT:     call void @decl_argmemonly(i32* [[PTR:%.*]]) #
31; CHECK:         ret void
32;
33  call void @decl_readonly()
34  call void @decl_readnone()
35  call void @decl_unknown()
36  call void @decl_argmemonly(i32* %ptr)
37  ret void
38}
39
40define void @test_fn_mustprogress_readonly_calls(i32* %ptr) mustprogress {
41; CHECK: Function Attrs: mustprogress nofree readonly willreturn
42; CHECK-LABEL: @test_fn_mustprogress_readonly_calls(
43; CHECK-NOT:     call void @decl_readonly() #
44; CHECK-NOT:     call void @decl_readnone() #
45; CHECK:         ret void
46;
47  call void @decl_readonly()
48  call void @decl_readnone()
49  ret void
50}
51
52define void @test_fn_mustprogress_readonly_calls_but_stores(i32* %ptr) mustprogress {
53; CHECK: Function Attrs: mustprogress nofree
54; CHECK-LABEL: @test_fn_mustprogress_readonly_calls_but_stores(
55; CHECK-NOT:     call void @decl_readonly() #
56; CHECK-NOT:     call void @decl_readnone() #
57; CHECK:         store i32 0, i32* [[PTR:%.*]], align 4
58; CHECK-NEXT:    ret void
59;
60  call void @decl_readonly()
61  call void @decl_readnone()
62  store i32 0, i32* %ptr
63  ret void
64}
65