blob: 314aff849f93633e0b5dd1d7748aa9238106f915 [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
Daniel Neilson1e687242018-01-19 17:13:12 +00005declare void @llvm.memset.p0i8.i64(i8* nocapture writeonly, i8, i64, i1) #0
6declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i1) #0
Hal Finkel354e23b2014-07-17 01:28:25 +00007
Yichao Yu6fefc0d2017-11-02 12:18:33 +00008declare void @a_readonly_func(i8*) #1
9declare void @a_writeonly_func(i8*) #2
Hal Finkel354e23b2014-07-17 01:28:25 +000010
Yichao Yu6fefc0d2017-11-02 12:18:33 +000011define void @test2(i8* %P, i8* %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000012 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
13 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +000019; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
20; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
21; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
22; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
23; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
24; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000025}
26
Yichao Yu6fefc0d2017-11-02 12:18:33 +000027define void @test2a(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000028 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
29 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +000035; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
36; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
37; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
38; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
39; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
40; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000041}
42
Yichao Yu6fefc0d2017-11-02 12:18:33 +000043define void @test2b(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000044 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000045 %R = getelementptr i8, i8* %P, i64 12
Daniel Neilson1e687242018-01-19 17:13:12 +000046 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +000054; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
55; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
56; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
57; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
58; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
59; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
60; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
61; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000062}
63
Yichao Yu6fefc0d2017-11-02 12:18:33 +000064define void @test2c(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000065 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000066 %R = getelementptr i8, i8* %P, i64 11
Daniel Neilson1e687242018-01-19 17:13:12 +000067 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +000075; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
76; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
77; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
78; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
79; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
80; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
81; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
82; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000083}
84
Yichao Yu6fefc0d2017-11-02 12:18:33 +000085define void @test2d(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000086 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000087 %R = getelementptr i8, i8* %P, i64 -12
Daniel Neilson1e687242018-01-19 17:13:12 +000088 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +000096; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
97; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
98; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
99; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
100; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
101; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
102; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
103; CHECK: NoModRef: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000104}
105
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000106define void @test2e(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000107 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +0000108 %R = getelementptr i8, i8* %P, i64 -11
Daniel Neilson1e687242018-01-19 17:13:12 +0000109 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +0000117; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
118; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
119; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
120; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
121; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
122; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
123; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
124; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000125}
126
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000127define void @test3(i8* %P, i8* %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000128 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
129 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +0000135; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
136; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
137; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
138; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
139; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
140; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000141}
142
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000143define void @test3a(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000144 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
145 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +0000151; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
152; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
153; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
154; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
155; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
156; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000157}
158
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000159define void @test4(i8* %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000160 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
161 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +0000167; CHECK: Just Mod (MustAlias): Ptr: i8* %P <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
168; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
169; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
170; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
171; CHECK: Just Mod: tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
172; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000173}
174
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000175define void @test5(i8* %P, i8* %Q, i8* %R) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000176 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
177 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, 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
Daniel Neilson1e687242018-01-19 17:13:12 +0000185; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
186; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
187; CHECK: Both ModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
188; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
189; CHECK: Both ModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
190; CHECK: Just Ref: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
191; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
192; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000193}
194
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000195define void @test5a(i8* noalias %P, i8* noalias %Q, i8* noalias %R) nounwind ssp {
Daniel Neilson1e687242018-01-19 17:13:12 +0000196 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
197 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000198 ret void
199
200; CHECK-LABEL: Function: test5a:
201
202; CHECK: NoAlias: i8* %P, i8* %Q
203; CHECK: NoAlias: i8* %P, i8* %R
204; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +0000205; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
206; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
207; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
208; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
209; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
210; CHECK: Just Ref: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
211; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
212; CHECK: Just Mod: tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000213}
214
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000215define void @test6(i8* %P) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000216 call void @llvm.memset.p0i8.i64(i8* align 8 %P, i8 -51, i64 32, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000217 call void @a_readonly_func(i8* %P)
218 ret void
219
220; CHECK-LABEL: Function: test6:
221
Daniel Neilson1e687242018-01-19 17:13:12 +0000222; CHECK: Just Mod (MustAlias): Ptr: i8* %P <-> call void @llvm.memset.p0i8.i64(i8* align 8 %P, i8 -51, i64 32, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000223; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
Daniel Neilson1e687242018-01-19 17:13:12 +0000224; CHECK: Just Mod: call void @llvm.memset.p0i8.i64(i8* align 8 %P, i8 -51, i64 32, i1 false) <-> call void @a_readonly_func(i8* %P)
225; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @llvm.memset.p0i8.i64(i8* align 8 %P, i8 -51, i64 32, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000226}
227
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000228define void @test7(i8* %P) #3 {
Nicolai Haehnle84c9f992016-07-04 08:01:29 +0000229 call void @a_writeonly_func(i8* %P)
230 call void @a_readonly_func(i8* %P)
231 ret void
232
233; CHECK-LABEL: Function: test7:
234
235; CHECK: Just Mod: Ptr: i8* %P <-> call void @a_writeonly_func(i8* %P)
236; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
237; CHECK: Just Mod: call void @a_writeonly_func(i8* %P) <-> call void @a_readonly_func(i8* %P)
238; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @a_writeonly_func(i8* %P)
239}
240
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000241declare void @an_inaccessiblememonly_func() #4
242declare void @an_inaccessibleorargmemonly_func(i8*) #5
243declare void @an_argmemonly_func(i8*) #0
Igor Laevsky30143ae2015-08-13 17:40:04 +0000244
Andrew Kaylor9604f342016-11-08 21:07:42 +0000245define void @test8(i8* %p) {
246entry:
247 %q = getelementptr i8, i8* %p, i64 16
248 call void @a_readonly_func(i8* %p)
249 call void @an_inaccessiblememonly_func()
250 call void @a_writeonly_func(i8* %q)
251 call void @an_inaccessiblememonly_func()
252 call void @an_inaccessibleorargmemonly_func(i8* %q)
253 call void @an_argmemonly_func(i8* %q)
Justin Bognerb7132662017-05-13 00:12:52 +0000254 ret void
Andrew Kaylor9604f342016-11-08 21:07:42 +0000255
256; CHECK-LABEL: Function: test8
257; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func()
258; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func()
259; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000260; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000261; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000262; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000263; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessiblememonly_func()
264; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
265; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_argmemonly_func(i8* %q)
266; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_readonly_func(i8* %p)
267; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_writeonly_func(i8* %q)
268; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessiblememonly_func()
269; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
270; CHECK: NoModRef: call void @an_inaccessiblememonly_func() <-> call void @an_argmemonly_func(i8* %q)
271; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
272; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
273; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_argmemonly_func(i8* %q)
274; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
275; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
276; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000277; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @an_argmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000278; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
279; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
280; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000281; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000282}
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000283
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000284;; test that MustAlias is set for calls when no MayAlias is found.
285declare void @another_argmemonly_func(i8*, i8*) #0
286define void @test8a(i8* noalias %p, i8* noalias %q) {
287entry:
288 call void @another_argmemonly_func(i8* %p, i8* %q)
289 ret void
290
291; CHECK-LABEL: Function: test8a
292; CHECK: Both ModRef: Ptr: i8* %p <-> call void @another_argmemonly_func(i8* %p, i8* %q)
293; CHECK: Both ModRef: Ptr: i8* %q <-> call void @another_argmemonly_func(i8* %p, i8* %q)
294}
295define void @test8b(i8* %p, i8* %q) {
296entry:
297 call void @another_argmemonly_func(i8* %p, i8* %q)
298 ret void
299
300; CHECK-LABEL: Function: test8b
301; CHECK: Both ModRef: Ptr: i8* %p <-> call void @another_argmemonly_func(i8* %p, i8* %q)
302; CHECK: Both ModRef: Ptr: i8* %q <-> call void @another_argmemonly_func(i8* %p, i8* %q)
303}
304
305
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000306;; test that unknown operand bundle has unknown effect to the heap
307define void @test9(i8* %p) {
308; CHECK-LABEL: Function: test9
309entry:
310 %q = getelementptr i8, i8* %p, i64 16
311 call void @a_readonly_func(i8* %p) [ "unknown"() ]
312 call void @an_inaccessiblememonly_func() [ "unknown"() ]
313 call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
314 call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
315 ret void
316
317; CHECK: Both ModRef: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
318; CHECK: Both ModRef: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
319; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
320; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
321; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
322; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
323; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
324; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
325; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
326; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
327; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
328; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
329; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
330; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
331; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
332; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
333; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
334; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
335; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
336; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
337}
338
339;; test callsite overwrite of unknown operand bundle
340define void @test10(i8* %p) {
341; CHECK-LABEL: Function: test10
342entry:
343 %q = getelementptr i8, i8* %p, i64 16
344 call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
345 call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
346 call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
347 call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
348 ret void
349
350; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
351; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
352; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
353; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
354; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000355; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000356; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000357; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000358; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
359; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
360; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #6 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
361; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
362; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
363; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #7 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
364; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
365; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000366; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000367; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
368; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000369; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000370}
371
372attributes #0 = { argmemonly nounwind }
373attributes #1 = { noinline nounwind readonly }
374attributes #2 = { noinline nounwind writeonly }
375attributes #3 = { nounwind ssp }
376attributes #4 = { inaccessiblememonly nounwind }
377attributes #5 = { inaccessiblemem_or_argmemonly nounwind }
378attributes #6 = { readonly }
379attributes #7 = { inaccessiblememonly }
380attributes #8 = { inaccessiblemem_or_argmemonly }
381attributes #9 = { argmemonly }