[vm/compiler/bytecode] Infer receiver type in bytecode functions
Before: BuildTableBuffer(RunTime): 10.759671901226596 us.
After: BuildTableBuffer(RunTime): 9.78219236600898 us.
(--enable-interpreter, best of 5 runs)
Issue: https://github.com/dart-lang/sdk/issues/36429
Issue: https://github.com/dart-lang/sdk/issues/36342
Change-Id: If645fb6767a35e39ff1a75fcf91d0a03c3b16987
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/101720
Reviewed-by: Martin Kustermann <kustermann@google.com>
Reviewed-by: Aart Bik <ajcbik@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 0352767..413f0d7 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -987,17 +987,11 @@
return CompileType::Dynamic();
}
- if (function.HasBytecode() &&
- graph_entry->parsed_function().node_sequence() == nullptr) {
- // TODO(alexmarkov): Consider adding node_sequence() and scope.
- return CompileType::Dynamic();
- }
-
// Parameter is the receiver.
if ((index() == 0) &&
(function.IsDynamicFunction() || function.IsGenerativeConstructor())) {
const AbstractType& type =
- graph_entry->parsed_function().ParameterVariable(index())->type();
+ graph_entry->parsed_function().RawParameterVariable(0)->type();
if (type.IsObjectType() || type.IsNullType()) {
// Receiver can be null.
return CompileType::FromAbstractType(type, CompileType::kNullable);
@@ -1036,6 +1030,12 @@
return CompileType(CompileType::kNonNullable, cid, &type);
}
+ if (function.HasBytecode() &&
+ graph_entry->parsed_function().node_sequence() == nullptr) {
+ // TODO(alexmarkov): Consider adding node_sequence() and scope.
+ return CompileType::Dynamic();
+ }
+
const bool is_unchecked_entry_param =
graph_entry->unchecked_entry() == block_;