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