blob: fa34a16187c301246d92a0b0e72bae038020a589 [file] [log] [blame]
// 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'),
]),
]);
}