xref: /llvm-project/llvm/test/Analysis/MemorySSA/function-mem-attrs.ll (revision 8e44f13c6d294e6b4864441b22045b507782540c)
1; RUN: opt -aa-pipeline=basic-aa -passes='print<memoryssa>,verify<memoryssa>' -disable-output < %s 2>&1 | FileCheck %s
2;
3; Test that various function attributes give us sane results.
4
5@g = external global i32
6
7declare void @readonlyFunction() readonly
8declare void @noattrsFunction()
9
10define void @readonlyAttr() {
11; CHECK: 1 = MemoryDef(liveOnEntry)
12; CHECK-NEXT: store i32 0
13  store i32 0, ptr @g, align 4
14
15  %1 = alloca i32, align 4
16; CHECK: 2 = MemoryDef(1)
17; CHECK-NEXT: store i32 0
18  store i32 0, ptr %1, align 4
19
20; CHECK: MemoryUse(1)
21; CHECK-NEXT: call void @readonlyFunction()
22  call void @readonlyFunction()
23
24; CHECK: MemoryUse(1)
25; CHECK-NEXT: call void @noattrsFunction() #
26; Assume that #N is readonly
27  call void @noattrsFunction() readonly
28
29  ; Verify that noattrsFunction is otherwise a MemoryDef
30; CHECK: 3 = MemoryDef(2)
31; CHECK-NEXT: call void @noattrsFunction()
32  call void @noattrsFunction()
33  ret void
34}
35
36declare void @argMemOnly(ptr) argmemonly
37
38define void @inaccessableOnlyAttr() {
39  %1 = alloca i32, align 4
40; CHECK: 1 = MemoryDef(liveOnEntry)
41; CHECK-NEXT: store i32 0
42  store i32 0, ptr %1, align 4
43
44; CHECK: 2 = MemoryDef(1)
45; CHECK-NEXT: store i32 0
46  store i32 0, ptr @g, align 4
47
48; CHECK: MemoryUse(1)
49; CHECK-NEXT: call void @argMemOnly(ptr %1) #
50; Assume that #N is readonly
51  call void @argMemOnly(ptr %1) readonly
52
53; CHECK: 3 = MemoryDef(2)
54; CHECK-NEXT: call void @argMemOnly(ptr %1)
55  call void @argMemOnly(ptr %1)
56
57  ret void
58}
59