blob: 28fc8febd608de8089740c39bb2eedfa93580673 [file] [log] [blame]
Florian Hahn0b21d552020-01-16 10:25:29 +00001; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -S 2>&1 | FileCheck %s
Hal Finkel354e23b2014-07-17 01:28:25 +00002target 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
Daniel Neilson3a6c50f2018-05-29 19:23:50 +00007declare void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* nocapture writeonly, i8* nocapture readonly, i64, i32) #0
Hal Finkel354e23b2014-07-17 01:28:25 +00008
Yichao Yu6fefc0d2017-11-02 12:18:33 +00009declare void @a_readonly_func(i8*) #1
10declare void @a_writeonly_func(i8*) #2
Hal Finkel354e23b2014-07-17 01:28:25 +000011
Yichao Yu6fefc0d2017-11-02 12:18:33 +000012define void @test2(i8* %P, i8* %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000013 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
14 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000015 ret void
16
17; CHECK-LABEL: Function: test2:
18
19; CHECK: MayAlias: i8* %P, i8* %Q
Daniel Neilson1e687242018-01-19 17:13:12 +000020; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
21; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
22; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
23; CHECK: Just Ref: Ptr: i8* %Q <-> 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)
25; 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 +000026}
27
Daniel Neilson3a6c50f2018-05-29 19:23:50 +000028define void @test2_atomic(i8* %P, i8* %Q) #3 {
29 tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
30 tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
31 ret void
32
33; CHECK-LABEL: Function: test2_atomic:
34
35; CHECK: MayAlias: i8* %P, i8* %Q
36; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
37; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
38; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
39; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
40; CHECK: Just Mod: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1) <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
41; CHECK: Just Mod: tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1) <-> tail call void @llvm.memcpy.element.unordered.atomic.p0i8.p0i8.i64(i8* align 1 %P, i8* align 1 %Q, i64 12, i32 1)
42}
43
Yichao Yu6fefc0d2017-11-02 12:18:33 +000044define void @test2a(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000045 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
46 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000047 ret void
48
49; CHECK-LABEL: Function: test2a:
50
51; CHECK: NoAlias: i8* %P, i8* %Q
Daniel Neilson1e687242018-01-19 17:13:12 +000052; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
53; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
54; 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: 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)
57; 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 +000058}
59
Yichao Yu6fefc0d2017-11-02 12:18:33 +000060define void @test2b(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000061 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000062 %R = getelementptr i8, i8* %P, i64 12
Daniel Neilson1e687242018-01-19 17:13:12 +000063 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000064 ret void
65
66; CHECK-LABEL: Function: test2b:
67
68; CHECK: NoAlias: i8* %P, i8* %Q
69; CHECK: NoAlias: i8* %P, i8* %R
70; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +000071; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
72; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
73; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
74; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
75; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
76; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
77; 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)
78; 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 +000079}
80
Yichao Yu6fefc0d2017-11-02 12:18:33 +000081define void @test2c(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +000082 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +000083 %R = getelementptr i8, i8* %P, i64 11
Daniel Neilson1e687242018-01-19 17:13:12 +000084 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +000085 ret void
86
87; CHECK-LABEL: Function: test2c:
88
89; CHECK: NoAlias: i8* %P, i8* %Q
90; CHECK: NoAlias: i8* %P, i8* %R
91; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +000092; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
93; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
94; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
95; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
96; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
97; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
98; 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)
99; 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 +0000100}
101
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000102define void @test2d(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000103 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +0000104 %R = getelementptr i8, i8* %P, i64 -12
Daniel Neilson1e687242018-01-19 17:13:12 +0000105 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000106 ret void
107
108; CHECK-LABEL: Function: test2d:
109
110; CHECK: NoAlias: i8* %P, i8* %Q
111; CHECK: NoAlias: i8* %P, i8* %R
112; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +0000113; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
114; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
115; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
116; CHECK: NoModRef: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
117; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
118; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
119; 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)
120; 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 +0000121}
122
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000123define void @test2e(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000124 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
David Blaikie79e6c742015-02-27 19:29:02 +0000125 %R = getelementptr i8, i8* %P, i64 -11
Daniel Neilson1e687242018-01-19 17:13:12 +0000126 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000127 ret void
128
129; CHECK-LABEL: Function: test2e:
130
131; CHECK: NoAlias: i8* %P, i8* %Q
132; CHECK: NoAlias: i8* %P, i8* %R
133; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +0000134; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
135; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
136; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
137; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
138; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, i8* %Q, i64 12, i1 false)
139; CHECK: Just Mod: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %R, 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* %R, i8* %Q, i64 12, i1 false)
141; 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 +0000142}
143
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000144define void @test3(i8* %P, i8* %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000145 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
146 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000147 ret void
148
149; CHECK-LABEL: Function: test3:
150
151; CHECK: MayAlias: i8* %P, i8* %Q
Daniel Neilson1e687242018-01-19 17:13:12 +0000152; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
153; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
154; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
155; CHECK: Just Ref: Ptr: i8* %Q <-> 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 8, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
157; 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 +0000158}
159
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000160define void @test3a(i8* noalias %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000161 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
162 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000163 ret void
164
165; CHECK-LABEL: Function: test3a:
166
167; CHECK: NoAlias: i8* %P, i8* %Q
Daniel Neilson1e687242018-01-19 17:13:12 +0000168; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
169; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 8, i1 false)
170; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
171; CHECK: Just Ref: Ptr: i8* %Q <-> 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 8, i1 false) <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
173; 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 +0000174}
175
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000176define void @test4(i8* %P, i8* noalias %Q) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000177 tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
178 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000179 ret void
180
181; CHECK-LABEL: Function: test4:
182
183; CHECK: NoAlias: i8* %P, i8* %Q
Daniel Neilson1e687242018-01-19 17:13:12 +0000184; CHECK: Just Mod (MustAlias): Ptr: i8* %P <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
185; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.memset.p0i8.i64(i8* %P, i8 42, i64 8, i1 false)
186; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
187; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
188; 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)
189; 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 +0000190}
191
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000192define void @test5(i8* %P, i8* %Q, i8* %R) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000193 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
194 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000195 ret void
196
197; CHECK-LABEL: Function: test5:
198
199; CHECK: MayAlias: i8* %P, i8* %Q
200; CHECK: MayAlias: i8* %P, i8* %R
201; CHECK: MayAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +0000202; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
203; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
204; CHECK: Both ModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
205; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
206; CHECK: Both ModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
207; CHECK: Just Ref: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
208; 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)
209; 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 +0000210}
211
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000212define void @test5a(i8* noalias %P, i8* noalias %Q, i8* noalias %R) nounwind ssp {
Daniel Neilson1e687242018-01-19 17:13:12 +0000213 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
214 tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000215 ret void
216
217; CHECK-LABEL: Function: test5a:
218
219; CHECK: NoAlias: i8* %P, i8* %Q
220; CHECK: NoAlias: i8* %P, i8* %R
221; CHECK: NoAlias: i8* %Q, i8* %R
Daniel Neilson1e687242018-01-19 17:13:12 +0000222; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
223; CHECK: Just Ref: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
224; CHECK: NoModRef: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %Q, i64 12, i1 false)
225; CHECK: Just Mod: Ptr: i8* %P <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
226; CHECK: NoModRef: Ptr: i8* %Q <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
227; CHECK: Just Ref: Ptr: i8* %R <-> tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %R, i64 12, i1 false)
228; 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)
229; 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 +0000230}
231
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000232define void @test6(i8* %P) #3 {
Daniel Neilson1e687242018-01-19 17:13:12 +0000233 call void @llvm.memset.p0i8.i64(i8* align 8 %P, i8 -51, i64 32, i1 false)
Hal Finkel354e23b2014-07-17 01:28:25 +0000234 call void @a_readonly_func(i8* %P)
235 ret void
236
237; CHECK-LABEL: Function: test6:
238
Daniel Neilson1e687242018-01-19 17:13:12 +0000239; 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 +0000240; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
Daniel Neilson1e687242018-01-19 17:13:12 +0000241; 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)
242; 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 +0000243}
244
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000245define void @test7(i8* %P) #3 {
Nicolai Haehnle84c9f992016-07-04 08:01:29 +0000246 call void @a_writeonly_func(i8* %P)
247 call void @a_readonly_func(i8* %P)
248 ret void
249
250; CHECK-LABEL: Function: test7:
251
252; CHECK: Just Mod: Ptr: i8* %P <-> call void @a_writeonly_func(i8* %P)
253; CHECK: Just Ref: Ptr: i8* %P <-> call void @a_readonly_func(i8* %P)
254; CHECK: Just Mod: call void @a_writeonly_func(i8* %P) <-> call void @a_readonly_func(i8* %P)
255; CHECK: Just Ref: call void @a_readonly_func(i8* %P) <-> call void @a_writeonly_func(i8* %P)
256}
257
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000258declare void @an_inaccessiblememonly_func() #4
259declare void @an_inaccessibleorargmemonly_func(i8*) #5
260declare void @an_argmemonly_func(i8*) #0
Igor Laevsky30143ae2015-08-13 17:40:04 +0000261
Andrew Kaylor9604f342016-11-08 21:07:42 +0000262define void @test8(i8* %p) {
263entry:
264 %q = getelementptr i8, i8* %p, i64 16
265 call void @a_readonly_func(i8* %p)
266 call void @an_inaccessiblememonly_func()
267 call void @a_writeonly_func(i8* %q)
268 call void @an_inaccessiblememonly_func()
269 call void @an_inaccessibleorargmemonly_func(i8* %q)
270 call void @an_argmemonly_func(i8* %q)
Justin Bognerb7132662017-05-13 00:12:52 +0000271 ret void
Andrew Kaylor9604f342016-11-08 21:07:42 +0000272
273; CHECK-LABEL: Function: test8
274; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func()
275; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func()
276; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000277; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000278; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q)
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000279; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q)
Andrew Kaylor9604f342016-11-08 21:07:42 +0000280; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessiblememonly_func()
281; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
282; CHECK: Just Ref: call void @a_readonly_func(i8* %p) <-> call void @an_argmemonly_func(i8* %q)
283; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_readonly_func(i8* %p)
284; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @a_writeonly_func(i8* %q)
285; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessiblememonly_func()
286; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
287; CHECK: NoModRef: call void @an_inaccessiblememonly_func() <-> call void @an_argmemonly_func(i8* %q)
288; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
289; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_inaccessibleorargmemonly_func(i8* %q)
290; CHECK: Just Mod: call void @a_writeonly_func(i8* %q) <-> call void @an_argmemonly_func(i8* %q)
291; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
292; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
293; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000294; 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 +0000295; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_readonly_func(i8* %p)
296; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) <-> call void @a_writeonly_func(i8* %q)
297; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) <-> call void @an_inaccessiblememonly_func()
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000298; 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 +0000299}
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000300
Alina Sbirlea50db8a22017-12-21 21:41:53 +0000301;; test that MustAlias is set for calls when no MayAlias is found.
302declare void @another_argmemonly_func(i8*, i8*) #0
303define void @test8a(i8* noalias %p, i8* noalias %q) {
304entry:
305 call void @another_argmemonly_func(i8* %p, i8* %q)
306 ret void
307
308; CHECK-LABEL: Function: test8a
309; CHECK: Both ModRef: Ptr: i8* %p <-> call void @another_argmemonly_func(i8* %p, i8* %q)
310; CHECK: Both ModRef: Ptr: i8* %q <-> call void @another_argmemonly_func(i8* %p, i8* %q)
311}
312define void @test8b(i8* %p, i8* %q) {
313entry:
314 call void @another_argmemonly_func(i8* %p, i8* %q)
315 ret void
316
317; CHECK-LABEL: Function: test8b
318; CHECK: Both ModRef: Ptr: i8* %p <-> call void @another_argmemonly_func(i8* %p, i8* %q)
319; CHECK: Both ModRef: Ptr: i8* %q <-> call void @another_argmemonly_func(i8* %p, i8* %q)
320}
321
322
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000323;; test that unknown operand bundle has unknown effect to the heap
324define void @test9(i8* %p) {
325; CHECK-LABEL: Function: test9
326entry:
327 %q = getelementptr i8, i8* %p, i64 16
328 call void @a_readonly_func(i8* %p) [ "unknown"() ]
329 call void @an_inaccessiblememonly_func() [ "unknown"() ]
330 call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
331 call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
332 ret void
333
334; CHECK: Both ModRef: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
335; CHECK: Both ModRef: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
336; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
337; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
338; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
339; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
340; CHECK: Both ModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
341; CHECK: Both ModRef: Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
342; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
343; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
344; CHECK: Both ModRef: call void @a_readonly_func(i8* %p) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
345; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
346; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
347; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
348; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
349; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
350; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) [ "unknown"() ]
351; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) [ "unknown"() ]
352; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() [ "unknown"() ]
353; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) [ "unknown"() ]
354}
355
356;; test callsite overwrite of unknown operand bundle
357define void @test10(i8* %p) {
358; CHECK-LABEL: Function: test10
359entry:
360 %q = getelementptr i8, i8* %p, i64 16
361 call void @a_readonly_func(i8* %p) #6 [ "unknown"() ]
362 call void @an_inaccessiblememonly_func() #7 [ "unknown"() ]
363 call void @an_inaccessibleorargmemonly_func(i8* %q) #8 [ "unknown"() ]
364 call void @an_argmemonly_func(i8* %q) #9 [ "unknown"() ]
365 ret void
366
Florian Hahn0b21d552020-01-16 10:25:29 +0000367; CHECK: Just Ref: Ptr: i8* %p <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
368; CHECK: Just Ref: Ptr: i8* %q <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
369; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
370; CHECK: NoModRef: Ptr: i8* %q <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
371; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
372; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
373; CHECK: NoModRef: Ptr: i8* %p <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
374; CHECK: Both ModRef (MustAlias): Ptr: i8* %q <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
375; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
376; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
377; CHECK: Just Ref: call void @a_readonly_func(i8* %p) #8 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
378; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
379; CHECK: Both ModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
380; CHECK: NoModRef: call void @an_inaccessiblememonly_func() #9 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
381; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
382; CHECK: Both ModRef: call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
383; CHECK: Both ModRef (MustAlias): call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ] <-> call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ]
384; CHECK: Both ModRef: call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @a_readonly_func(i8* %p) #8 [ "unknown"() ]
385; CHECK: NoModRef: call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @an_inaccessiblememonly_func() #9 [ "unknown"() ]
386; CHECK: Both ModRef (MustAlias): call void @an_argmemonly_func(i8* %q) #11 [ "unknown"() ] <-> call void @an_inaccessibleorargmemonly_func(i8* %q) #10 [ "unknown"() ]
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000387}
388
Florian Hahn0b21d552020-01-16 10:25:29 +0000389
390; CHECK: attributes #0 = { argmemonly nounwind willreturn writeonly }
391; CHECK-NEXT: attributes #1 = { argmemonly nounwind willreturn }
392; CHECK-NEXT: attributes #2 = { noinline nounwind readonly }
393; CHECK-NEXT: attributes #3 = { noinline nounwind writeonly }
394; CHECK-NEXT: attributes #4 = { nounwind ssp }
395; CHECK-NEXT: attributes #5 = { inaccessiblememonly nounwind }
396; CHECK-NEXT: attributes #6 = { inaccessiblemem_or_argmemonly nounwind }
397; CHECK-NEXT: attributes #7 = { argmemonly nounwind }
398; CHECK-NEXT: attributes #8 = { readonly }
399; CHECK-NEXT: attributes #9 = { inaccessiblememonly }
400; CHECK-NEXT: attributes #10 = { inaccessiblemem_or_argmemonly }
401; CHECK-NEXT: attributes #11 = { argmemonly }
402
Yichao Yu6fefc0d2017-11-02 12:18:33 +0000403attributes #0 = { argmemonly nounwind }
404attributes #1 = { noinline nounwind readonly }
405attributes #2 = { noinline nounwind writeonly }
406attributes #3 = { nounwind ssp }
407attributes #4 = { inaccessiblememonly nounwind }
408attributes #5 = { inaccessiblemem_or_argmemonly nounwind }
409attributes #6 = { readonly }
410attributes #7 = { inaccessiblememonly }
411attributes #8 = { inaccessiblemem_or_argmemonly }
412attributes #9 = { argmemonly }