[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_;