blob: 870794c251656eac9ff487232b8c1b7cfebdd25c [file] [log] [blame]
Hal Finkel354e23b2014-07-17 01:28:25 +00001; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
3target triple = "arm-apple-ios"
4
Pete Cooper67cf9a72015-11-19 05:56:52 +00005declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
6declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
Hal Finkel354e23b2014-07-17 01:28:25 +00007
8declare void @a_readonly_func(i8 *) noinline nounwind readonly
Nicolai Haehnle84c9f992016-07-04 08:01:29 +00009declare void @a_writeonly_func(i8 *) noinline nounwind writeonly
Hal Finkel354e23b2014-07-17 01:28:25 +000010
Hal Finkel354e23b2014-07-17 01:28:25 +000011define void @test2(i8* %P, i8* %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +000012 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
13 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000014 ret void
15
16; CHECK-LABEL: Function: test2:
17
18; CHECK: MayAlias: i8* %P, i8* %Q
Bryant Wonga07d9b12016-12-25 22:42:27 +000019; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
20; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
21; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
22; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
23; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
24; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000025}
26
27define void @test2a(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +000028 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
29 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000030 ret void
31
32; CHECK-LABEL: Function: test2a:
33
34; CHECK: NoAlias: i8* %P, i8* %Q
Pete Cooper67cf9a72015-11-19 05:56:52 +000035; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
36; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
37; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
38; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
39; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
40; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000041}
42
43define void @test2b(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +000044 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000045 %R = getelementptr i8, i8* %P, i64 12
Pete Cooper67cf9a72015-11-19 05:56:52 +000046 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000047 ret void
48
49; CHECK-LABEL: Function: test2b:
50
51; CHECK: NoAlias: i8* %P, i8* %Q
52; CHECK: NoAlias: i8* %P, i8* %R
53; CHECK: NoAlias: i8* %Q, i8* %R
Pete Cooper67cf9a72015-11-19 05:56:52 +000054; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
55; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
56; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
57; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
58; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
59; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
60; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
61; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000062}
63
64define void @test2c(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +000065 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000066 %R = getelementptr i8, i8* %P, i64 11
Pete Cooper67cf9a72015-11-19 05:56:52 +000067 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000068 ret void
69
70; CHECK-LABEL: Function: test2c:
71
72; CHECK: NoAlias: i8* %P, i8* %Q
73; CHECK: NoAlias: i8* %P, i8* %R
74; CHECK: NoAlias: i8* %Q, i8* %R
Pete Cooper67cf9a72015-11-19 05:56:52 +000075; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
76; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
77; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
78; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
79; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
80; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
81; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
82; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000083}
84
85define void @test2d(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +000086 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000087 %R = getelementptr i8, i8* %P, i64 -12
Pete Cooper67cf9a72015-11-19 05:56:52 +000088 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000089 ret void
90
91; CHECK-LABEL: Function: test2d:
92
93; CHECK: NoAlias: i8* %P, i8* %Q
94; CHECK: NoAlias: i8* %P, i8* %R
95; CHECK: NoAlias: i8* %Q, i8* %R
Pete Cooper67cf9a72015-11-19 05:56:52 +000096; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
97; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
98; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
99; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
100; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
101; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
102; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
103; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000104}
105
106define void @test2e(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000107 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +0000108 %R = getelementptr i8, i8* %P, i64 -11
Pete Cooper67cf9a72015-11-19 05:56:52 +0000109 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000110 ret void
111
112; CHECK-LABEL: Function: test2e:
113
114; CHECK: NoAlias: i8* %P, i8* %Q
115; CHECK: NoAlias: i8* %P, i8* %R
116; CHECK: NoAlias: i8* %Q, i8* %R
Pete Cooper67cf9a72015-11-19 05:56:52 +0000117; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
118; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
119; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
120; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
121; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
122; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
123; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false)
124; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000125}
126
127define void @test3(i8* %P, i8* %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000128 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
129 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000130 ret void
131
132; CHECK-LABEL: Function: test3:
133
134; CHECK: MayAlias: i8* %P, i8* %Q
Bryant Wonga07d9b12016-12-25 22:42:27 +0000135; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
136; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
137; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
138; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
139; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
140; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000141}
142
143define void @test3a(i8* noalias %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000144 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
145 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000146 ret void
147
148; CHECK-LABEL: Function: test3a:
149
150; CHECK: NoAlias: i8* %P, i8* %Q
Pete Cooper67cf9a72015-11-19 05:56:52 +0000151; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
152; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
153; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
154; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
155; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
156; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000157}
158
159define void @test4(i8* %P, i8* noalias %Q) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000160 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
161 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000162 ret void
163
164; CHECK-LABEL: Function: test4:
165
166; CHECK: NoAlias: i8* %P, i8* %Q
Pete Cooper67cf9a72015-11-19 05:56:52 +0000167; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
168; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
169; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
170; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
171; CHECK: Just Mod: tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
172; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000173}
174
175define void @test5(i8* %P, i8* %Q, i8* %R) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000176 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
177 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000178 ret void
179
180; CHECK-LABEL: Function: test5:
181
182; CHECK: MayAlias: i8* %P, i8* %Q
183; CHECK: MayAlias: i8* %P, i8* %R
184; CHECK: MayAlias: i8* %Q, i8* %R
Bryant Wonga07d9b12016-12-25 22:42:27 +0000185; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
186; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Pete Cooper67cf9a72015-11-19 05:56:52 +0000187; CHECK: Both ModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Bryant Wonga07d9b12016-12-25 22:42:27 +0000188; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
Pete Cooper67cf9a72015-11-19 05:56:52 +0000189; CHECK: Both ModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
Bryant Wonga07d9b12016-12-25 22:42:27 +0000190; CHECK: Just Ref: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
191; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false)
192; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i32 1, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i32 1, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000193}
194
195define void @test6(i8* %P) nounwind ssp {
Pete Cooper67cf9a72015-11-19 05:56:52 +0000196 call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000197 call void @a_readonly_func(i8* %P)
198 ret void
199
200; CHECK-LABEL: Function: test6:
201
Pete Cooper67cf9a72015-11-19 05:56:52 +0000202; CHECK: Just Mod: Ptr: i8* %P <-> call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000203; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
Pete Cooper67cf9a72015-11-19 05:56:52 +0000204; CHECK: Just Mod: call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false) <-> call void @a_readonly_func(i8* %P)
205; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @llvm.memset.p0i8.i64(i8* %P, i8 -51, i64 32, i32 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000206}
207
Nicolai Haehnle84c9f992016-07-04 08:01:29 +0000208define void @test7(i8* %P) nounwind ssp {
209 call void @a_writeonly_func(i8* %P)
210 call void @a_readonly_func(i8* %P)
211 ret void
212
213; CHECK-LABEL: Function: test7:
214
215; CHECK: Just Mod: Ptr: i8* %P <-> call void @a_writeonly_func(i8* %P)
216; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
217; CHECK: Just Mod: call void @a_writeonly_func(i8* %P) <-> call void @a_readonly_func(i8* %P)
218; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @a_writeonly_func(i8* %P)
219}
220
Justin Bognerb7132662017-05-13 00:12:52 +0000221declare void @an_inaccessiblememonly_func() nounwind inaccessiblememonly
222declare void @an_inaccessibleorargmemonly_func(i8 *) nounwind inaccessiblemem_or_argmemonly
223declare void @an_argmemonly_func(i8 *) nounwind argmemonly
Igor Laevsky30143ae2015-08-13 17:40:04 +0000224
Andrew Kaylor9604f342016-11-08 21:07:42 +0000225define void @test8(i8* %p) {
226entry:
227 %q = getelementptr i8, i8* %p, i64 16
228 call void @a_readonly_func(i8* %p)
229 call void @an_inaccessiblememonly_func()
230 call void @a_writeonly_func(i8* %q)
231 call void @an_inaccessiblememonly_func()
232 call void @an_inaccessibleorargmemonly_func(i8* %q)
233 call void @an_argmemonly_func(i8* %q)
Justin Bognerb7132662017-05-13 00:12:52 +0000234 ret void
Andrew Kaylor9604f342016-11-08 21:07:42 +0000235
236; CHECK-LABEL: Function: test8
237; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func()
238; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func()
239; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
240; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
241; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q)
242; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q)
243; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessiblememonly_func()
244; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
245; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_argmemonly_func(i8* %q)
246; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_readonly_func(i8* %p)
247; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_writeonly_func(i8* %q)
248; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessiblememonly_func()
249; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
250; CHECK: NoModRef: call void @an_inaccessiblememonly_func() <-> call void @an_argmemonly_func(i8* %q)
251; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
252; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
253; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_argmemonly_func(i8* %q)
254; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
255; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
256; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
257; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @an_argmemonly_func(i8* %q)
258; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
259; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
260; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
261; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
262}