blob: 986d24e35a75c6e8df1496dcf14921730e60525a [file] [log] [blame] [edit]
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Verifies that bounds check is removed from _GrowableList.add.
import 'package:vm/testing/il_matchers.dart';
@pragma('vm:never-inline')
@pragma('vm:testing:print-flow-graph')
void addElement(List<int> list, int value) {
list.add(value);
}
void main() {
addElement([], int.parse('42'));
}
void matchIL$addElement(FlowGraph graph) {
if (is32BitConfiguration) {
return;
}
graph.dump();
graph.match([
match.block('Graph', [
'c_null' << match.Constant(value: null),
'c_one' << match.UnboxedConstant(value: 1),
]),
match.block('Function', [
'list' << match.Parameter(index: 0),
'value' << match.Parameter(index: 1),
match.CheckStackOverflow(),
'list.length' <<
match.LoadField('list', slot: 'GrowableObjectArray.length'),
'list.data' << match.LoadField('list', slot: 'GrowableObjectArray.data'),
'capacity' << match.LoadField('list.data', slot: 'Array.length'),
'length_unboxed' << match.UnboxInt64('list.length'),
'capacity_unboxed' << match.UnboxInt64('capacity'),
match.Branch(
match.EqualityCompare('length_unboxed', 'capacity_unboxed', kind: '=='),
ifTrue: 'B5',
ifFalse: 'B6',
),
]),
'B5' << match.block('Target', [match.StaticCall(), match.Goto('B7')]),
'B6' << match.block('Target', [match.Goto('B7')]),
'B7' <<
match.block('Join', [
'length_plus_1' << match.BinaryInt64Op('length_unboxed', 'c_one'),
'length_plus_1_boxed' << match.BoxInt64('length_plus_1'),
match.StoreField(
'list',
'length_plus_1_boxed',
slot: 'GrowableObjectArray.length',
),
// No bounds check here.
'list.data_v2' <<
match.LoadField(
'list',
slot: 'GrowableObjectArray.data',
skipUntilMatched: false,
),
'value_boxed' << match.BoxInt64('value', skipUntilMatched: false),
match.StoreIndexed('list.data_v2', 'length_unboxed', 'value_boxed'),
match.DartReturn('c_null'),
]),
]);
}