[VM runtime] For now, do not use field guards when using kernel bytecode.

Change-Id: I6619d329eda70a4fd684f2c2bed4ba2934d1271f
Reviewed-on: https://dart-review.googlesource.com/68540
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Régis Crelier <regis@google.com>
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 40a8d28..1e74d39 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -12,6 +12,13 @@
 #define USING_DBC false
 #endif
 
+// Don't use USING_KBC outside of this file.
+#if defined(DART_USE_INTERPRETER)
+#define USING_KBC true
+#else
+#define USING_KBC false
+#endif
+
 // Don't use USING_MULTICORE outside of this file.
 #if defined(ARCH_IS_MULTI_CORE)
 #define USING_MULTICORE true
@@ -186,7 +193,7 @@
   P(use_compactor, bool, false, "Compact the heap during old-space GC.")       \
   P(use_cha_deopt, bool, true,                                                 \
     "Use class hierarchy analysis even if it can cause deoptimization.")       \
-  P(use_field_guards, bool, !USING_DBC,                                        \
+  P(use_field_guards, bool, !USING_DBC && !USING_KBC,                          \
     "Use field guards and track field types")                                  \
   C(use_osr, false, true, bool, true, "Use OSR")                               \
   P(use_strong_mode_types, bool, true, "Optimize based on strong mode types.") \
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index 0f2cea1..34c4b8c 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -1013,28 +1013,30 @@
           return false;
         }
       }
-      // Check value cid according to field.guarded_cid().
-      // The interpreter should never see a cloned field.
-      ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
-      const classid_t field_guarded_cid = field->ptr()->guarded_cid_;
-      const classid_t field_nullability_cid = field->ptr()->is_nullable_;
-      const classid_t value_cid = InterpreterHelpers::GetClassId(value);
-      if (value_cid != field_guarded_cid &&
-          value_cid != field_nullability_cid) {
-        if (Smi::Value(field->ptr()->guarded_list_length_) <
-                Field::kUnknownFixedLength &&
-            field_guarded_cid == kIllegalCid) {
-          field->ptr()->guarded_cid_ = value_cid;
-          field->ptr()->is_nullable_ = value_cid;
-        } else if (field_guarded_cid != kDynamicCid) {
-          call_top[1] = 0;  // Unused result of runtime call.
-          call_top[2] = field;
-          call_top[3] = value;
-          Exit(thread, *FP, call_top + 4, *pc);
-          NativeArguments native_args(thread, 2, call_top + 2, call_top + 1);
-          if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid, native_args)) {
-            *invoked = true;
-            return false;
+      if (thread->isolate()->use_field_guards()) {
+        // Check value cid according to field.guarded_cid().
+        // The interpreter should never see a cloned field.
+        ASSERT(field->ptr()->owner_->GetClassId() != kFieldCid);
+        const classid_t field_guarded_cid = field->ptr()->guarded_cid_;
+        const classid_t field_nullability_cid = field->ptr()->is_nullable_;
+        const classid_t value_cid = InterpreterHelpers::GetClassId(value);
+        if (value_cid != field_guarded_cid &&
+            value_cid != field_nullability_cid) {
+          if (Smi::Value(field->ptr()->guarded_list_length_) <
+                  Field::kUnknownFixedLength &&
+              field_guarded_cid == kIllegalCid) {
+            field->ptr()->guarded_cid_ = value_cid;
+            field->ptr()->is_nullable_ = value_cid;
+          } else if (field_guarded_cid != kDynamicCid) {
+            call_top[1] = 0;  // Unused result of runtime call.
+            call_top[2] = field;
+            call_top[3] = value;
+            Exit(thread, *FP, call_top + 4, *pc);
+            NativeArguments native_args(thread, 2, call_top + 2, call_top + 1);
+            if (!InvokeRuntime(thread, this, DRT_UpdateFieldCid, native_args)) {
+              *invoked = true;
+              return false;
+            }
           }
         }
       }
@@ -3480,6 +3482,9 @@
     RawInstance* instance = reinterpret_cast<RawInstance*>(FP[rA]);
     RawObject* value = FP[value_reg];
 
+    // TODO(regis): Implement cid guard.
+    ASSERT(!thread->isolate()->use_field_guards());
+
     instance->StorePointer(
         reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
         value);
@@ -3493,6 +3498,8 @@
     RawInstance* instance = reinterpret_cast<RawInstance*>(FP[rA]);
     RawObject* value = FP[rD];
 
+    UNREACHABLE();  // TODO(regis): unused, remove.
+
     instance->StorePointer(
         reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
         value);
@@ -3506,6 +3513,10 @@
     RawInstance* instance = reinterpret_cast<RawInstance*>(SP[-1]);
     RawObject* value = reinterpret_cast<RawObject*>(SP[0]);
     SP -= 2;  // Drop instance and value.
+
+    // TODO(regis): Implement cid guard.
+    ASSERT(!thread->isolate()->use_field_guards());
+
     instance->StorePointer(
         reinterpret_cast<RawObject**>(instance->ptr()) + offset_in_words,
         value);