blob: 0883db024f223b0a929d463dcd54e8ed4db15b8d [file] [log] [blame]
Fangrui Songf31811f2020-06-26 20:41:37 -07001; RUN: opt -basic-aa -print-alias-sets -S -o - < %s 2>&1 | FileCheck %s
Chad Rosier6e3a92e2016-10-19 19:09:03 +00002
3@s = global i8 1, align 1
4@d = global i8 2, align 1
5
Philip Reames96bc0762018-08-17 23:17:31 +00006
7; CHECK: Alias sets for function 'test_known_size':
8; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +00009; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %d, LocationSize::precise(1))
10; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Pointers: (i8* %s, LocationSize::precise(1))
Philip Reames96bc0762018-08-17 23:17:31 +000011define void @test_known_size(i8* noalias %s, i8* noalias %d) {
12entry:
13 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false)
14 ret void
15}
16
17; CHECK: Alias sets for function 'test_unknown_size':
18; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
Philip Reames96bc0762018-08-17 23:17:31 +000019; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %d, unknown)
Philip Reames5660bd42018-09-10 16:00:27 +000020; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Ref Pointers: (i8* %s, unknown)
Philip Reames96bc0762018-08-17 23:17:31 +000021define void @test_unknown_size(i8* noalias %s, i8* noalias %d, i64 %len) {
22entry:
23 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 %len, i1 false)
24 ret void
25}
26
27
Chad Rosier6e3a92e2016-10-19 19:09:03 +000028; CHECK: Alias sets for function 'test1':
29; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +000030; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000031; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +000032; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
33; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000034define void @test1(i8* %s, i8* %d) {
35entry:
36 %a = alloca i8, align 1
37 %b = alloca i8, align 1
38 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +000039 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false)
Chad Rosier6e3a92e2016-10-19 19:09:03 +000040 store i8 1, i8* %b, align 1
41 ret void
42}
43
Daniel Neilson6b23fb72018-05-30 14:43:39 +000044; CHECK: Alias sets for function 'test1_atomic':
45; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +000046; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +000047; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +000048; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
49; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +000050define void @test1_atomic(i8* %s, i8* %d) {
51entry:
52 %a = alloca i8, align 1
53 %b = alloca i8, align 1
54 store atomic i8 1, i8* %a unordered, align 1
55 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %d, i8* align 1 %s, i64 1, i32 1)
56 store atomic i8 1, i8* %b unordered, align 1
57 ret void
58}
59
Chad Rosier6e3a92e2016-10-19 19:09:03 +000060; CHECK: Alias sets for function 'test2':
61; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +000062; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000063; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +000064; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
65; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000066define void @test2(i8* %s, i8* %d) {
67entry:
68 %a = alloca i8, align 1
69 %b = alloca i8, align 1
70 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +000071 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 true)
Chad Rosier6e3a92e2016-10-19 19:09:03 +000072 store i8 1, i8* %b, align 1
73 ret void
74}
75
76; CHECK: Alias sets for function 'test3':
77; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +000078; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000079; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +000080; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
81; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +000082define void @test3(i8* %s, i8* %d) {
83entry:
84 %a = alloca i8, align 1
85 %b = alloca i8, align 1
86 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +000087 call void @llvm.memmove.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 false)
Chad Rosier6e3a92e2016-10-19 19:09:03 +000088 store i8 1, i8* %b, align 1
89 ret void
90}
91
Daniel Neilson6b23fb72018-05-30 14:43:39 +000092; CHECK: Alias sets for function 'test3_atomic':
93; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +000094; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +000095; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +000096; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
97; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +000098define void @test3_atomic(i8* %s, i8* %d) {
99entry:
100 %a = alloca i8, align 1
101 %b = alloca i8, align 1
102 store atomic i8 1, i8* %a unordered, align 1
103 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %d, i8* align 1 %s, i64 1, i32 1)
104 store atomic i8 1, i8* %b unordered, align 1
105 ret void
106}
107
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000108; CHECK: Alias sets for function 'test4':
109; CHECK: Alias Set Tracker: 3 alias sets for 4 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000110; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %a, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000111; CHECK-NOT: 1 Unknown instructions
George Burgess IVd98d5052018-10-10 01:35:22 +0000112; CHECK: AliasSet[0x{{[0-9a-f]+}}, 2] may alias, Mod/Ref Pointers: (i8* %d, LocationSize::precise(1)), (i8* %s, LocationSize::precise(1))
113; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000114define void @test4(i8* %s, i8* %d) {
115entry:
116 %a = alloca i8, align 1
117 %b = alloca i8, align 1
118 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +0000119 call void @llvm.memmove.p0i8.p0i8.i64(i8* %d, i8* %s, i64 1, i1 true)
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000120 store i8 1, i8* %b, align 1
121 ret void
122}
123
124; CHECK: Alias sets for function 'test5':
125; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000126; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
127; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000128define void @test5() {
129entry:
130 %a = alloca i8, align 1
131 %b = alloca i8, align 1
132 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +0000133 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false)
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000134 store i8 1, i8* %b, align 1
135 ret void
136}
137
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000138; CHECK: Alias sets for function 'test5_atomic':
139; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000140; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
141; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000142define void @test5_atomic() {
143entry:
144 %a = alloca i8, align 1
145 %b = alloca i8, align 1
146 store atomic i8 1, i8* %a unordered, align 1
147 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1)
148 store atomic i8 1, i8* %b unordered, align 1
149 ret void
150}
151
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000152; CHECK: Alias sets for function 'test6':
153; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000154; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
155; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000156define void @test6() {
157entry:
158 %a = alloca i8, align 1
159 %b = alloca i8, align 1
160 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +0000161 call void @llvm.memmove.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false)
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000162 store i8 1, i8* %b, align 1
163 ret void
164}
165
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000166; CHECK: Alias sets for function 'test6_atomic':
167; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000168; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
169; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod Pointers: (i8* %b, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000170define void @test6_atomic() {
171entry:
172 %a = alloca i8, align 1
173 %b = alloca i8, align 1
174 store atomic i8 1, i8* %a unordered, align 1
175 call void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1)
176 store atomic i8 1, i8* %b unordered, align 1
177 ret void
178}
179
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000180; CHECK: Alias sets for function 'test7':
181; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000182; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
183; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %b, LocationSize::precise(1))
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000184define void @test7() {
185entry:
186 %a = alloca i8, align 1
187 %b = alloca i8, align 1
188 store i8 1, i8* %a, align 1
Daniel Neilson1e687242018-01-19 17:13:12 +0000189 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %b, i8* %a, i64 1, i1 false)
190 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %a, i8* %b, i64 1, i1 false)
Chad Rosier6e3a92e2016-10-19 19:09:03 +0000191 store i8 1, i8* %b, align 1
192 ret void
193}
194
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000195; CHECK: Alias sets for function 'test7_atomic':
196; CHECK: Alias Set Tracker: 2 alias sets for 2 pointer values.
George Burgess IVd98d5052018-10-10 01:35:22 +0000197; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %a, LocationSize::precise(1))
198; CHECK: AliasSet[0x{{[0-9a-f]+}}, 1] must alias, Mod/Ref Pointers: (i8* %b, LocationSize::precise(1))
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000199define void @test7_atomic() {
200entry:
201 %a = alloca i8, align 1
202 %b = alloca i8, align 1
203 store atomic i8 1, i8* %a unordered, align 1
204 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %b, i8* align 1 %a, i64 1, i32 1)
205 call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %a, i8* align 1 %b, i64 1, i32 1)
206 store atomic i8 1, i8* %b unordered, align 1
207 ret void
208}
209
Daniel Neilson1e687242018-01-19 17:13:12 +0000210declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1)
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000211declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32)
Daniel Neilson1e687242018-01-19 17:13:12 +0000212declare void @llvm.memmove.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1)
Daniel Neilson6b23fb72018-05-30 14:43:39 +0000213declare void @llvm.memmove.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32)