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

Commit e5f1b4b

Browse files
alexmarkovcommit-bot@chromium.org
authored andcommitted
[vm/compiler] Handle unboxed index parameter in ArraySetIndexed/ArrayGetIndexed intrinsics
Fixes dart-lang/sdk#43810 Change-Id: I0bd5fc1ca9b71c141bf6b596813183b380e1a391 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/167865 Commit-Queue: Alexander Markov <alexmarkov@google.com> Auto-Submit: Alexander Markov <alexmarkov@google.com> Reviewed-by: Martin Kustermann <kustermann@google.com>
1 parent c3c6ada commit e5f1b4b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
// Verifies that intrinsic Float64List.[]= works even if parameters are
6+
// unboxed.
7+
// Regression test for https://github.com/dart-lang/sdk/issues/43810.
8+
9+
import 'dart:typed_data';
10+
import 'package:expect/expect.dart';
11+
12+
main() {
13+
final list1 = <double>[
14+
1, 2, 3, 4,
15+
];
16+
var list = new Float64List(list1.length);
17+
list.setRange(0, list1.length, list1);
18+
Expect.equals(1.0, list[0]);
19+
Expect.equals(2.0, list[1]);
20+
Expect.equals(3.0, list[2]);
21+
Expect.equals(4.0, list[3]);
22+
}

runtime/vm/compiler/graph_intrinsifier.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,19 @@ static Definition* PrepareIndexedOp(FlowGraph* flow_graph,
180180
return safe_index;
181181
}
182182

183+
static Definition* CreateBoxedParameterIfNeeded(BlockBuilder* builder,
184+
Definition* value,
185+
Representation representation,
186+
intptr_t arg_index) {
187+
const auto& function = builder->function();
188+
if (function.is_unboxed_parameter_at(arg_index)) {
189+
return builder->AddDefinition(
190+
BoxInstr::Create(representation, new Value(value)));
191+
} else {
192+
return value;
193+
}
194+
}
195+
183196
static Definition* CreateBoxedResultIfNeeded(BlockBuilder* builder,
184197
Definition* value,
185198
Representation representation) {
@@ -212,6 +225,7 @@ static bool IntrinsifyArrayGetIndexed(FlowGraph* flow_graph,
212225
Definition* array = builder.AddParameter(0, /*with_frame=*/false);
213226
Definition* index = builder.AddParameter(1, /*with_frame=*/false);
214227

228+
index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
215229
index = PrepareIndexedOp(flow_graph, &builder, array, index,
216230
Slot::GetLengthFieldForArrayCid(array_cid));
217231

@@ -314,6 +328,7 @@ static bool IntrinsifyArraySetIndexed(FlowGraph* flow_graph,
314328
Definition* index = builder.AddParameter(1, /*with_frame=*/false);
315329
Definition* value = builder.AddParameter(2, /*with_frame=*/false);
316330

331+
index = CreateBoxedParameterIfNeeded(&builder, index, kUnboxedInt64, 1);
317332
index = PrepareIndexedOp(flow_graph, &builder, array, index,
318333
Slot::GetLengthFieldForArrayCid(array_cid));
319334

0 commit comments

Comments
 (0)