blob: 4cc3614a29ad47b861c54cdefa07aee4811e6c7f [file] [log] [blame]
Philip Reames079c92e2018-08-17 21:42:18 +00001; RUN: opt -basicaa -print-alias-sets -S -o - < %s 2>&1 | FileCheck %s
2
3@s = global i8 1, align 1
4@d = global i8 2, align 1
5
6; CHECK: Alias sets for function 'test1':
7; CHECK-NEXT: Alias Set Tracker: 3 alias sets for 2 pointer values.
8; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, 1)
9; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
10; CHECK-NEXT: 1 Unknown instructions: call void @my_memcpy(i8* %d, i8* %s, i64 1)
11; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, 1)
12define void @test1(i8* %s, i8* %d) {
13entry:
14 %a = alloca i8, align 1
15 %b = alloca i8, align 1
16 store i8 1, i8* %a, align 1
17 call void @my_memcpy(i8* %d, i8* %s, i64 1)
18 store i8 1, i8* %b, align 1
19 ret void
20}
21
22; CHECK: Alias sets for function 'test3':
23; CHECK-NEXT: Alias Set Tracker: 3 alias sets for 2 pointer values.
24; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, 1)
25; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
26; CHECK-NEXT: Unknown instructions: call void @my_memmove(i8* %d, i8* %s, i64 1)
27
28; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, 1)
Philip Reames9e313162018-08-17 21:45:57 +000029define void @test3(i8* noalias %a, i8* noalias %b, i8* %s, i8* %d) {
Philip Reames079c92e2018-08-17 21:42:18 +000030entry:
Philip Reames079c92e2018-08-17 21:42:18 +000031 store i8 1, i8* %a, align 1
32 call void @my_memmove(i8* %d, i8* %s, i64 1)
33 store i8 1, i8* %b, align 1
34 ret void
35}
36
37; CHECK: Alias sets for function 'test5':
38; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 2 pointer values.
39; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 3] may alias, Mod/Ref Pointers: (i8* %a, 1), (i8* %b, 1)
40; CHECK-NEXT: 1 Unknown instructions: call void @my_memcpy(i8* %b, i8* %a, i64 1)
Philip Reames9e313162018-08-17 21:45:57 +000041define void @test5(i8* noalias %a, i8* noalias %b) {
Philip Reames079c92e2018-08-17 21:42:18 +000042entry:
Philip Reames079c92e2018-08-17 21:42:18 +000043 store i8 1, i8* %a, align 1
44 call void @my_memcpy(i8* %b, i8* %a, i64 1)
45 store i8 1, i8* %b, align 1
46 ret void
47}
48
49; CHECK: Alias sets for function 'test6':
50; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 2 pointer values.
51; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 3] may alias, Mod/Ref Pointers: (i8* %a, 1), (i8* %b, 1)
52; CHECK-NEXT: 1 Unknown instructions: call void @my_memmove(i8* %b, i8* %a, i64 1)
Philip Reames9e313162018-08-17 21:45:57 +000053define void @test6(i8* noalias %a, i8* noalias %b) {
Philip Reames079c92e2018-08-17 21:42:18 +000054entry:
Philip Reames079c92e2018-08-17 21:42:18 +000055 store i8 1, i8* %a, align 1
56 call void @my_memmove(i8* %b, i8* %a, i64 1)
57 store i8 1, i8* %b, align 1
58 ret void
59}
60
61; CHECK: Alias sets for function 'test7':
62; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 2 pointer values.
63; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 3] may alias, Mod/Ref Pointers: (i8* %a, 1), (i8* %b, 1)
64; CHECK-NEXT: 2 Unknown instructions: call void @my_memcpy(i8* %b, i8* %a, i64 1), call void @my_memcpy(i8* %a, i8* %b, i64 1)
65
Philip Reames9e313162018-08-17 21:45:57 +000066define void @test7(i8* noalias %a, i8* noalias %b) {
Philip Reames079c92e2018-08-17 21:42:18 +000067entry:
Philip Reames079c92e2018-08-17 21:42:18 +000068 store i8 1, i8* %a, align 1
69 call void @my_memcpy(i8* %b, i8* %a, i64 1)
70 call void @my_memcpy(i8* %a, i8* %b, i64 1)
71 store i8 1, i8* %b, align 1
72 ret void
73}
74
75; CHECK: Alias sets for function 'test_memset1':
76; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 0 pointer values.
77; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
78; CHECK-NEXT: 1 Unknown instructions: call void @my_memset(i8* %a, i8 0, i64 1)
79define void @test_memset1() {
80entry:
81 %a = alloca i8, align 1
82 call void @my_memset(i8* %a, i8 0, i64 1)
83 ret void
84}
85
86; CHECK: Alias sets for function 'test_memset2':
87; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 0 pointer values.
88; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
89; CHECK-NEXT: 1 Unknown instructions: call void @my_memset(i8* %a, i8 0, i64 1)
90define void @test_memset2(i8* %a) {
91entry:
92 call void @my_memset(i8* %a, i8 0, i64 1)
93 ret void
94}
95
96; CHECK: Alias sets for function 'test_memset3':
97; CHECK-NEXT: Alias Set Tracker: 1 alias sets for 0 pointer values.
98; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
99; CHECK-NEXT: 2 Unknown instructions: call void @my_memset(i8* %a, i8 0, i64 1), call void @my_memset(i8* %b, i8 0, i64 1)
100define void @test_memset3(i8* %a, i8* %b) {
101entry:
102 call void @my_memset(i8* %a, i8 0, i64 1)
103 call void @my_memset(i8* %b, i8 0, i64 1)
104 ret void
105}
106
107; CHECK: Alias sets for function 'test_memset4':
108; CHECK-NEXT: Alias Set Tracker: 2 alias sets for 0 pointer values.
109; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
110; CHECK-NEXT: 1 Unknown instructions: call void @my_memset(i8* %a, i8 0, i64 1)
111; CHECK-NEXT: AliasSet[0x{{[0-9a-f]+}}, 1] may alias, Mod/Ref
112; CHECK-NEXT: 1 Unknown instructions: call void @my_memset(i8* %b, i8 0, i64 1)
113define void @test_memset4(i8* noalias %a, i8* noalias %b) {
114entry:
115 call void @my_memset(i8* %a, i8 0, i64 1)
116 call void @my_memset(i8* %b, i8 0, i64 1)
117 ret void
118}
119
120declare void @my_memset(i8* nocapture writeonly, i8, i64) argmemonly
121declare void @my_memcpy(i8* nocapture writeonly, i8* nocapture readonly, i64) argmemonly
122declare void @my_memmove(i8* nocapture, i8* nocapture readonly, i64) argmemonly