xref: /llvm-project/llvm/test/Analysis/BasicAA/args-rets-allocas-loads.ll (revision 303c308e452c703c3d47940383ded3b2d3eefd56)
1; RUN: opt -aa-pipeline=basic-aa -passes=aa-eval -print-all-alias-modref-info -disable-output < %s 2>&1 | FileCheck  %s
2
3declare void @callee(ptr %callee_arg)
4declare void @nocap_callee(ptr nocapture %nocap_callee_arg)
5
6declare ptr @normal_returner()
7declare noalias ptr @noalias_returner()
8
9define void @caller_a(ptr %arg_a0,
10                      ptr %arg_a1,
11                      ptr noalias %noalias_arg_a0,
12                      ptr noalias %noalias_arg_a1,
13                      ptr %indirect_a0,
14                      ptr %indirect_a1) {
15  %escape_alloca_a0 = alloca double
16  %escape_alloca_a1 = alloca double
17  %noescape_alloca_a0 = alloca double
18  %noescape_alloca_a1 = alloca double
19
20  %normal_ret_a0 = call ptr @normal_returner()
21  %normal_ret_a1 = call ptr @normal_returner()
22  %noalias_ret_a0 = call ptr @noalias_returner()
23  %noalias_ret_a1 = call ptr @noalias_returner()
24
25  %loaded_a0 = load ptr, ptr %indirect_a0
26  %loaded_a1 = load ptr, ptr %indirect_a1
27
28  call void @callee(ptr %escape_alloca_a0)
29  call void @callee(ptr %escape_alloca_a1)
30  call void @nocap_callee(ptr %noescape_alloca_a0)
31  call void @nocap_callee(ptr %noescape_alloca_a1)
32
33  store double 0.0, ptr %loaded_a0
34  store double 0.0, ptr %loaded_a1
35  store double 0.0, ptr %arg_a0
36  store double 0.0, ptr %arg_a1
37  store double 0.0, ptr %noalias_arg_a0
38  store double 0.0, ptr %noalias_arg_a1
39  store double 0.0, ptr %escape_alloca_a0
40  store double 0.0, ptr %escape_alloca_a1
41  store double 0.0, ptr %noescape_alloca_a0
42  store double 0.0, ptr %noescape_alloca_a1
43  store double 0.0, ptr %normal_ret_a0
44  store double 0.0, ptr %normal_ret_a1
45  store double 0.0, ptr %noalias_ret_a0
46  store double 0.0, ptr %noalias_ret_a1
47  ret void
48}
49
50; CHECK: Function: caller_a: 16 pointers, 8 call sites
51; CHECK: MayAlias:	ptr* %indirect_a0, ptr* %indirect_a1
52; CHECK: MayAlias:	ptr* %indirect_a0, double* %loaded_a0
53; CHECK: MayAlias:	ptr* %indirect_a1, double* %loaded_a0
54; CHECK: MayAlias:	ptr* %indirect_a0, double* %loaded_a1
55; CHECK: MayAlias:	ptr* %indirect_a1, double* %loaded_a1
56; CHECK: MayAlias:	double* %loaded_a0, double* %loaded_a1
57; CHECK: MayAlias:	double* %arg_a0, ptr* %indirect_a0
58; CHECK: MayAlias:	double* %arg_a0, ptr* %indirect_a1
59; CHECK: MayAlias:	double* %arg_a0, double* %loaded_a0
60; CHECK: MayAlias:	double* %arg_a0, double* %loaded_a1
61; CHECK: MayAlias:	double* %arg_a1, ptr* %indirect_a0
62; CHECK: MayAlias:	double* %arg_a1, ptr* %indirect_a1
63; CHECK: MayAlias:	double* %arg_a1, double* %loaded_a0
64; CHECK: MayAlias:	double* %arg_a1, double* %loaded_a1
65; CHECK: MayAlias:	double* %arg_a0, double* %arg_a1
66; CHECK: NoAlias:	ptr* %indirect_a0, double* %noalias_arg_a0
67; CHECK: NoAlias:	ptr* %indirect_a1, double* %noalias_arg_a0
68; CHECK: NoAlias:	double* %loaded_a0, double* %noalias_arg_a0
69; CHECK: NoAlias:	double* %loaded_a1, double* %noalias_arg_a0
70; CHECK: NoAlias:	double* %arg_a0, double* %noalias_arg_a0
71; CHECK: NoAlias:	double* %arg_a1, double* %noalias_arg_a0
72; CHECK: NoAlias:	ptr* %indirect_a0, double* %noalias_arg_a1
73; CHECK: NoAlias:	ptr* %indirect_a1, double* %noalias_arg_a1
74; CHECK: NoAlias:	double* %loaded_a0, double* %noalias_arg_a1
75; CHECK: NoAlias:	double* %loaded_a1, double* %noalias_arg_a1
76; CHECK: NoAlias:	double* %arg_a0, double* %noalias_arg_a1
77; CHECK: NoAlias:	double* %arg_a1, double* %noalias_arg_a1
78; CHECK: NoAlias:	double* %noalias_arg_a0, double* %noalias_arg_a1
79; CHECK: NoAlias:	double* %escape_alloca_a0, ptr* %indirect_a0
80; CHECK: NoAlias:	double* %escape_alloca_a0, ptr* %indirect_a1
81; CHECK: MayAlias:	double* %escape_alloca_a0, double* %loaded_a0
82; CHECK: MayAlias:	double* %escape_alloca_a0, double* %loaded_a1
83; CHECK: NoAlias:	double* %arg_a0, double* %escape_alloca_a0
84; CHECK: NoAlias:	double* %arg_a1, double* %escape_alloca_a0
85; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noalias_arg_a0
86; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noalias_arg_a1
87; CHECK: NoAlias:	double* %escape_alloca_a1, ptr* %indirect_a0
88; CHECK: NoAlias:	double* %escape_alloca_a1, ptr* %indirect_a1
89; CHECK: MayAlias:	double* %escape_alloca_a1, double* %loaded_a0
90; CHECK: MayAlias:	double* %escape_alloca_a1, double* %loaded_a1
91; CHECK: NoAlias:	double* %arg_a0, double* %escape_alloca_a1
92; CHECK: NoAlias:	double* %arg_a1, double* %escape_alloca_a1
93; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noalias_arg_a0
94; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noalias_arg_a1
95; CHECK: NoAlias:	double* %escape_alloca_a0, double* %escape_alloca_a1
96; CHECK: NoAlias:	ptr* %indirect_a0, double* %noescape_alloca_a0
97; CHECK: NoAlias:	ptr* %indirect_a1, double* %noescape_alloca_a0
98; CHECK: NoAlias:	double* %loaded_a0, double* %noescape_alloca_a0
99; CHECK: NoAlias:	double* %loaded_a1, double* %noescape_alloca_a0
100; CHECK: NoAlias:	double* %arg_a0, double* %noescape_alloca_a0
101; CHECK: NoAlias:	double* %arg_a1, double* %noescape_alloca_a0
102; CHECK: NoAlias:	double* %noalias_arg_a0, double* %noescape_alloca_a0
103; CHECK: NoAlias:	double* %noalias_arg_a1, double* %noescape_alloca_a0
104; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noescape_alloca_a0
105; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noescape_alloca_a0
106; CHECK: NoAlias:	ptr* %indirect_a0, double* %noescape_alloca_a1
107; CHECK: NoAlias:	ptr* %indirect_a1, double* %noescape_alloca_a1
108; CHECK: NoAlias:	double* %loaded_a0, double* %noescape_alloca_a1
109; CHECK: NoAlias:	double* %loaded_a1, double* %noescape_alloca_a1
110; CHECK: NoAlias:	double* %arg_a0, double* %noescape_alloca_a1
111; CHECK: NoAlias:	double* %arg_a1, double* %noescape_alloca_a1
112; CHECK: NoAlias:	double* %noalias_arg_a0, double* %noescape_alloca_a1
113; CHECK: NoAlias:	double* %noalias_arg_a1, double* %noescape_alloca_a1
114; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noescape_alloca_a1
115; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noescape_alloca_a1
116; CHECK: NoAlias:	double* %noescape_alloca_a0, double* %noescape_alloca_a1
117; CHECK: MayAlias:	ptr* %indirect_a0, double* %normal_ret_a0
118; CHECK: MayAlias:	ptr* %indirect_a1, double* %normal_ret_a0
119; CHECK: MayAlias:	double* %loaded_a0, double* %normal_ret_a0
120; CHECK: MayAlias:	double* %loaded_a1, double* %normal_ret_a0
121; CHECK: MayAlias:	double* %arg_a0, double* %normal_ret_a0
122; CHECK: MayAlias:	double* %arg_a1, double* %normal_ret_a0
123; CHECK: NoAlias:	double* %noalias_arg_a0, double* %normal_ret_a0
124; CHECK: NoAlias:	double* %noalias_arg_a1, double* %normal_ret_a0
125; CHECK: MayAlias:	double* %escape_alloca_a0, double* %normal_ret_a0
126; CHECK: MayAlias:	double* %escape_alloca_a1, double* %normal_ret_a0
127; CHECK: NoAlias:	double* %noescape_alloca_a0, double* %normal_ret_a0
128; CHECK: NoAlias:	double* %noescape_alloca_a1, double* %normal_ret_a0
129; CHECK: MayAlias:	ptr* %indirect_a0, double* %normal_ret_a1
130; CHECK: MayAlias:	ptr* %indirect_a1, double* %normal_ret_a1
131; CHECK: MayAlias:	double* %loaded_a0, double* %normal_ret_a1
132; CHECK: MayAlias:	double* %loaded_a1, double* %normal_ret_a1
133; CHECK: MayAlias:	double* %arg_a0, double* %normal_ret_a1
134; CHECK: MayAlias:	double* %arg_a1, double* %normal_ret_a1
135; CHECK: NoAlias:	double* %noalias_arg_a0, double* %normal_ret_a1
136; CHECK: NoAlias:	double* %noalias_arg_a1, double* %normal_ret_a1
137; CHECK: MayAlias:	double* %escape_alloca_a0, double* %normal_ret_a1
138; CHECK: MayAlias:	double* %escape_alloca_a1, double* %normal_ret_a1
139; CHECK: NoAlias:	double* %noescape_alloca_a0, double* %normal_ret_a1
140; CHECK: NoAlias:	double* %noescape_alloca_a1, double* %normal_ret_a1
141; CHECK: MayAlias:	double* %normal_ret_a0, double* %normal_ret_a1
142; CHECK: NoAlias:	ptr* %indirect_a0, double* %noalias_ret_a0
143; CHECK: NoAlias:	ptr* %indirect_a1, double* %noalias_ret_a0
144; CHECK: NoAlias:	double* %loaded_a0, double* %noalias_ret_a0
145; CHECK: NoAlias:	double* %loaded_a1, double* %noalias_ret_a0
146; CHECK: NoAlias:	double* %arg_a0, double* %noalias_ret_a0
147; CHECK: NoAlias:	double* %arg_a1, double* %noalias_ret_a0
148; CHECK: NoAlias:	double* %noalias_arg_a0, double* %noalias_ret_a0
149; CHECK: NoAlias:	double* %noalias_arg_a1, double* %noalias_ret_a0
150; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noalias_ret_a0
151; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noalias_ret_a0
152; CHECK: NoAlias:	double* %noalias_ret_a0, double* %noescape_alloca_a0
153; CHECK: NoAlias:	double* %noalias_ret_a0, double* %noescape_alloca_a1
154; CHECK: NoAlias:	double* %noalias_ret_a0, double* %normal_ret_a0
155; CHECK: NoAlias:	double* %noalias_ret_a0, double* %normal_ret_a1
156; CHECK: NoAlias:	ptr* %indirect_a0, double* %noalias_ret_a1
157; CHECK: NoAlias:	ptr* %indirect_a1, double* %noalias_ret_a1
158; CHECK: NoAlias:	double* %loaded_a0, double* %noalias_ret_a1
159; CHECK: NoAlias:	double* %loaded_a1, double* %noalias_ret_a1
160; CHECK: NoAlias:	double* %arg_a0, double* %noalias_ret_a1
161; CHECK: NoAlias:	double* %arg_a1, double* %noalias_ret_a1
162; CHECK: NoAlias:	double* %noalias_arg_a0, double* %noalias_ret_a1
163; CHECK: NoAlias:	double* %noalias_arg_a1, double* %noalias_ret_a1
164; CHECK: NoAlias:	double* %escape_alloca_a0, double* %noalias_ret_a1
165; CHECK: NoAlias:	double* %escape_alloca_a1, double* %noalias_ret_a1
166; CHECK: NoAlias:	double* %noalias_ret_a1, double* %noescape_alloca_a0
167; CHECK: NoAlias:	double* %noalias_ret_a1, double* %noescape_alloca_a1
168; CHECK: NoAlias:	double* %noalias_ret_a1, double* %normal_ret_a0
169; CHECK: NoAlias:	double* %noalias_ret_a1, double* %normal_ret_a1
170; CHECK: NoAlias:	double* %noalias_ret_a0, double* %noalias_ret_a1
171; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
172; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
173; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
174; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
175; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
176; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
177; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
178; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
179; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
180; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
181; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
182; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
183; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
184; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
185; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  %normal_ret_a0 = call ptr @normal_returner()
186; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  %normal_ret_a0 = call ptr @normal_returner()
187; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
188; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
189; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
190; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
191; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
192; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
193; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
194; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
195; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
196; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
197; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
198; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
199; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
200; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
201; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  %normal_ret_a1 = call ptr @normal_returner()
202; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  %normal_ret_a1 = call ptr @normal_returner()
203; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
204; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
205; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
206; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
207; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
208; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
209; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
210; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
211; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
212; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
213; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
214; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
215; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
216; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
217; CHECK: Both ModRef:  Ptr: double* %noalias_ret_a0	<->  %noalias_ret_a0 = call ptr @noalias_returner()
218; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  %noalias_ret_a0 = call ptr @noalias_returner()
219; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
220; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
221; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
222; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
223; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
224; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
225; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
226; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
227; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
228; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
229; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
230; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
231; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
232; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
233; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  %noalias_ret_a1 = call ptr @noalias_returner()
234; CHECK: Both ModRef:  Ptr: double* %noalias_ret_a1	<->  %noalias_ret_a1 = call ptr @noalias_returner()
235; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  call void @callee(ptr %escape_alloca_a0)
236; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  call void @callee(ptr %escape_alloca_a0)
237; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  call void @callee(ptr %escape_alloca_a0)
238; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  call void @callee(ptr %escape_alloca_a0)
239; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  call void @callee(ptr %escape_alloca_a0)
240; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  call void @callee(ptr %escape_alloca_a0)
241; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  call void @callee(ptr %escape_alloca_a0)
242; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  call void @callee(ptr %escape_alloca_a0)
243; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  call void @callee(ptr %escape_alloca_a0)
244; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  call void @callee(ptr %escape_alloca_a0)
245; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  call void @callee(ptr %escape_alloca_a0)
246; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  call void @callee(ptr %escape_alloca_a0)
247; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  call void @callee(ptr %escape_alloca_a0)
248; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  call void @callee(ptr %escape_alloca_a0)
249; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  call void @callee(ptr %escape_alloca_a0)
250; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  call void @callee(ptr %escape_alloca_a0)
251; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  call void @callee(ptr %escape_alloca_a1)
252; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  call void @callee(ptr %escape_alloca_a1)
253; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  call void @callee(ptr %escape_alloca_a1)
254; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  call void @callee(ptr %escape_alloca_a1)
255; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  call void @callee(ptr %escape_alloca_a1)
256; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  call void @callee(ptr %escape_alloca_a1)
257; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  call void @callee(ptr %escape_alloca_a1)
258; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  call void @callee(ptr %escape_alloca_a1)
259; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  call void @callee(ptr %escape_alloca_a1)
260; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  call void @callee(ptr %escape_alloca_a1)
261; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  call void @callee(ptr %escape_alloca_a1)
262; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  call void @callee(ptr %escape_alloca_a1)
263; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  call void @callee(ptr %escape_alloca_a1)
264; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  call void @callee(ptr %escape_alloca_a1)
265; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  call void @callee(ptr %escape_alloca_a1)
266; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  call void @callee(ptr %escape_alloca_a1)
267; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
268; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
269; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
270; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
271; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
272; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
273; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
274; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
275; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
276; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
277; CHECK: Both ModRef:  Ptr: double* %noescape_alloca_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
278; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
279; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
280; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
281; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
282; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a0)
283; CHECK: Both ModRef:  Ptr: ptr* %indirect_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
284; CHECK: Both ModRef:  Ptr: ptr* %indirect_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
285; CHECK: Both ModRef:  Ptr: double* %loaded_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
286; CHECK: Both ModRef:  Ptr: double* %loaded_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
287; CHECK: Both ModRef:  Ptr: double* %arg_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
288; CHECK: Both ModRef:  Ptr: double* %arg_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
289; CHECK: NoModRef:  Ptr: double* %noalias_arg_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
290; CHECK: NoModRef:  Ptr: double* %noalias_arg_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
291; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
292; CHECK: Both ModRef:  Ptr: double* %escape_alloca_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
293; CHECK: NoModRef:  Ptr: double* %noescape_alloca_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
294; CHECK: Both ModRef:  Ptr: double* %noescape_alloca_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
295; CHECK: Both ModRef:  Ptr: double* %normal_ret_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
296; CHECK: Both ModRef:  Ptr: double* %normal_ret_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
297; CHECK: NoModRef:  Ptr: double* %noalias_ret_a0	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
298; CHECK: NoModRef:  Ptr: double* %noalias_ret_a1	<->  call void @nocap_callee(ptr %noescape_alloca_a1)
299; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   %normal_ret_a1 = call ptr @normal_returner()
300; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   %noalias_ret_a0 = call ptr @noalias_returner()
301; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   %noalias_ret_a1 = call ptr @noalias_returner()
302; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   call void @callee(ptr %escape_alloca_a0)
303; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   call void @callee(ptr %escape_alloca_a1)
304; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a0)
305; CHECK: Both ModRef:   %normal_ret_a0 = call ptr @normal_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a1)
306; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   %normal_ret_a0 = call ptr @normal_returner()
307; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   %noalias_ret_a0 = call ptr @noalias_returner()
308; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   %noalias_ret_a1 = call ptr @noalias_returner()
309; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   call void @callee(ptr %escape_alloca_a0)
310; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   call void @callee(ptr %escape_alloca_a1)
311; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a0)
312; CHECK: Both ModRef:   %normal_ret_a1 = call ptr @normal_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a1)
313; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   %normal_ret_a0 = call ptr @normal_returner()
314; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   %normal_ret_a1 = call ptr @normal_returner()
315; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   %noalias_ret_a1 = call ptr @noalias_returner()
316; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   call void @callee(ptr %escape_alloca_a0)
317; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   call void @callee(ptr %escape_alloca_a1)
318; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a0)
319; CHECK: Both ModRef:   %noalias_ret_a0 = call ptr @noalias_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a1)
320; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   %normal_ret_a0 = call ptr @normal_returner()
321; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   %normal_ret_a1 = call ptr @normal_returner()
322; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   %noalias_ret_a0 = call ptr @noalias_returner()
323; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   call void @callee(ptr %escape_alloca_a0)
324; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   call void @callee(ptr %escape_alloca_a1)
325; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a0)
326; CHECK: Both ModRef:   %noalias_ret_a1 = call ptr @noalias_returner() <->   call void @nocap_callee(ptr %noescape_alloca_a1)
327; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   %normal_ret_a0 = call ptr @normal_returner()
328; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   %normal_ret_a1 = call ptr @normal_returner()
329; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   %noalias_ret_a0 = call ptr @noalias_returner()
330; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   %noalias_ret_a1 = call ptr @noalias_returner()
331; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   call void @callee(ptr %escape_alloca_a1)
332; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   call void @nocap_callee(ptr %noescape_alloca_a0)
333; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a0) <->   call void @nocap_callee(ptr %noescape_alloca_a1)
334; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   %normal_ret_a0 = call ptr @normal_returner()
335; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   %normal_ret_a1 = call ptr @normal_returner()
336; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   %noalias_ret_a0 = call ptr @noalias_returner()
337; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   %noalias_ret_a1 = call ptr @noalias_returner()
338; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   call void @callee(ptr %escape_alloca_a0)
339; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   call void @nocap_callee(ptr %noescape_alloca_a0)
340; CHECK: Both ModRef:   call void @callee(ptr %escape_alloca_a1) <->   call void @nocap_callee(ptr %noescape_alloca_a1)
341; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   %normal_ret_a0 = call ptr @normal_returner()
342; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   %normal_ret_a1 = call ptr @normal_returner()
343; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   %noalias_ret_a0 = call ptr @noalias_returner()
344; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   %noalias_ret_a1 = call ptr @noalias_returner()
345; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   call void @callee(ptr %escape_alloca_a0)
346; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   call void @callee(ptr %escape_alloca_a1)
347; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a0) <->   call void @nocap_callee(ptr %noescape_alloca_a1)
348; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   %normal_ret_a0 = call ptr @normal_returner()
349; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   %normal_ret_a1 = call ptr @normal_returner()
350; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   %noalias_ret_a0 = call ptr @noalias_returner()
351; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   %noalias_ret_a1 = call ptr @noalias_returner()
352; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   call void @callee(ptr %escape_alloca_a0)
353; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   call void @callee(ptr %escape_alloca_a1)
354; CHECK: Both ModRef:   call void @nocap_callee(ptr %noescape_alloca_a1) <->   call void @nocap_callee(ptr %noescape_alloca_a0)
355; CHECK: ===== Alias Analysis Evaluator Report =====
356; CHECK-NEXT:   120 Total Alias Queries Performed
357; CHECK-NEXT:   84 no alias responses (70.0%)
358; CHECK-NEXT:   36 may alias responses (30.0%)
359; CHECK-NEXT:   0 partial alias responses (0.0%)
360; CHECK-NEXT:   0 must alias responses (0.0%)
361; CHECK-NEXT:   Alias Analysis Evaluator Pointer Alias Summary: 70%/30%/0%
362; CHECK-NEXT:   184 Total ModRef Queries Performed
363; CHECK-NEXT:   44 no mod/ref responses (23.9%)
364; CHECK-NEXT:   0 mod responses (0.0%)
365; CHECK-NEXT:   0 ref responses (0.0%)
366; CHECK-NEXT:   140 mod & ref responses (76.0%)
367; CHECK-NEXT:   Alias Analysis Evaluator Mod/Ref Summary: 23%/0%/0%/76%
368
369