Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 13d2937

Browse files
mkustermanncommit-bot@chromium.org
authored andcommitted
[vm/compiler] Remove too conservative release assert, add boxed-field/unboxed-implicit-getter graph intrinsic support
The initial release assert was added when removing assembler intrinsics for implicit getters and replacing them with graph intrinsics in: https://dart-review.googlesource.com/c/sdk/+/155900 Normally if the return value of a implicit field getter is unboxed, the field itself must be unboxable. That is true, though just because we can unbox a field doesn't mean we always will: The unboxing field bitmap - which e.g. the GC uses - only allows 64-bits. Classes with more fields might have some fields boxed even though they could theoretically be unboxed. Closes flutter/flutter#67803 Change-Id: I39717d356e293ed85becd64c8a664465d2abd31d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/168100 Commit-Queue: Martin Kustermann <kustermann@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com>
1 parent b7d4422 commit 13d2937

File tree

7 files changed

+783
-38
lines changed

7 files changed

+783
-38
lines changed
Lines changed: 372 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,372 @@
1+
// Copyright (c) 2020, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:expect/expect.dart';
6+
7+
final bool kTrue = int.parse('1') == 1;
8+
9+
main() {
10+
// Ensure fields are not inferred to be constants and ensure we use all fields
11+
// (to avoid them being tree shaken).
12+
final useAllFields = (kTrue ? foo : foo2).toString();
13+
for (int i = 0; i <= 64; ++i) {
14+
Expect.isTrue(useAllFields.contains('$i'));
15+
}
16+
17+
// Ensure calling dyn:get:field64 returns the right value.
18+
Expect.equals(64, ((kTrue ? foo : Baz(10)) as dynamic).field64);
19+
20+
// Ensure calling get:field64 returns the right value.
21+
Expect.equals(64, (kTrue ? foo : Bar(10)).field64);
22+
23+
// Ensure potentially inlined, direct field load yield right value.
24+
Expect.equals(64, (kTrue ? foo : foo2).field64);
25+
}
26+
27+
final foo = Foo(
28+
0,
29+
1,
30+
2,
31+
3,
32+
4,
33+
5,
34+
6,
35+
7,
36+
8,
37+
9,
38+
10,
39+
11,
40+
12,
41+
13,
42+
14,
43+
15,
44+
16,
45+
17,
46+
18,
47+
19,
48+
20,
49+
21,
50+
22,
51+
23,
52+
24,
53+
25,
54+
26,
55+
27,
56+
28,
57+
29,
58+
30,
59+
31,
60+
32,
61+
33,
62+
34,
63+
35,
64+
36,
65+
37,
66+
38,
67+
39,
68+
40,
69+
41,
70+
42,
71+
43,
72+
44,
73+
45,
74+
46,
75+
47,
76+
48,
77+
49,
78+
50,
79+
51,
80+
52,
81+
53,
82+
54,
83+
55,
84+
56,
85+
57,
86+
58,
87+
59,
88+
60,
89+
61,
90+
62,
91+
63,
92+
64);
93+
94+
final foo2 = Foo(
95+
2 * 0,
96+
2 * 1,
97+
2 * 2,
98+
2 * 3,
99+
2 * 4,
100+
2 * 5,
101+
2 * 6,
102+
2 * 7,
103+
2 * 8,
104+
2 * 9,
105+
2 * 10,
106+
2 * 11,
107+
2 * 12,
108+
2 * 13,
109+
2 * 14,
110+
2 * 15,
111+
2 * 16,
112+
2 * 17,
113+
2 * 18,
114+
2 * 19,
115+
2 * 20,
116+
2 * 21,
117+
2 * 22,
118+
2 * 23,
119+
2 * 24,
120+
2 * 25,
121+
2 * 26,
122+
2 * 27,
123+
2 * 28,
124+
2 * 29,
125+
2 * 30,
126+
2 * 31,
127+
2 * 32,
128+
2 * 33,
129+
2 * 34,
130+
2 * 35,
131+
2 * 36,
132+
2 * 37,
133+
2 * 38,
134+
2 * 39,
135+
2 * 40,
136+
2 * 41,
137+
2 * 42,
138+
2 * 43,
139+
2 * 44,
140+
2 * 45,
141+
2 * 46,
142+
2 * 47,
143+
2 * 48,
144+
2 * 49,
145+
2 * 50,
146+
2 * 51,
147+
2 * 52,
148+
2 * 53,
149+
2 * 54,
150+
2 * 55,
151+
2 * 56,
152+
2 * 57,
153+
2 * 58,
154+
2 * 59,
155+
2 * 60,
156+
2 * 61,
157+
2 * 62,
158+
2 * 63,
159+
2 * 64);
160+
161+
class Bar {
162+
final int field64;
163+
Bar(this.field64);
164+
}
165+
166+
class Baz {
167+
final int field64;
168+
Baz(this.field64);
169+
}
170+
171+
class Foo implements Bar {
172+
final int field0;
173+
final int field1;
174+
final int field2;
175+
final int field3;
176+
final int field4;
177+
final int field5;
178+
final int field6;
179+
final int field7;
180+
final int field8;
181+
final int field9;
182+
final int field10;
183+
final int field11;
184+
final int field12;
185+
final int field13;
186+
final int field14;
187+
final int field15;
188+
final int field16;
189+
final int field17;
190+
final int field18;
191+
final int field19;
192+
final int field20;
193+
final int field21;
194+
final int field22;
195+
final int field23;
196+
final int field24;
197+
final int field25;
198+
final int field26;
199+
final int field27;
200+
final int field28;
201+
final int field29;
202+
final int field30;
203+
final int field31;
204+
final int field32;
205+
final int field33;
206+
final int field34;
207+
final int field35;
208+
final int field36;
209+
final int field37;
210+
final int field38;
211+
final int field39;
212+
final int field40;
213+
final int field41;
214+
final int field42;
215+
final int field43;
216+
final int field44;
217+
final int field45;
218+
final int field46;
219+
final int field47;
220+
final int field48;
221+
final int field49;
222+
final int field50;
223+
final int field51;
224+
final int field52;
225+
final int field53;
226+
final int field54;
227+
final int field55;
228+
final int field56;
229+
final int field57;
230+
final int field58;
231+
final int field59;
232+
final int field60;
233+
final int field61;
234+
final int field62;
235+
final int field63;
236+
final int field64;
237+
238+
Foo(
239+
this.field0,
240+
this.field1,
241+
this.field2,
242+
this.field3,
243+
this.field4,
244+
this.field5,
245+
this.field6,
246+
this.field7,
247+
this.field8,
248+
this.field9,
249+
this.field10,
250+
this.field11,
251+
this.field12,
252+
this.field13,
253+
this.field14,
254+
this.field15,
255+
this.field16,
256+
this.field17,
257+
this.field18,
258+
this.field19,
259+
this.field20,
260+
this.field21,
261+
this.field22,
262+
this.field23,
263+
this.field24,
264+
this.field25,
265+
this.field26,
266+
this.field27,
267+
this.field28,
268+
this.field29,
269+
this.field30,
270+
this.field31,
271+
this.field32,
272+
this.field33,
273+
this.field34,
274+
this.field35,
275+
this.field36,
276+
this.field37,
277+
this.field38,
278+
this.field39,
279+
this.field40,
280+
this.field41,
281+
this.field42,
282+
this.field43,
283+
this.field44,
284+
this.field45,
285+
this.field46,
286+
this.field47,
287+
this.field48,
288+
this.field49,
289+
this.field50,
290+
this.field51,
291+
this.field52,
292+
this.field53,
293+
this.field54,
294+
this.field55,
295+
this.field56,
296+
this.field57,
297+
this.field58,
298+
this.field59,
299+
this.field60,
300+
this.field61,
301+
this.field62,
302+
this.field63,
303+
this.field64);
304+
305+
toString() => '''
306+
$field0;
307+
$field1;
308+
$field2;
309+
$field3;
310+
$field4;
311+
$field5;
312+
$field6;
313+
$field7;
314+
$field8;
315+
$field9;
316+
$field10;
317+
$field11;
318+
$field12;
319+
$field13;
320+
$field14;
321+
$field15;
322+
$field16;
323+
$field17;
324+
$field18;
325+
$field19;
326+
$field20;
327+
$field21;
328+
$field22;
329+
$field23;
330+
$field24;
331+
$field25;
332+
$field26;
333+
$field27;
334+
$field28;
335+
$field29;
336+
$field30;
337+
$field31;
338+
$field32;
339+
$field33;
340+
$field34;
341+
$field35;
342+
$field36;
343+
$field37;
344+
$field38;
345+
$field39;
346+
$field40;
347+
$field41;
348+
$field42;
349+
$field43;
350+
$field44;
351+
$field45;
352+
$field46;
353+
$field47;
354+
$field48;
355+
$field49;
356+
$field50;
357+
$field51;
358+
$field52;
359+
$field53;
360+
$field54;
361+
$field55;
362+
$field56;
363+
$field57;
364+
$field58;
365+
$field59;
366+
$field60;
367+
$field61;
368+
$field62;
369+
$field63;
370+
$field64;
371+
''';
372+
}

0 commit comments

Comments
 (0)