Revert recent ConsString-related changes

We see crashes in the wild that we suspect are caused by these changes.
This is a manual revert because of conflicts.

Revert "[turbofan] Fix incorrect CheckNonEmptyString lowering."
This reverts commit b3b7011867cf2f2d50a509b03e39c54fe0e213e0.

Revert "[turbofan] Fix incorrect lowering of CheckNonEmptyString."
This reverts commit 5758209026018a9ca573be234580077ad5974824.

Revert "[turbofan] Significantly improve ConsString creation performance."
This reverts commit d6a60a0ee1921213320ecb4555e5d463406a4ab7.

Bug: v8:9147
Change-Id: I262c21e5406a9c4c8ad0e0f995582c5802f0fa1e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1571613
Reviewed-by: Jaroslav Sevcik <jarin@chromium.org>
Reviewed-by: Jakob Kummerow <jkummerow@chromium.org>
Reviewed-by: Ulan Degenbaev <ulan@chromium.org>
Commit-Queue: Georg Neis <neis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#60919}
diff --git a/include/v8-internal.h b/include/v8-internal.h
index cbdce1c..8e700a4 100644
--- a/include/v8-internal.h
+++ b/include/v8-internal.h
@@ -168,9 +168,9 @@
   static const int kNodeIsIndependentShift = 3;
   static const int kNodeIsActiveShift = 4;
 
-  static const int kFirstNonstringType = 0x80;
-  static const int kOddballType = 0x83;
-  static const int kForeignType = 0x87;
+  static const int kFirstNonstringType = 0x40;
+  static const int kOddballType = 0x43;
+  static const int kForeignType = 0x47;
   static const int kJSSpecialApiObjectType = 0x410;
   static const int kJSApiObjectType = 0x420;
   static const int kJSObjectType = 0x421;
diff --git a/src/code-stub-assembler.cc b/src/code-stub-assembler.cc
index b1c1627..f95b515 100644
--- a/src/code-stub-assembler.cc
+++ b/src/code-stub-assembler.cc
@@ -3331,8 +3331,7 @@
 
 TNode<String> CodeStubAssembler::AllocateConsString(TNode<Uint32T> length,
                                                     TNode<String> left,
-                                                    TNode<String> right,
-                                                    Variable* var_feedback) {
+                                                    TNode<String> right) {
   // Added string can be a cons string.
   Comment("Allocating ConsString");
   Node* left_instance_type = LoadInstanceType(left);
@@ -3346,20 +3345,8 @@
       Word32And(left_instance_type, right_instance_type);
   TNode<Map> result_map = CAST(Select<Object>(
       IsSetWord32(combined_instance_type, kStringEncodingMask),
-      [=] {
-        if (var_feedback != nullptr) {
-          var_feedback->Bind(
-              SmiConstant(BinaryOperationFeedback::kConsOneByteString));
-        }
-        return LoadRoot(RootIndex::kConsOneByteStringMap);
-      },
-      [=] {
-        if (var_feedback != nullptr) {
-          var_feedback->Bind(
-              SmiConstant(BinaryOperationFeedback::kConsTwoByteString));
-        }
-        return LoadRoot(RootIndex::kConsStringMap);
-      }));
+      [=] { return LoadRoot(RootIndex::kConsOneByteStringMap); },
+      [=] { return LoadRoot(RootIndex::kConsStringMap); }));
   Node* result = AllocateInNewSpace(ConsString::kSize);
   StoreMapNoWriteBarrier(result, result_map);
   StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length,
@@ -7200,18 +7187,12 @@
 }
 
 TNode<String> CodeStubAssembler::StringAdd(Node* context, TNode<String> left,
-                                           TNode<String> right,
-                                           Variable* var_feedback) {
+                                           TNode<String> right) {
   TVARIABLE(String, result);
   Label check_right(this), runtime(this, Label::kDeferred), cons(this),
       done(this, &result), done_native(this, &result);
   Counters* counters = isolate()->counters();
 
-  // Default to "String" feedback if we don't learn anything else below.
-  if (var_feedback != nullptr) {
-    var_feedback->Bind(SmiConstant(BinaryOperationFeedback::kString));
-  }
-
   TNode<Uint32T> left_length = LoadStringLengthAsWord32(left);
   GotoIfNot(Word32Equal(left_length, Uint32Constant(0)), &check_right);
   result = right;
@@ -7241,8 +7222,8 @@
     GotoIf(Uint32LessThan(new_length, Uint32Constant(ConsString::kMinLength)),
            &non_cons);
 
-    result = AllocateConsString(new_length, var_left.value(), var_right.value(),
-                                var_feedback);
+    result =
+        AllocateConsString(new_length, var_left.value(), var_right.value());
     Goto(&done_native);
 
     BIND(&non_cons);
diff --git a/src/code-stub-assembler.h b/src/code-stub-assembler.h
index 1387c6d..2c8e6e1 100644
--- a/src/code-stub-assembler.h
+++ b/src/code-stub-assembler.h
@@ -1526,7 +1526,7 @@
   // Allocate an appropriate one- or two-byte ConsString with the first and
   // second parts specified by |left| and |right|.
   TNode<String> AllocateConsString(TNode<Uint32T> length, TNode<String> left,
-                                   TNode<String> right, Variable* var_feedback);
+                                   TNode<String> right);
 
   TNode<NameDictionary> AllocateNameDictionary(int at_least_space_for);
   TNode<NameDictionary> AllocateNameDictionary(
@@ -2341,8 +2341,7 @@
 
   // Return a new string object produced by concatenating |first| with |second|.
   TNode<String> StringAdd(Node* context, TNode<String> first,
-                          TNode<String> second,
-                          Variable* var_feedback = nullptr);
+                          TNode<String> second);
 
   // Check if |string| is an indirect (thin or flat cons) string type that can
   // be dereferenced by DerefIndirectString.
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
index 3badaba..f6f212d 100644
--- a/src/compiler/effect-control-linearizer.cc
+++ b/src/compiler/effect-control-linearizer.cc
@@ -715,15 +715,6 @@
     case IrOpcode::kCheckInternalizedString:
       result = LowerCheckInternalizedString(node, frame_state);
       break;
-    case IrOpcode::kCheckNonEmptyOneByteString:
-      result = LowerCheckNonEmptyOneByteString(node, frame_state);
-      break;
-    case IrOpcode::kCheckNonEmptyTwoByteString:
-      result = LowerCheckNonEmptyTwoByteString(node, frame_state);
-      break;
-    case IrOpcode::kCheckNonEmptyString:
-      result = LowerCheckNonEmptyString(node, frame_state);
-      break;
     case IrOpcode::kCheckIf:
       LowerCheckIf(node, frame_state);
       break;
@@ -893,12 +884,6 @@
     case IrOpcode::kNewArgumentsElements:
       result = LowerNewArgumentsElements(node);
       break;
-    case IrOpcode::kNewConsOneByteString:
-      result = LowerNewConsOneByteString(node);
-      break;
-    case IrOpcode::kNewConsTwoByteString:
-      result = LowerNewConsTwoByteString(node);
-      break;
     case IrOpcode::kNewConsString:
       result = LowerNewConsString(node);
       break;
@@ -1807,62 +1792,6 @@
   return value;
 }
 
-Node* EffectControlLinearizer::LowerCheckNonEmptyOneByteString(
-    Node* node, Node* frame_state) {
-  Node* value = node->InputAt(0);
-
-  Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
-  Node* value_instance_type =
-      __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
-  Node* check = __ Word32Equal(
-      __ Word32And(value_instance_type,
-                   __ Int32Constant(kIsNotStringMask | kStringEncodingMask |
-                                    kIsEmptyStringMask)),
-      __ Int32Constant(kStringTag | kOneByteStringTag | kIsNotEmptyStringTag));
-  __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
-                     check, frame_state);
-
-  return value;
-}
-
-Node* EffectControlLinearizer::LowerCheckNonEmptyTwoByteString(
-    Node* node, Node* frame_state) {
-  Node* value = node->InputAt(0);
-
-  Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
-  Node* value_instance_type =
-      __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
-  Node* check = __ Word32Equal(
-      __ Word32And(value_instance_type,
-                   __ Int32Constant(kIsNotStringMask | kStringEncodingMask |
-                                    kIsEmptyStringMask)),
-      __ Int32Constant(kStringTag | kTwoByteStringTag | kIsNotEmptyStringTag));
-  __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
-                     check, frame_state);
-
-  return value;
-}
-
-Node* EffectControlLinearizer::LowerCheckNonEmptyString(Node* node,
-                                                        Node* frame_state) {
-  Node* value = node->InputAt(0);
-
-  Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
-  Node* value_instance_type =
-      __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
-
-  Node* check = __ Word32Equal(
-      __ Word32And(value_instance_type,
-                   __ Int32Constant(kIsNotStringMask | kIsEmptyStringMask)),
-      __ Int32Constant(kStringTag | kIsNotEmptyStringTag));
-  __ DeoptimizeIfNot(DeoptimizeReason::kWrongInstanceType, VectorSlotPair(),
-                     check, frame_state);
-
-  return value;
-}
-
 void EffectControlLinearizer::LowerCheckIf(Node* node, Node* frame_state) {
   Node* value = node->InputAt(0);
   const CheckIfParameters& p = CheckIfParametersOf(node->op());
@@ -3361,24 +3290,6 @@
                  length, __ SmiConstant(mapped_count), __ NoContextConstant());
 }
 
-Node* EffectControlLinearizer::LowerNewConsOneByteString(Node* node) {
-  Node* map = jsgraph()->HeapConstant(factory()->cons_one_byte_string_map());
-  Node* length = node->InputAt(0);
-  Node* first = node->InputAt(1);
-  Node* second = node->InputAt(2);
-
-  return AllocateConsString(map, length, first, second);
-}
-
-Node* EffectControlLinearizer::LowerNewConsTwoByteString(Node* node) {
-  Node* map = jsgraph()->HeapConstant(factory()->cons_string_map());
-  Node* length = node->InputAt(0);
-  Node* first = node->InputAt(1);
-  Node* second = node->InputAt(2);
-
-  return AllocateConsString(map, length, first, second);
-}
-
 Node* EffectControlLinearizer::LowerNewConsString(Node* node) {
   Node* length = node->InputAt(0);
   Node* first = node->InputAt(1);
@@ -3415,14 +3326,9 @@
   Node* result_map = done.PhiAt(0);
 
   // Allocate the resulting ConsString.
-  return AllocateConsString(result_map, length, first, second);
-}
-
-Node* EffectControlLinearizer::AllocateConsString(Node* map, Node* length,
-                                                  Node* first, Node* second) {
   Node* result =
       __ Allocate(AllocationType::kYoung, __ IntPtrConstant(ConsString::kSize));
-  __ StoreField(AccessBuilder::ForMap(), result, map);
+  __ StoreField(AccessBuilder::ForMap(), result, result_map);
   __ StoreField(AccessBuilder::ForNameHashField(), result,
                 __ Int32Constant(Name::kEmptyHashField));
   __ StoreField(AccessBuilder::ForStringLength(), result, length);
diff --git a/src/compiler/effect-control-linearizer.h b/src/compiler/effect-control-linearizer.h
index 66f7311..4184143 100644
--- a/src/compiler/effect-control-linearizer.h
+++ b/src/compiler/effect-control-linearizer.h
@@ -66,9 +66,6 @@
   Node* LowerChangeTaggedToCompressedSigned(Node* node);
   Node* LowerPoisonIndex(Node* node);
   Node* LowerCheckInternalizedString(Node* node, Node* frame_state);
-  Node* LowerCheckNonEmptyOneByteString(Node* node, Node* frame_state);
-  Node* LowerCheckNonEmptyTwoByteString(Node* node, Node* frame_state);
-  Node* LowerCheckNonEmptyString(Node* node, Node* frame_state);
   void LowerCheckMaps(Node* node, Node* frame_state);
   Node* LowerCompareMaps(Node* node);
   Node* LowerCheckNumber(Node* node, Node* frame_state);
@@ -142,8 +139,6 @@
   Node* LowerNewDoubleElements(Node* node);
   Node* LowerNewSmiOrObjectElements(Node* node);
   Node* LowerNewArgumentsElements(Node* node);
-  Node* LowerNewConsOneByteString(Node* node);
-  Node* LowerNewConsTwoByteString(Node* node);
   Node* LowerNewConsString(Node* node);
   Node* LowerSameValue(Node* node);
   Node* LowerSameValueNumbersOnly(Node* node);
@@ -201,7 +196,6 @@
   Maybe<Node*> LowerFloat64RoundTruncate(Node* node);
 
   Node* AllocateHeapNumberWithValue(Node* node);
-  Node* AllocateConsString(Node* map, Node* length, Node* first, Node* second);
   Node* BuildCheckedFloat64ToInt32(CheckForMinusZeroMode mode,
                                    const VectorSlotPair& feedback, Node* value,
                                    Node* frame_state);
diff --git a/src/compiler/js-operator.cc b/src/compiler/js-operator.cc
index 5337ae3..2280084 100644
--- a/src/compiler/js-operator.cc
+++ b/src/compiler/js-operator.cc
@@ -688,12 +688,6 @@
   Name##Operator<BinaryOperationHint::kNumber> k##Name##NumberOperator;       \
   Name##Operator<BinaryOperationHint::kNumberOrOddball>                       \
       k##Name##NumberOrOddballOperator;                                       \
-  Name##Operator<BinaryOperationHint::kConsOneByteString>                     \
-      k##Name##ConsOneByteStringOperator;                                     \
-  Name##Operator<BinaryOperationHint::kConsTwoByteString>                     \
-      k##Name##ConsTwoByteStringOperator;                                     \
-  Name##Operator<BinaryOperationHint::kConsString>                            \
-      k##Name##ConsStringOperator;                                            \
   Name##Operator<BinaryOperationHint::kString> k##Name##StringOperator;       \
   Name##Operator<BinaryOperationHint::kBigInt> k##Name##BigIntOperator;       \
   Name##Operator<BinaryOperationHint::kAny> k##Name##AnyOperator;
@@ -756,12 +750,6 @@
         return &cache_.k##Name##NumberOperator;                       \
       case BinaryOperationHint::kNumberOrOddball:                     \
         return &cache_.k##Name##NumberOrOddballOperator;              \
-      case BinaryOperationHint::kConsOneByteString:                   \
-        return &cache_.k##Name##ConsOneByteStringOperator;            \
-      case BinaryOperationHint::kConsTwoByteString:                   \
-        return &cache_.k##Name##ConsTwoByteStringOperator;            \
-      case BinaryOperationHint::kConsString:                          \
-        return &cache_.k##Name##ConsStringOperator;                   \
       case BinaryOperationHint::kString:                              \
         return &cache_.k##Name##StringOperator;                       \
       case BinaryOperationHint::kBigInt:                              \
diff --git a/src/compiler/js-type-hint-lowering.cc b/src/compiler/js-type-hint-lowering.cc
index b3c3111..cfcfb4c 100644
--- a/src/compiler/js-type-hint-lowering.cc
+++ b/src/compiler/js-type-hint-lowering.cc
@@ -37,9 +37,6 @@
       return true;
     case BinaryOperationHint::kAny:
     case BinaryOperationHint::kNone:
-    case BinaryOperationHint::kConsOneByteString:
-    case BinaryOperationHint::kConsTwoByteString:
-    case BinaryOperationHint::kConsString:
     case BinaryOperationHint::kString:
     case BinaryOperationHint::kBigInt:
       break;
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc
index 234d349..452609a 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -93,6 +93,35 @@
            BothInputsMaybe(Type::Symbol());
   }
 
+  // Check if a string addition will definitely result in creating a ConsString,
+  // i.e. if the combined length of the resulting string exceeds the ConsString
+  // minimum length.
+  bool ShouldCreateConsString() {
+    DCHECK_EQ(IrOpcode::kJSAdd, node_->opcode());
+    DCHECK(OneInputIs(Type::String()));
+    if (BothInputsAre(Type::String()) ||
+        BinaryOperationHintOf(node_->op()) == BinaryOperationHint::kString) {
+      HeapObjectBinopMatcher m(node_);
+      JSHeapBroker* broker = lowering_->broker();
+      if (m.right().HasValue() && m.right().Ref(broker).IsString()) {
+        StringRef right_string = m.right().Ref(broker).AsString();
+        if (right_string.length() >= ConsString::kMinLength) return true;
+      }
+      if (m.left().HasValue() && m.left().Ref(broker).IsString()) {
+        StringRef left_string = m.left().Ref(broker).AsString();
+        if (left_string.length() >= ConsString::kMinLength) {
+          // The invariant for ConsString requires the left hand side to be
+          // a sequential or external string if the right hand side is the
+          // empty string. Since we don't know anything about the right hand
+          // side here, we must ensure that the left hand side satisfy the
+          // constraints independent of the right hand side.
+          return left_string.IsSeqString() || left_string.IsExternalString();
+        }
+      }
+    }
+    return false;
+  }
+
   // Inserts a CheckReceiver for the left input.
   void CheckLeftInputToReceiver() {
     Node* left_input = graph()->NewNode(simplified()->CheckReceiver(), left(),
@@ -164,64 +193,6 @@
     }
   }
 
-  // Checks that both inputs are NonEmptyOneByteString, and if we don't know
-  // statically that one side is already a NonEmptyOneByteString, insert a
-  // CheckNonEmptyOneByteString node.
-  void CheckInputsToNonEmptyOneByteString() {
-    if (!left_type().Is(Type::NonEmptyOneByteString())) {
-      Node* left_input =
-          graph()->NewNode(simplified()->CheckNonEmptyOneByteString(), left(),
-                           effect(), control());
-      node_->ReplaceInput(0, left_input);
-      update_effect(left_input);
-    }
-    if (!right_type().Is(Type::NonEmptyOneByteString())) {
-      Node* right_input =
-          graph()->NewNode(simplified()->CheckNonEmptyOneByteString(), right(),
-                           effect(), control());
-      node_->ReplaceInput(1, right_input);
-      update_effect(right_input);
-    }
-  }
-
-  // Checks that both inputs are NonEmptyTwoByteString, and if we don't know
-  // statically that one side is already a NonEmptyTwoByteString, insert a
-  // CheckNonEmptyTwoByteString node.
-  void CheckInputsToNonEmptyTwoByteString() {
-    if (!left_type().Is(Type::NonEmptyTwoByteString())) {
-      Node* left_input =
-          graph()->NewNode(simplified()->CheckNonEmptyTwoByteString(), left(),
-                           effect(), control());
-      node_->ReplaceInput(0, left_input);
-      update_effect(left_input);
-    }
-    if (!right_type().Is(Type::NonEmptyTwoByteString())) {
-      Node* right_input =
-          graph()->NewNode(simplified()->CheckNonEmptyTwoByteString(), right(),
-                           effect(), control());
-      node_->ReplaceInput(1, right_input);
-      update_effect(right_input);
-    }
-  }
-
-  // Checks that both inputs are NonEmptyString, and if we don't know
-  // statically that one side is already a NonEmptyString, insert a
-  // CheckNonEmptyString node.
-  void CheckInputsToNonEmptyString() {
-    if (!left_type().Is(Type::NonEmptyString())) {
-      Node* left_input = graph()->NewNode(simplified()->CheckNonEmptyString(),
-                                          left(), effect(), control());
-      node_->ReplaceInput(0, left_input);
-      update_effect(left_input);
-    }
-    if (!right_type().Is(Type::NonEmptyString())) {
-      Node* right_input = graph()->NewNode(simplified()->CheckNonEmptyString(),
-                                           right(), effect(), control());
-      node_->ReplaceInput(1, right_input);
-      update_effect(right_input);
-    }
-  }
-
   // Checks that both inputs are String, and if we don't know
   // statically that one side is already a String, insert a
   // CheckString node.
@@ -455,9 +426,11 @@
     : AdvancedReducer(editor),
       jsgraph_(jsgraph),
       broker_(broker),
+      empty_string_type_(Type::HeapConstant(broker, factory()->empty_string(),
+                                            graph()->zone())),
       pointer_comparable_type_(
           Type::Union(Type::Oddball(),
-                      Type::Union(Type::SymbolOrReceiver(), Type::EmptyString(),
+                      Type::Union(Type::SymbolOrReceiver(), empty_string_type_,
                                   graph()->zone()),
                       graph()->zone())),
       type_cache_(TypeCache::Get()) {}
@@ -551,25 +524,15 @@
   }
 
   // Always bake in String feedback into the graph.
-  BinaryOperationHint const hint = BinaryOperationHintOf(node->op());
-  if (hint == BinaryOperationHint::kConsOneByteString) {
-    r.CheckInputsToNonEmptyOneByteString();
-  } else if (hint == BinaryOperationHint::kConsTwoByteString) {
-    r.CheckInputsToNonEmptyTwoByteString();
-  } else if (hint == BinaryOperationHint::kConsString) {
-    r.CheckInputsToNonEmptyString();
-  } else if (hint == BinaryOperationHint::kString) {
+  if (BinaryOperationHintOf(node->op()) == BinaryOperationHint::kString) {
     r.CheckInputsToString();
   }
 
   // Strength-reduce concatenation of empty strings if both sides are
   // primitives, as in that case the ToPrimitive on the other side is
   // definitely going to be a no-op.
-  // TODO(bmeurer): Put this empty string magic into the StringConcat
-  // optimization, and instead go with just doing the input ToString()
-  // magic here.
   if (r.BothInputsAre(Type::Primitive())) {
-    if (r.LeftInputIs(Type::EmptyString())) {
+    if (r.LeftInputIs(empty_string_type_)) {
       // JSAdd("", x:primitive) => JSToString(x)
       NodeProperties::ReplaceValueInputs(node, r.right());
       NodeProperties::ChangeOp(node, javascript()->ToString());
@@ -577,7 +540,7 @@
           node, Type::Intersect(r.type(), Type::String(), graph()->zone()));
       Reduction const reduction = ReduceJSToString(node);
       return reduction.Changed() ? reduction : Changed(node);
-    } else if (r.RightInputIs(Type::EmptyString())) {
+    } else if (r.RightInputIs(empty_string_type_)) {
       // JSAdd(x:primitive, "") => JSToString(x)
       NodeProperties::ReplaceValueInputs(node, r.left());
       NodeProperties::ChangeOp(node, javascript()->ToString());
@@ -653,31 +616,19 @@
                            length, effect, control);
     }
 
-    if (hint == BinaryOperationHint::kConsString ||
-        hint == BinaryOperationHint::kConsOneByteString ||
-        hint == BinaryOperationHint::kConsTwoByteString) {
-      Node* check = graph()->NewNode(
-          simplified()->NumberLessThan(),
-          jsgraph()->Constant(ConsString::kMinLength - 1), length);
-      effect = graph()->NewNode(
-          simplified()->CheckIf(DeoptimizeReason::kWrongLength), check, effect,
-          control);
-      length = effect = graph()->NewNode(
-          common()->TypeGuard(type_cache_->kConsStringLengthType), length,
-          effect, control);
-    }
-
-    Operator const* const op = simplified()->StringConcat();
+    // TODO(bmeurer): Ideally this should always use StringConcat and decide to
+    // optimize to NewConsString later during SimplifiedLowering, but for that
+    // to work we need to know that it's safe to create a ConsString.
+    Operator const* const op = r.ShouldCreateConsString()
+                                   ? simplified()->NewConsString()
+                                   : simplified()->StringConcat();
     Node* value = graph()->NewNode(op, length, r.left(), r.right());
     ReplaceWithValue(node, value, effect, control);
     return Replace(value);
   }
 
   // We never get here when we had String feedback.
-  DCHECK_NE(BinaryOperationHint::kConsString, hint);
-  DCHECK_NE(BinaryOperationHint::kConsOneByteString, hint);
-  DCHECK_NE(BinaryOperationHint::kConsTwoByteString, hint);
-  DCHECK_NE(BinaryOperationHint::kString, hint);
+  DCHECK_NE(BinaryOperationHint::kString, BinaryOperationHintOf(node->op()));
   if (r.OneInputIs(Type::String())) {
     StringAddFlags flags = STRING_ADD_CHECK_NONE;
     if (!r.LeftInputIs(Type::String())) {
diff --git a/src/compiler/js-typed-lowering.h b/src/compiler/js-typed-lowering.h
index 7c1b2d9..d8164ac 100644
--- a/src/compiler/js-typed-lowering.h
+++ b/src/compiler/js-typed-lowering.h
@@ -99,6 +99,7 @@
 
   JSGraph* jsgraph_;
   JSHeapBroker* broker_;
+  Type empty_string_type_;
   Type pointer_comparable_type_;
   TypeCache const* type_cache_;
 };
diff --git a/src/compiler/opcodes.h b/src/compiler/opcodes.h
index 2900f5e..8aa815e 100644
--- a/src/compiler/opcodes.h
+++ b/src/compiler/opcodes.h
@@ -390,12 +390,9 @@
   V(CheckIf)                            \
   V(CheckMaps)                          \
   V(CheckNumber)                        \
+  V(CheckInternalizedString)            \
   V(CheckReceiver)                      \
   V(CheckReceiverOrNullOrUndefined)     \
-  V(CheckInternalizedString)            \
-  V(CheckNonEmptyString)                \
-  V(CheckNonEmptyOneByteString)         \
-  V(CheckNonEmptyTwoByteString)         \
   V(CheckString)                        \
   V(CheckSymbol)                        \
   V(CheckSmi)                           \
@@ -455,8 +452,6 @@
   V(NewDoubleElements)                  \
   V(NewSmiOrObjectElements)             \
   V(NewArgumentsElements)               \
-  V(NewConsOneByteString)               \
-  V(NewConsTwoByteString)               \
   V(NewConsString)                      \
   V(DelayedStringConstant)              \
   V(EnsureWritableFastElements)         \
diff --git a/src/compiler/operation-typer.cc b/src/compiler/operation-typer.cc
index 77bb500..c03e9d52 100644
--- a/src/compiler/operation-typer.cc
+++ b/src/compiler/operation-typer.cc
@@ -1212,29 +1212,6 @@
   return Type::Boolean();
 }
 
-Type OperationTyper::StringConcat(Type length, Type first, Type second) {
-  if (length.IsNone() || first.IsNone() || second.IsNone()) return Type::None();
-  if (first.Is(Type::EmptyString())) return second;
-  if (second.Is(Type::EmptyString())) return first;
-
-  first = Type::Intersect(first, Type::NonEmptyString(), zone());
-  second = Type::Intersect(second, Type::NonEmptyString(), zone());
-
-  Type type = Type::NonEmptyString();
-  if (first.Is(Type::NonEmptyOneByteString()) &&
-      second.Is(Type::NonEmptyOneByteString())) {
-    type = Type::NonEmptyOneByteString();
-  } else if (first.Is(Type::NonEmptyTwoByteString()) ||
-             second.Is(Type::NonEmptyTwoByteString())) {
-    type = Type::NonEmptyTwoByteString();
-  }
-
-  if (length.Min() == 0) {
-    type = Type::Union(type, Type::EmptyString(), zone());
-  }
-  return type;
-}
-
 Type OperationTyper::CheckBounds(Type index, Type length) {
   DCHECK(length.Is(cache_->kPositiveSafeInteger));
   if (length.Is(cache_->kSingletonZero)) return Type::None();
@@ -1258,26 +1235,6 @@
   return Type::Intersect(type, Type::Number(), zone());
 }
 
-Type OperationTyper::CheckInternalizedString(Type type) {
-  return Type::Intersect(type, Type::InternalizedString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyString(Type type) {
-  return Type::Intersect(type, Type::NonEmptyString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyOneByteString(Type type) {
-  return Type::Intersect(type, Type::NonEmptyOneByteString(), zone());
-}
-
-Type OperationTyper::CheckNonEmptyTwoByteString(Type type) {
-  return Type::Intersect(type, Type::NonEmptyTwoByteString(), zone());
-}
-
-Type OperationTyper::CheckString(Type type) {
-  return Type::Intersect(type, Type::String(), zone());
-}
-
 Type OperationTyper::TypeTypeGuard(const Operator* sigma_op, Type input) {
   return Type::Intersect(input, TypeGuardTypeOf(sigma_op), zone());
 }
diff --git a/src/compiler/operation-typer.h b/src/compiler/operation-typer.h
index 5279f3c..3297159 100644
--- a/src/compiler/operation-typer.h
+++ b/src/compiler/operation-typer.h
@@ -58,19 +58,10 @@
   Type SameValueNumbersOnly(Type lhs, Type rhs);
   Type StrictEqual(Type lhs, Type rhs);
 
-  // String operators.
-  Type StringConcat(Type length, Type first, Type second);
-
   // Check operators.
   Type CheckBounds(Type index, Type length);
   Type CheckFloat64Hole(Type type);
   Type CheckNumber(Type type);
-  Type CheckInternalizedString(Type type);
-  Type CheckNonEmptyString(Type type);
-  Type CheckNonEmptyOneByteString(Type type);
-  Type CheckNonEmptyTwoByteString(Type type);
-  Type CheckString(Type type);
-
   Type ConvertTaggedHoleToUndefined(Type type);
 
   Type TypeTypeGuard(const Operator* sigma_op, Type input);
diff --git a/src/compiler/redundancy-elimination.cc b/src/compiler/redundancy-elimination.cc
index a47fad3..0822e47 100644
--- a/src/compiler/redundancy-elimination.cc
+++ b/src/compiler/redundancy-elimination.cc
@@ -26,9 +26,6 @@
     case IrOpcode::kCheckHeapObject:
     case IrOpcode::kCheckIf:
     case IrOpcode::kCheckInternalizedString:
-    case IrOpcode::kCheckNonEmptyString:
-    case IrOpcode::kCheckNonEmptyOneByteString:
-    case IrOpcode::kCheckNonEmptyTwoByteString:
     case IrOpcode::kCheckNotTaggedHole:
     case IrOpcode::kCheckNumber:
     case IrOpcode::kCheckReceiver:
@@ -133,21 +130,6 @@
     if (a->opcode() == IrOpcode::kCheckInternalizedString &&
         b->opcode() == IrOpcode::kCheckString) {
       // CheckInternalizedString(node) implies CheckString(node)
-    } else if (a->opcode() == IrOpcode::kCheckNonEmptyString &&
-               b->opcode() == IrOpcode::kCheckString) {
-      // CheckNonEmptyString(node) implies CheckString(node)
-    } else if (a->opcode() == IrOpcode::kCheckNonEmptyOneByteString &&
-               b->opcode() == IrOpcode::kCheckNonEmptyString) {
-      // CheckNonEmptyOneByteString(node) implies CheckNonEmptyString(node)
-    } else if (a->opcode() == IrOpcode::kCheckNonEmptyTwoByteString &&
-               b->opcode() == IrOpcode::kCheckNonEmptyString) {
-      // CheckNonEmptyTwoByteString(node) implies CheckNonEmptyString(node)
-    } else if (a->opcode() == IrOpcode::kCheckNonEmptyOneByteString &&
-               b->opcode() == IrOpcode::kCheckString) {
-      // CheckNonEmptyOneByteString(node) implies CheckString(node)
-    } else if (a->opcode() == IrOpcode::kCheckNonEmptyTwoByteString &&
-               b->opcode() == IrOpcode::kCheckString) {
-      // CheckNonEmptyTwoByteString(node) implies CheckString(node)
     } else if (a->opcode() == IrOpcode::kCheckSmi &&
                b->opcode() == IrOpcode::kCheckNumber) {
       // CheckSmi(node) implies CheckNumber(node)
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
index 1332616..600eb23 100644
--- a/src/compiler/simplified-lowering.cc
+++ b/src/compiler/simplified-lowering.cc
@@ -462,13 +462,6 @@
     break;                                                              \
   }
       SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_CASE)
-      DECLARE_CASE(CheckFloat64Hole)
-      DECLARE_CASE(CheckNumber)
-      DECLARE_CASE(CheckInternalizedString)
-      DECLARE_CASE(CheckNonEmptyString)
-      DECLARE_CASE(CheckNonEmptyOneByteString)
-      DECLARE_CASE(CheckNonEmptyTwoByteString)
-      DECLARE_CASE(CheckString)
 #undef DECLARE_CASE
 
       case IrOpcode::kConvertReceiver:
@@ -485,9 +478,14 @@
                             info->restriction_type(), graph_zone());
         break;
 
-      case IrOpcode::kStringConcat:
-        new_type = op_typer_.StringConcat(input0_type, input1_type,
-                                          FeedbackTypeOf(node->InputAt(2)));
+      case IrOpcode::kCheckFloat64Hole:
+        new_type = Type::Intersect(op_typer_.CheckFloat64Hole(input0_type),
+                                   info->restriction_type(), graph_zone());
+        break;
+
+      case IrOpcode::kCheckNumber:
+        new_type = Type::Intersect(op_typer_.CheckNumber(input0_type),
+                                   info->restriction_type(), graph_zone());
         break;
 
       case IrOpcode::kPhi: {
@@ -2609,39 +2607,23 @@
         return VisitUnop(node, UseInfo::AnyTagged(),
                          MachineRepresentation::kTaggedPointer);
       }
+      case IrOpcode::kNewConsString: {
+        ProcessInput(node, 0, UseInfo::TruncatingWord32());  // length
+        ProcessInput(node, 1, UseInfo::AnyTagged());         // first
+        ProcessInput(node, 2, UseInfo::AnyTagged());         // second
+        SetOutput(node, MachineRepresentation::kTaggedPointer);
+        return;
+      }
       case IrOpcode::kStringConcat: {
-        Type const length_type = TypeOf(node->InputAt(0));
-        Type const first_type = TypeOf(node->InputAt(1));
-        Type const second_type = TypeOf(node->InputAt(2));
-        if (length_type.Is(type_cache_->kConsStringLengthType) &&
-            first_type.Is(Type::NonEmptyString()) &&
-            second_type.Is(Type::NonEmptyString())) {
-          // We know that we'll construct a ConsString here, so we
-          // can inline a fast-path into TurboFan optimized code.
-          ProcessInput(node, 0, UseInfo::TruncatingWord32());  // length
-          ProcessInput(node, 1, UseInfo::AnyTagged());         // first
-          ProcessInput(node, 2, UseInfo::AnyTagged());         // second
-          SetOutput(node, MachineRepresentation::kTaggedPointer);
-          if (lower()) {
-            if (first_type.Is(Type::NonEmptyOneByteString()) &&
-                second_type.Is(Type::NonEmptyOneByteString())) {
-              NodeProperties::ChangeOp(
-                  node, lowering->simplified()->NewConsOneByteString());
-            } else if (first_type.Is(Type::NonEmptyTwoByteString()) ||
-                       second_type.Is(Type::NonEmptyTwoByteString())) {
-              NodeProperties::ChangeOp(
-                  node, lowering->simplified()->NewConsTwoByteString());
-            } else {
-              NodeProperties::ChangeOp(node,
-                                       lowering->simplified()->NewConsString());
-            }
-          }
-        } else {
-          ProcessInput(node, 0, UseInfo::TaggedSigned());  // length
-          ProcessInput(node, 1, UseInfo::AnyTagged());     // first
-          ProcessInput(node, 2, UseInfo::AnyTagged());     // second
-          SetOutput(node, MachineRepresentation::kTaggedPointer);
-        }
+        // TODO(turbofan): We currently depend on having this first length input
+        // to make sure that the overflow check is properly scheduled before the
+        // actual string concatenation. We should also use the length to pass it
+        // to the builtin or decide in optimized code how to construct the
+        // resulting string (i.e. cons string or sequential string).
+        ProcessInput(node, 0, UseInfo::TaggedSigned());  // length
+        ProcessInput(node, 1, UseInfo::AnyTagged());     // first
+        ProcessInput(node, 2, UseInfo::AnyTagged());     // second
+        SetOutput(node, MachineRepresentation::kTaggedPointer);
         return;
       }
       case IrOpcode::kStringEqual:
@@ -2725,18 +2707,6 @@
         VisitCheck(node, Type::InternalizedString(), lowering);
         return;
       }
-      case IrOpcode::kCheckNonEmptyString: {
-        VisitCheck(node, Type::NonEmptyString(), lowering);
-        return;
-      }
-      case IrOpcode::kCheckNonEmptyOneByteString: {
-        VisitCheck(node, Type::NonEmptyOneByteString(), lowering);
-        return;
-      }
-      case IrOpcode::kCheckNonEmptyTwoByteString: {
-        VisitCheck(node, Type::NonEmptyTwoByteString(), lowering);
-        return;
-      }
       case IrOpcode::kCheckNumber: {
         Type const input_type = TypeOf(node->InputAt(0));
         if (input_type.Is(Type::Number())) {
diff --git a/src/compiler/simplified-operator.cc b/src/compiler/simplified-operator.cc
index ec31f44..0c9be0e 100644
--- a/src/compiler/simplified-operator.cc
+++ b/src/compiler/simplified-operator.cc
@@ -743,8 +743,6 @@
   V(StringLessThan, Operator::kNoProperties, 2, 0)                 \
   V(StringLessThanOrEqual, Operator::kNoProperties, 2, 0)          \
   V(ToBoolean, Operator::kNoProperties, 1, 0)                      \
-  V(NewConsOneByteString, Operator::kNoProperties, 3, 0)           \
-  V(NewConsTwoByteString, Operator::kNoProperties, 3, 0)           \
   V(NewConsString, Operator::kNoProperties, 3, 0)                  \
   V(PoisonIndex, Operator::kNoProperties, 1, 0)
 
@@ -763,9 +761,6 @@
   V(CheckEqualsInternalizedString, 2, 0)  \
   V(CheckEqualsSymbol, 2, 0)              \
   V(CheckHeapObject, 1, 1)                \
-  V(CheckNonEmptyString, 1, 1)            \
-  V(CheckNonEmptyOneByteString, 1, 1)     \
-  V(CheckNonEmptyTwoByteString, 1, 1)     \
   V(CheckInternalizedString, 1, 1)        \
   V(CheckNotTaggedHole, 1, 1)             \
   V(CheckReceiver, 1, 1)                  \
diff --git a/src/compiler/simplified-operator.h b/src/compiler/simplified-operator.h
index d45cea0..3554c6a 100644
--- a/src/compiler/simplified-operator.h
+++ b/src/compiler/simplified-operator.h
@@ -682,6 +682,7 @@
   const Operator* CheckHeapObject();
   const Operator* CheckIf(DeoptimizeReason deoptimize_reason,
                           const VectorSlotPair& feedback = VectorSlotPair());
+  const Operator* CheckInternalizedString();
   const Operator* CheckMaps(CheckMapsFlags, ZoneHandleSet<Map>,
                             const VectorSlotPair& = VectorSlotPair());
   const Operator* CheckNotTaggedHole();
@@ -689,10 +690,6 @@
   const Operator* CheckReceiver();
   const Operator* CheckReceiverOrNullOrUndefined();
   const Operator* CheckSmi(const VectorSlotPair& feedback);
-  const Operator* CheckInternalizedString();
-  const Operator* CheckNonEmptyString();
-  const Operator* CheckNonEmptyOneByteString();
-  const Operator* CheckNonEmptyTwoByteString();
   const Operator* CheckString(const VectorSlotPair& feedback);
   const Operator* CheckSymbol();
 
@@ -777,8 +774,6 @@
   const Operator* NewArgumentsElements(int mapped_count);
 
   // new-cons-string length, first, second
-  const Operator* NewConsOneByteString();
-  const Operator* NewConsTwoByteString();
   const Operator* NewConsString();
 
   // ensure-writable-fast-elements object, elements
diff --git a/src/compiler/type-cache.h b/src/compiler/type-cache.h
index 9ca87a6..1a1555d 100644
--- a/src/compiler/type-cache.h
+++ b/src/compiler/type-cache.h
@@ -121,11 +121,6 @@
   // [0, String::kMaxLength].
   Type const kStringLengthType = CreateRange(0.0, String::kMaxLength);
 
-  // The ConsString::length property always contains a smi in the range
-  // [ConsString::kMinLength, ConsString::kMaxLength].
-  Type const kConsStringLengthType =
-      CreateRange(ConsString::kMinLength, ConsString::kMaxLength);
-
   // A time value always contains a tagged number in the range
   // [-kMaxTimeInMs, kMaxTimeInMs].
   Type const kTimeValueType =
diff --git a/src/compiler/typer.cc b/src/compiler/typer.cc
index 6a8fb98..1ce45d3 100644
--- a/src/compiler/typer.cc
+++ b/src/compiler/typer.cc
@@ -1171,7 +1171,7 @@
 }
 
 Type Typer::Visitor::TypeTypeOf(Node* node) {
-  return Type::NonEmptyInternalizedOneByteString();
+  return Type::InternalizedString();
 }
 
 
@@ -1583,7 +1583,7 @@
     case Builtins::kNumberParseInt:
       return t->cache_->kIntegerOrMinusZeroOrNaN;
     case Builtins::kNumberToString:
-      return Type::NonEmptyOneByteString();
+      return Type::String();
 
     // String functions.
     case Builtins::kStringConstructor:
@@ -1643,7 +1643,7 @@
     case Builtins::kSetIteratorPrototypeNext:
       return Type::OtherObject();
     case Builtins::kTypedArrayPrototypeToStringTag:
-      return Type::Union(Type::InternalizedOneByteString(), Type::Undefined(),
+      return Type::Union(Type::InternalizedString(), Type::Undefined(),
                          t->zone());
 
     // Array functions.
@@ -1953,12 +1953,7 @@
   return TypeBinaryOp(node, NumberLessThanOrEqualTyper);
 }
 
-Type Typer::Visitor::TypeStringConcat(Node* node) {
-  Type length = Operand(node, 0);
-  Type first = Operand(node, 1);
-  Type second = Operand(node, 2);
-  return typer_->operation_typer_.StringConcat(length, first, second);
-}
+Type Typer::Visitor::TypeStringConcat(Node* node) { return Type::String(); }
 
 Type Typer::Visitor::TypeStringToNumber(Node* node) {
   return TypeUnaryOp(node, ToNumber);
@@ -2017,11 +2012,11 @@
 }
 
 Type Typer::Visitor::StringFromSingleCharCodeTyper(Type type, Typer* t) {
-  return Type::NonEmptyString();
+  return Type::String();
 }
 
 Type Typer::Visitor::StringFromSingleCodePointTyper(Type type, Typer* t) {
-  return Type::NonEmptyString();
+  return Type::String();
 }
 
 Type Typer::Visitor::TypeStringToLowerCaseIntl(Node* node) {
@@ -2074,20 +2069,9 @@
 
 Type Typer::Visitor::TypeCheckIf(Node* node) { UNREACHABLE(); }
 
-Type Typer::Visitor::TypeCheckNonEmptyString(Node* node) {
-  return typer_->operation_typer_.CheckNonEmptyString(Operand(node, 0));
-}
-
-Type Typer::Visitor::TypeCheckNonEmptyOneByteString(Node* node) {
-  return typer_->operation_typer_.CheckNonEmptyOneByteString(Operand(node, 0));
-}
-
-Type Typer::Visitor::TypeCheckNonEmptyTwoByteString(Node* node) {
-  return typer_->operation_typer_.CheckNonEmptyTwoByteString(Operand(node, 0));
-}
-
 Type Typer::Visitor::TypeCheckInternalizedString(Node* node) {
-  return typer_->operation_typer_.CheckInternalizedString(Operand(node, 0));
+  Type arg = Operand(node, 0);
+  return Type::Intersect(arg, Type::InternalizedString(), zone());
 }
 
 Type Typer::Visitor::TypeCheckMaps(Node* node) { UNREACHABLE(); }
@@ -2114,7 +2098,8 @@
 }
 
 Type Typer::Visitor::TypeCheckString(Node* node) {
-  return typer_->operation_typer_.CheckString(Operand(node, 0));
+  Type arg = Operand(node, 0);
+  return Type::Intersect(arg, Type::String(), zone());
 }
 
 Type Typer::Visitor::TypeCheckSymbol(Node* node) {
@@ -2321,11 +2306,7 @@
   return Type::OtherInternal();
 }
 
-Type Typer::Visitor::TypeNewConsString(Node* node) { UNREACHABLE(); }
-
-Type Typer::Visitor::TypeNewConsOneByteString(Node* node) { UNREACHABLE(); }
-
-Type Typer::Visitor::TypeNewConsTwoByteString(Node* node) { UNREACHABLE(); }
+Type Typer::Visitor::TypeNewConsString(Node* node) { return Type::String(); }
 
 Type Typer::Visitor::TypeDelayedStringConstant(Node* node) {
   return Type::String();
diff --git a/src/compiler/types.cc b/src/compiler/types.cc
index b0f9088..14496cf 100644
--- a/src/compiler/types.cc
+++ b/src/compiler/types.cc
@@ -137,30 +137,26 @@
 template <typename MapRefLike>
 Type::bitset BitsetType::Lub(const MapRefLike& map) {
   switch (map.instance_type()) {
-    case EMPTY_STRING_TYPE:
-      return kEmptyString;
     case CONS_STRING_TYPE:
-    case SLICED_STRING_TYPE:
-    case EXTERNAL_STRING_TYPE:
-    case UNCACHED_EXTERNAL_STRING_TYPE:
-    case STRING_TYPE:
-    case THIN_STRING_TYPE:
-      return kNonEmptyTwoByteString;
     case CONS_ONE_BYTE_STRING_TYPE:
-    case SLICED_ONE_BYTE_STRING_TYPE:
-    case EXTERNAL_ONE_BYTE_STRING_TYPE:
-    case UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE:
-    case ONE_BYTE_STRING_TYPE:
+    case THIN_STRING_TYPE:
     case THIN_ONE_BYTE_STRING_TYPE:
-      return kNonEmptyOneByteString;
+    case SLICED_STRING_TYPE:
+    case SLICED_ONE_BYTE_STRING_TYPE:
+    case EXTERNAL_STRING_TYPE:
+    case EXTERNAL_ONE_BYTE_STRING_TYPE:
+    case UNCACHED_EXTERNAL_STRING_TYPE:
+    case UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE:
+    case STRING_TYPE:
+    case ONE_BYTE_STRING_TYPE:
+      return kString;
     case EXTERNAL_INTERNALIZED_STRING_TYPE:
-    case UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE:
-    case INTERNALIZED_STRING_TYPE:
-      return kNonEmptyInternalizedTwoByteString;
     case EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE:
+    case UNCACHED_EXTERNAL_INTERNALIZED_STRING_TYPE:
     case UNCACHED_EXTERNAL_ONE_BYTE_INTERNALIZED_STRING_TYPE:
+    case INTERNALIZED_STRING_TYPE:
     case ONE_BYTE_INTERNALIZED_STRING_TYPE:
-      return kNonEmptyInternalizedOneByteString;
+      return kInternalizedString;
     case SYMBOL_TYPE:
       return kSymbol;
     case BIGINT_TYPE:
@@ -403,10 +399,7 @@
 }
 
 Type::bitset BitsetType::ExpandInternals(Type::bitset bits) {
-  DCHECK_IMPLIES(bits & kOtherOneByteString,
-                 bits & kNonEmptyInternalizedOneByteString);
-  DCHECK_IMPLIES(bits & kOtherTwoByteString,
-                 bits & kNonEmptyInternalizedTwoByteString);
+  DCHECK_IMPLIES(bits & kOtherString, (bits & kString) == kString);
   DisallowHeapAllocation no_allocation;
   if (!(bits & kPlainNumber)) return bits;  // Shortcut.
   const Boundary* boundaries = Boundaries();
@@ -864,7 +857,7 @@
     return NewConstant(ref.AsHeapNumber().value(), zone);
   }
   if (ref.IsString() && !ref.IsInternalizedString()) {
-    return For(ref.AsString().map());
+    return Type::String();
   }
   return HeapConstant(ref.AsHeapObject(), zone);
 }
diff --git a/src/compiler/types.h b/src/compiler/types.h
index e9c435d..a4219ec 100644
--- a/src/compiler/types.h
+++ b/src/compiler/types.h
@@ -100,38 +100,35 @@
 // clang-format off
 
 #define INTERNAL_BITSET_TYPE_LIST(V)                                      \
-  V(OtherUnsigned31,    1u << 1)  \
-  V(OtherUnsigned32,    1u << 2)  \
-  V(OtherSigned32,      1u << 3)  \
-  V(OtherNumber,        1u << 4)  \
-  V(OtherOneByteString, 1u << 5)  \
-  V(OtherTwoByteString, 1u << 6)  \
+  V(OtherUnsigned31, 1u << 1)  \
+  V(OtherUnsigned32, 1u << 2)  \
+  V(OtherSigned32,   1u << 3)  \
+  V(OtherNumber,     1u << 4)  \
+  V(OtherString,     1u << 5)  \
 
 #define PROPER_BITSET_TYPE_LIST(V) \
-  V(None,                              0u)        \
-  V(Negative31,                        1u << 7)   \
-  V(Null,                              1u << 8)   \
-  V(Undefined,                         1u << 9)   \
-  V(Boolean,                           1u << 10)  \
-  V(Unsigned30,                        1u << 11)  \
-  V(MinusZero,                         1u << 12)  \
-  V(NaN,                               1u << 13)  \
-  V(Symbol,                            1u << 14)  \
-  V(EmptyString,                       1u << 15)  \
-  V(NonEmptyInternalizedOneByteString, 1u << 16)  \
-  V(NonEmptyInternalizedTwoByteString, 1u << 17)  \
-  V(OtherCallable,                     1u << 18)  \
-  V(OtherObject,                       1u << 19)  \
-  V(OtherUndetectable,                 1u << 20)  \
-  V(CallableProxy,                     1u << 21)  \
-  V(OtherProxy,                        1u << 22)  \
-  V(Function,                          1u << 23)  \
-  V(BoundFunction,                     1u << 24)  \
-  V(Hole,                              1u << 25)  \
-  V(OtherInternal,                     1u << 26)  \
-  V(ExternalPointer,                   1u << 27)  \
-  V(Array,                             1u << 28)  \
-  V(BigInt,                            1u << 29)  \
+  V(None,                     0u)        \
+  V(Negative31,               1u << 6)   \
+  V(Null,                     1u << 7)   \
+  V(Undefined,                1u << 8)   \
+  V(Boolean,                  1u << 9)   \
+  V(Unsigned30,               1u << 10)   \
+  V(MinusZero,                1u << 11)  \
+  V(NaN,                      1u << 12)  \
+  V(Symbol,                   1u << 13)  \
+  V(InternalizedString,       1u << 14)  \
+  V(OtherCallable,            1u << 16)  \
+  V(OtherObject,              1u << 17)  \
+  V(OtherUndetectable,        1u << 18)  \
+  V(CallableProxy,            1u << 19)  \
+  V(OtherProxy,               1u << 20)  \
+  V(Function,                 1u << 21)  \
+  V(BoundFunction,            1u << 22)  \
+  V(Hole,                     1u << 23)  \
+  V(OtherInternal,            1u << 24)  \
+  V(ExternalPointer,          1u << 25)  \
+  V(Array,                    1u << 26)  \
+  V(BigInt,                   1u << 27)  \
   \
   V(Signed31,                     kUnsigned30 | kNegative31) \
   V(Signed32,                     kSigned31 | kOtherUnsigned31 | \
@@ -152,19 +149,7 @@
   V(MinusZeroOrNaN,               kMinusZero | kNaN) \
   V(Number,                       kOrderedNumber | kNaN) \
   V(Numeric,                      kNumber | kBigInt) \
-  V(InternalizedOneByteString,    kEmptyString | \
-                                  kNonEmptyInternalizedOneByteString) \
-  V(OneByteString,                kInternalizedOneByteString | \
-                                  kOtherOneByteString) \
-  V(InternalizedString,           kInternalizedOneByteString | \
-                                  kNonEmptyInternalizedTwoByteString) \
-  V(NonEmptyOneByteString,        kNonEmptyInternalizedOneByteString | \
-                                  kOtherOneByteString) \
-  V(NonEmptyTwoByteString,        kNonEmptyInternalizedTwoByteString | \
-                                  kOtherTwoByteString) \
-  V(NonEmptyString,               kNonEmptyOneByteString | \
-                                  kNonEmptyTwoByteString) \
-  V(String,                       kEmptyString | kNonEmptyString) \
+  V(String,                       kInternalizedString | kOtherString) \
   V(UniqueName,                   kSymbol | kInternalizedString) \
   V(Name,                         kSymbol | kString) \
   V(InternalizedStringOrNull,     kInternalizedString | kNull) \
diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc
index 1bfc0d9..d6ed56e 100644
--- a/src/compiler/verifier.cc
+++ b/src/compiler/verifier.cc
@@ -1276,8 +1276,10 @@
       CheckTypeIs(node, Type::OtherInternal());
       break;
     case IrOpcode::kNewConsString:
-    case IrOpcode::kNewConsOneByteString:
-    case IrOpcode::kNewConsTwoByteString:
+      CheckValueInputIs(node, 0, TypeCache::Get()->kStringLengthType);
+      CheckValueInputIs(node, 1, Type::String());
+      CheckValueInputIs(node, 2, Type::String());
+      CheckTypeIs(node, Type::String());
       break;
     case IrOpcode::kDelayedStringConstant:
       CheckTypeIs(node, Type::String());
@@ -1452,18 +1454,6 @@
       CheckValueInputIs(node, 0, Type::Any());
       CheckTypeIs(node, Type::InternalizedString());
       break;
-    case IrOpcode::kCheckNonEmptyString:
-      CheckValueInputIs(node, 0, Type::Any());
-      CheckTypeIs(node, Type::NonEmptyString());
-      break;
-    case IrOpcode::kCheckNonEmptyOneByteString:
-      CheckValueInputIs(node, 0, Type::Any());
-      CheckTypeIs(node, Type::NonEmptyOneByteString());
-      break;
-    case IrOpcode::kCheckNonEmptyTwoByteString:
-      CheckValueInputIs(node, 0, Type::Any());
-      CheckTypeIs(node, Type::NonEmptyTwoByteString());
-      break;
     case IrOpcode::kCheckMaps:
       CheckValueInputIs(node, 0, Type::Any());
       CheckNotTyped(node);
diff --git a/src/deoptimize-reason.h b/src/deoptimize-reason.h
index dd79906..8fa2a25 100644
--- a/src/deoptimize-reason.h
+++ b/src/deoptimize-reason.h
@@ -54,7 +54,6 @@
   V(WrongCallTarget, "wrong call target")                                      \
   V(WrongEnumIndices, "wrong enum indices")                                    \
   V(WrongInstanceType, "wrong instance type")                                  \
-  V(WrongLength, "wrong length")                                               \
   V(WrongMap, "wrong map")                                                     \
   V(WrongName, "wrong name")                                                   \
   V(WrongValue, "wrong value")                                                 \
diff --git a/src/feedback-vector-inl.h b/src/feedback-vector-inl.h
index a428393..6573ceab 100644
--- a/src/feedback-vector-inl.h
+++ b/src/feedback-vector-inl.h
@@ -212,12 +212,6 @@
       return BinaryOperationHint::kNumber;
     case BinaryOperationFeedback::kNumberOrOddball:
       return BinaryOperationHint::kNumberOrOddball;
-    case BinaryOperationFeedback::kConsOneByteString:
-      return BinaryOperationHint::kConsOneByteString;
-    case BinaryOperationFeedback::kConsTwoByteString:
-      return BinaryOperationHint::kConsTwoByteString;
-    case BinaryOperationFeedback::kConsString:
-      return BinaryOperationHint::kConsString;
     case BinaryOperationFeedback::kString:
       return BinaryOperationHint::kString;
     case BinaryOperationFeedback::kBigInt:
diff --git a/src/globals.h b/src/globals.h
index 39dd827..bc0c890 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1225,7 +1225,7 @@
 // to a more generic type when we combine feedback.
 //
 //   kSignedSmall -> kSignedSmallInputs -> kNumber  -> kNumberOrOddball -> kAny
-//                   kConsString                    -> kString          -> kAny
+//                                                     kString          -> kAny
 //                                                     kBigInt          -> kAny
 //
 // Technically we wouldn't need the separation between the kNumber and the
@@ -1242,12 +1242,9 @@
     kSignedSmallInputs = 0x3,
     kNumber = 0x7,
     kNumberOrOddball = 0xF,
-    kConsOneByteString = 0x10,
-    kConsTwoByteString = 0x20,
-    kConsString = kConsOneByteString | kConsTwoByteString,
-    kString = 0x70,
-    kBigInt = 0x100,
-    kAny = 0x3FF
+    kString = 0x10,
+    kBigInt = 0x20,
+    kAny = 0x7F
   };
 };
 
diff --git a/src/heap/factory.cc b/src/heap/factory.cc
index b0aa3cb..119d71b 100644
--- a/src/heap/factory.cc
+++ b/src/heap/factory.cc
@@ -881,8 +881,7 @@
       length == 0,
       isolate()->roots_table()[RootIndex::kempty_string] == kNullAddress);
 
-  Map map =
-      length == 0 ? *empty_string_map() : *one_byte_internalized_string_map();
+  Map map = *one_byte_internalized_string_map();
   int size = SeqOneByteString::SizeFor(length);
   HeapObject result =
       AllocateRawWithImmortalMap(size,
@@ -1234,8 +1233,6 @@
 
 Handle<String> Factory::NewConsString(Handle<String> left, Handle<String> right,
                                       int length, bool one_byte) {
-  DCHECK_GT(left->length(), 0);
-  DCHECK_GT(right->length(), 0);
   DCHECK(!left->IsThinString());
   DCHECK(!right->IsThinString());
   DCHECK_GE(length, ConsString::kMinLength);
diff --git a/src/ic/binary-op-assembler.cc b/src/ic/binary-op-assembler.cc
index a2e197d..ebe6443 100644
--- a/src/ic/binary-op-assembler.cc
+++ b/src/ic/binary-op-assembler.cc
@@ -160,8 +160,11 @@
       // need an Oddball check.
       GotoIfNot(IsStringInstanceType(rhs_instance_type),
                 &call_with_any_feedback);
+
+      var_type_feedback.Bind(SmiConstant(BinaryOperationFeedback::kString));
       var_result.Bind(
-          StringAdd(context, CAST(lhs), CAST(rhs), &var_type_feedback));
+          CallBuiltin(Builtins::kStringAdd_CheckNone, context, lhs, rhs));
+
       Goto(&end);
     }
   }
diff --git a/src/objects-debug.cc b/src/objects-debug.cc
index 8fada5d..b8cfb02 100644
--- a/src/objects-debug.cc
+++ b/src/objects-debug.cc
@@ -1019,8 +1019,6 @@
   CHECK(IsString());
   CHECK(length() >= 0 && length() <= Smi::kMaxValue);
   CHECK_IMPLIES(length() == 0, *this == ReadOnlyRoots(isolate).empty_string());
-  CHECK_EQ(*this == ReadOnlyRoots(isolate).empty_string(),
-           map() == ReadOnlyRoots(isolate).empty_string_map());
   if (IsInternalizedString()) {
     CHECK(!ObjectInYoungGeneration(*this));
   }
@@ -1035,8 +1033,8 @@
 
 void ConsString::ConsStringVerify(Isolate* isolate) {
   CHECK(this->first()->IsString());
-  CHECK(this->second()->IsString());
-  CHECK_GT(this->first()->length(), 0);
+  CHECK(this->second() == ReadOnlyRoots(isolate).empty_string() ||
+        this->second()->IsString());
   CHECK_GE(this->length(), ConsString::kMinLength);
   CHECK(this->length() == this->first()->length() + this->second()->length());
   if (this->IsFlat()) {
diff --git a/src/objects-definitions.h b/src/objects-definitions.h
index 3ac34e2..97c57f8 100644
--- a/src/objects-definitions.h
+++ b/src/objects-definitions.h
@@ -57,7 +57,6 @@
   V(THIN_ONE_BYTE_STRING_TYPE)                           \
   V(UNCACHED_EXTERNAL_STRING_TYPE)                       \
   V(UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE)              \
-  V(EMPTY_STRING_TYPE)                                   \
                                                          \
   V(SYMBOL_TYPE)                                         \
   V(HEAP_NUMBER_TYPE)                                    \
@@ -287,8 +286,7 @@
     UncachedExternalOneByteInternalizedString)                                 \
   V(THIN_STRING_TYPE, ThinString::kSize, thin_string, ThinString)              \
   V(THIN_ONE_BYTE_STRING_TYPE, ThinString::kSize, thin_one_byte_string,        \
-    ThinOneByteString)                                                         \
-  V(EMPTY_STRING_TYPE, kVariableSizeSentinel, empty_string, EmptyString)
+    ThinOneByteString)
 
 // A struct is a simple object a set of object-valued fields.  Including an
 // object type in this causes the compiler to generate most of the boilerplate
diff --git a/src/objects-printer.cc b/src/objects-printer.cc
index 6b8d540..8c3c647 100644
--- a/src/objects-printer.cc
+++ b/src/objects-printer.cc
@@ -428,7 +428,6 @@
     case WEAK_ARRAY_LIST_TYPE:
       WeakArrayList::cast(*this)->WeakArrayListPrint(os);
       break;
-    case EMPTY_STRING_TYPE:
     case INTERNALIZED_STRING_TYPE:
     case EXTERNAL_INTERNALIZED_STRING_TYPE:
     case ONE_BYTE_INTERNALIZED_STRING_TYPE:
diff --git a/src/objects.cc b/src/objects.cc
index 795cb47..be55fef 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -2224,8 +2224,7 @@
     DCHECK_NE(instance_type, NATIVE_CONTEXT_TYPE);
     return Context::SizeFor(Context::unchecked_cast(*this)->length());
   }
-  if (instance_type == EMPTY_STRING_TYPE ||
-      instance_type == ONE_BYTE_STRING_TYPE ||
+  if (instance_type == ONE_BYTE_STRING_TYPE ||
       instance_type == ONE_BYTE_INTERNALIZED_STRING_TYPE) {
     // Strings may get concurrently truncated, hence we have to access its
     // length synchronized.
@@ -2402,9 +2401,8 @@
     case SMALL_ORDERED_NAME_DICTIONARY_TYPE:
       DCHECK_EQ(0, SmallOrderedNameDictionary::cast(*this)->NumberOfElements());
       break;
-    case EMPTY_STRING_TYPE:
-    case INTERNALIZED_STRING_TYPE:
     case ONE_BYTE_INTERNALIZED_STRING_TYPE:
+    case INTERNALIZED_STRING_TYPE:
       // Rare case, rehash read-only space strings before they are sealed.
       DCHECK(ReadOnlyHeap::Contains(*this));
       String::cast(*this)->Hash();
diff --git a/src/objects/instance-type.h b/src/objects/instance-type.h
index 96606d5..edbc428 100644
--- a/src/objects/instance-type.h
+++ b/src/objects/instance-type.h
@@ -15,9 +15,9 @@
 namespace internal {
 
 // We use the full 16 bits of the instance_type field to encode heap object
-// instance types. All the high-order bits (bits 7-15) are cleared if the object
+// instance types. All the high-order bits (bits 6-15) are cleared if the object
 // is a string, and contain set bits if it is not a string.
-const uint32_t kIsNotStringMask = ~((1 << 7) - 1);
+const uint32_t kIsNotStringMask = ~((1 << 6) - 1);
 const uint32_t kStringTag = 0x0;
 
 // For strings, bits 0-2 indicate the representation of the string. In
@@ -57,12 +57,6 @@
 const uint32_t kNotInternalizedTag = 1 << 5;
 const uint32_t kInternalizedTag = 0;
 
-// For strings, bit 6 indicates that the string is empty.
-// TODO(bmeurer)
-const uint32_t kIsEmptyStringMask = 1 << 6;
-const uint32_t kIsEmptyStringTag = 1 << 6;
-const uint32_t kIsNotEmptyStringTag = 0;
-
 // A ConsString with an empty string as the right side is a candidate
 // for being shortcut by the garbage collector. We don't allocate any
 // non-flat internalized strings, so we do not shortcut them thereby
@@ -114,13 +108,11 @@
   THIN_STRING_TYPE = kTwoByteStringTag | kThinStringTag | kNotInternalizedTag,
   THIN_ONE_BYTE_STRING_TYPE =
       kOneByteStringTag | kThinStringTag | kNotInternalizedTag,
-  EMPTY_STRING_TYPE =
-      kOneByteStringTag | kSeqStringTag | kInternalizedTag | kIsEmptyStringTag,
 
   // Non-string names
   SYMBOL_TYPE =
       1 + (kIsNotInternalizedMask | kUncachedExternalStringMask |
-           kStringEncodingMask | kIsEmptyStringMask |
+           kStringEncodingMask |
            kStringRepresentationMask),  // FIRST_NONSTRING_TYPE, LAST_NAME_TYPE
 
   // Other primitives (cannot contain non-map-word pointers to heap objects).
diff --git a/src/objects/string.cc b/src/objects/string.cc
index b1dfa38..22157a3 100644
--- a/src/objects/string.cc
+++ b/src/objects/string.cc
@@ -24,8 +24,19 @@
 
 Handle<String> String::SlowFlatten(Isolate* isolate, Handle<ConsString> cons,
                                    AllocationType allocation) {
-  DCHECK_GT(cons->first()->length(), 0);
-  DCHECK_GT(cons->second()->length(), 0);
+  DCHECK_NE(cons->second()->length(), 0);
+
+  // TurboFan can create cons strings with empty first parts.
+  while (cons->first()->length() == 0) {
+    // We do not want to call this function recursively. Therefore we call
+    // String::Flatten only in those cases where String::SlowFlatten is not
+    // called again.
+    if (cons->second()->IsConsString() && !cons->second()->IsFlat()) {
+      cons = handle(ConsString::cast(cons->second()), isolate);
+    } else {
+      return String::Flatten(isolate, handle(cons->second(), isolate));
+    }
+  }
 
   DCHECK(AllowHeapAllocation::IsAllowed());
   int length = cons->length();
diff --git a/src/roots.h b/src/roots.h
index 2406d75..d1d1301 100644
--- a/src/roots.h
+++ b/src/roots.h
@@ -128,7 +128,6 @@
   V(Map, embedder_data_array_map, EmbedderDataArrayMap)                        \
   V(Map, weak_cell_map, WeakCellMap)                                           \
   /* String maps */                                                            \
-  V(Map, empty_string_map, EmptyStringMap)                                     \
   V(Map, native_source_string_map, NativeSourceStringMap)                      \
   V(Map, string_map, StringMap)                                                \
   V(Map, cons_one_byte_string_map, ConsOneByteStringMap)                       \
diff --git a/src/type-hints.cc b/src/type-hints.cc
index c97f3bc..c6fd06f 100644
--- a/src/type-hints.cc
+++ b/src/type-hints.cc
@@ -21,12 +21,6 @@
       return os << "Number";
     case BinaryOperationHint::kNumberOrOddball:
       return os << "NumberOrOddball";
-    case BinaryOperationHint::kConsOneByteString:
-      return os << "ConsOneByteString";
-    case BinaryOperationHint::kConsTwoByteString:
-      return os << "ConsTwoByteString";
-    case BinaryOperationHint::kConsString:
-      return os << "ConsString";
     case BinaryOperationHint::kString:
       return os << "String";
     case BinaryOperationHint::kBigInt:
diff --git a/src/type-hints.h b/src/type-hints.h
index 75ec4df..3f34f92 100644
--- a/src/type-hints.h
+++ b/src/type-hints.h
@@ -19,9 +19,6 @@
   kSigned32,
   kNumber,
   kNumberOrOddball,
-  kConsOneByteString,
-  kConsTwoByteString,
-  kConsString,
   kString,
   kBigInt,
   kAny
diff --git a/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden b/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
index 52bc6dd..231a905 100644
--- a/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
+++ b/test/cctest/interpreter/bytecode_expectations/AsyncGenerators.golden
@@ -428,7 +428,7 @@
   Smi [16],
   Smi [7],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
   SCOPE_INFO_TYPE,
diff --git a/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden b/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
index 3770a40..b065203 100644
--- a/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
+++ b/test/cctest/interpreter/bytecode_expectations/CallLookupSlot.golden
@@ -50,7 +50,7 @@
   SHARED_FUNCTION_INFO_TYPE,
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["g"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
 ]
diff --git a/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden b/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
index 73e2995..f4a7c34 100644
--- a/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
+++ b/test/cctest/interpreter/bytecode_expectations/DestructuringAssignment.golden
@@ -101,7 +101,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [44, 86, 94],
@@ -238,7 +238,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [44, 172, 180],
@@ -363,7 +363,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["foo"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [47, 137, 145],
diff --git a/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden b/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
index 3c5cce4..6fe59da 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForAwaitOf.golden
@@ -165,7 +165,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   SCOPE_INFO_TYPE,
 ]
 handlers: [
@@ -340,7 +340,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
   SCOPE_INFO_TYPE,
@@ -519,7 +519,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   SCOPE_INFO_TYPE,
 ]
 handlers: [
@@ -662,7 +662,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
   SCOPE_INFO_TYPE,
diff --git a/test/cctest/interpreter/bytecode_expectations/ForOf.golden b/test/cctest/interpreter/bytecode_expectations/ForOf.golden
index 9163bee..571002d 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForOf.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForOf.golden
@@ -97,7 +97,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [38, 81, 89],
@@ -202,7 +202,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
 ]
@@ -313,7 +313,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [38, 97, 105],
@@ -423,7 +423,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["a"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
 ]
diff --git a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
index eac63a9..f85f09c 100644
--- a/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
+++ b/test/cctest/interpreter/bytecode_expectations/ForOfLoop.golden
@@ -100,7 +100,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [35, 81, 89],
@@ -243,7 +243,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["1"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [65, 160, 168],
@@ -354,7 +354,7 @@
   SCOPE_INFO_TYPE,
   SHARED_FUNCTION_INFO_TYPE,
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [35, 98, 106],
@@ -466,7 +466,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["y"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [35, 105, 113],
@@ -584,7 +584,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
   [76, 122, 130],
@@ -721,7 +721,7 @@
   Smi [16],
   Smi [7],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
 ]
@@ -848,7 +848,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   SCOPE_INFO_TYPE,
 ]
 handlers: [
@@ -989,7 +989,7 @@
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["done"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["value"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   SCOPE_INFO_TYPE,
 ]
 handlers: [
diff --git a/test/cctest/interpreter/bytecode_expectations/Generators.golden b/test/cctest/interpreter/bytecode_expectations/Generators.golden
index 515bcac..77b1924 100644
--- a/test/cctest/interpreter/bytecode_expectations/Generators.golden
+++ b/test/cctest/interpreter/bytecode_expectations/Generators.golden
@@ -223,7 +223,7 @@
   Smi [16],
   Smi [7],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["return"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
   Smi [6],
   Smi [9],
 ]
diff --git a/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden b/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
index 19572f9..0d2e6ba 100644
--- a/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
+++ b/test/cctest/interpreter/bytecode_expectations/LookupSlot.golden
@@ -138,7 +138,7 @@
   SCOPE_INFO_TYPE,
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["x"],
   ONE_BYTE_INTERNALIZED_STRING_TYPE ["eval"],
-  EMPTY_STRING_TYPE [""],
+  ONE_BYTE_INTERNALIZED_STRING_TYPE [""],
 ]
 handlers: [
 ]
diff --git a/test/cctest/test-strings.cc b/test/cctest/test-strings.cc
index 7c5a0c9..a84f042 100644
--- a/test/cctest/test-strings.cc
+++ b/test/cctest/test-strings.cc
@@ -601,6 +601,43 @@
   printf("18\n");
 }
 
+TEST(ConsStringWithEmptyFirstFlatten) {
+  printf("ConsStringWithEmptyFirstFlatten\n");
+  CcTest::InitializeVM();
+  v8::HandleScope scope(CcTest::isolate());
+  Isolate* isolate = CcTest::i_isolate();
+
+  i::Handle<i::String> initial_fst =
+      isolate->factory()->NewStringFromAsciiChecked("fst012345");
+  i::Handle<i::String> initial_snd =
+      isolate->factory()->NewStringFromAsciiChecked("snd012345");
+  i::Handle<i::String> str = isolate->factory()
+                                 ->NewConsString(initial_fst, initial_snd)
+                                 .ToHandleChecked();
+  CHECK(str->IsConsString());
+  auto cons = i::Handle<i::ConsString>::cast(str);
+
+  const int initial_length = cons->length();
+
+  // set_first / set_second does not update the length (which the heap verifier
+  // checks), so we need to ensure the length stays the same.
+
+  i::Handle<i::String> new_fst = isolate->factory()->empty_string();
+  i::Handle<i::String> new_snd =
+      isolate->factory()->NewStringFromAsciiChecked("snd012345012345678");
+  cons->set_first(isolate, *new_fst);
+  cons->set_second(isolate, *new_snd);
+  CHECK(!cons->IsFlat());
+  CHECK_EQ(initial_length, new_fst->length() + new_snd->length());
+  CHECK_EQ(initial_length, cons->length());
+
+  // Make sure Flatten doesn't alloc a new string.
+  DisallowHeapAllocation no_alloc;
+  i::Handle<i::String> flat = i::String::Flatten(isolate, cons);
+  CHECK(flat->IsFlat());
+  CHECK_EQ(initial_length, flat->length());
+}
+
 static void VerifyCharacterStream(String flat_string, String cons_string) {
   // Do not want to test ConString traversal on flat string.
   CHECK(flat_string->IsFlat() && !flat_string->IsConsString());
diff --git a/test/mjsunit/regress/regress-698790.js b/test/mjsunit/regress/regress-698790.js
index d024cf2..8791cb5 100644
--- a/test/mjsunit/regress/regress-698790.js
+++ b/test/mjsunit/regress/regress-698790.js
@@ -6,13 +6,13 @@
 
 // Call RegExp constructor with a cons string.
 
-var cons_string = %ConstructConsString("a", "aaaaaaaaaaaaa");
+var cons_string = %ConstructConsString("", "aaaaaaaaaaaaaa");
 new RegExp(cons_string);
 
 // Same thing but using TF lowering.
 
-function make_cons_string(s) { return s + "aaaaaaaaaaaaa"; }
-make_cons_string("a");
+function make_cons_string(s) { return s + "aaaaaaaaaaaaaa"; }
+make_cons_string("");
 %OptimizeFunctionOnNextCall(make_cons_string);
-var cons_str = make_cons_string("a");
+var cons_str = make_cons_string("");
 new RegExp(cons_str);
diff --git a/test/mjsunit/regress/regress-crbug-947949-1.js b/test/mjsunit/regress/regress-crbug-947949-1.js
deleted file mode 100644
index 1494773..0000000
--- a/test/mjsunit/regress/regress-crbug-947949-1.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax --verify-heap
-
-function foo(s) { return s + '0123456789012'; }
-foo('a');
-foo('\u1000');
-%OptimizeFunctionOnNextCall(foo);
-foo('');
diff --git a/test/mjsunit/regress/regress-crbug-947949-2.js b/test/mjsunit/regress/regress-crbug-947949-2.js
deleted file mode 100644
index 682024a..0000000
--- a/test/mjsunit/regress/regress-crbug-947949-2.js
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax --noalways-opt --opt
-
-function foo(s) { return s + '0123456789012'; }
-foo('a');
-foo('\u1000');
-%OptimizeFunctionOnNextCall(foo);
-foo('a');
-assertOptimized(foo);
-foo('');
-assertUnoptimized(foo);
diff --git a/test/mjsunit/regress/regress-crbug-949996.js b/test/mjsunit/regress/regress-crbug-949996.js
deleted file mode 100644
index c6a8f71..0000000
--- a/test/mjsunit/regress/regress-crbug-949996.js
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2019 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Flags: --allow-natives-syntax --verify-heap
-
-function foo(x) { return x + "0123456789012"; }
-foo('a');
-foo('\u10D0');
-%OptimizeFunctionOnNextCall(foo);
-foo(null);
diff --git a/test/unittests/compiler/redundancy-elimination-unittest.cc b/test/unittests/compiler/redundancy-elimination-unittest.cc
index 891498f..067b7c9 100644
--- a/test/unittests/compiler/redundancy-elimination-unittest.cc
+++ b/test/unittests/compiler/redundancy-elimination-unittest.cc
@@ -196,47 +196,6 @@
 }
 
 // -----------------------------------------------------------------------------
-// CheckNonEmptyString
-
-TEST_F(RedundancyEliminationTest,
-       CheckNonEmptyStringSubsumedByCheckNonEmptyOneByteString) {
-  Node* value = Parameter(0);
-  Node* effect = graph()->start();
-  Node* control = graph()->start();
-
-  Node* check1 = effect = graph()->NewNode(
-      simplified()->CheckNonEmptyOneByteString(), value, effect, control);
-  Reduction r1 = Reduce(check1);
-  ASSERT_TRUE(r1.Changed());
-  EXPECT_EQ(r1.replacement(), check1);
-
-  Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
-                                           value, effect, control);
-  Reduction r2 = Reduce(check2);
-  ASSERT_TRUE(r2.Changed());
-  EXPECT_EQ(r2.replacement(), check1);
-}
-
-TEST_F(RedundancyEliminationTest,
-       CheckNonEmptyStringSubsumedByCheckNonEmptyTwoByteString) {
-  Node* value = Parameter(0);
-  Node* effect = graph()->start();
-  Node* control = graph()->start();
-
-  Node* check1 = effect = graph()->NewNode(
-      simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
-  Reduction r1 = Reduce(check1);
-  ASSERT_TRUE(r1.Changed());
-  EXPECT_EQ(r1.replacement(), check1);
-
-  Node* check2 = effect = graph()->NewNode(simplified()->CheckNonEmptyString(),
-                                           value, effect, control);
-  Reduction r2 = Reduce(check2);
-  ASSERT_TRUE(r2.Changed());
-  EXPECT_EQ(r2.replacement(), check1);
-}
-
-// -----------------------------------------------------------------------------
 // CheckString
 
 TEST_F(RedundancyEliminationTest,
@@ -260,68 +219,6 @@
   }
 }
 
-TEST_F(RedundancyEliminationTest, CheckStringSubsumedByCheckNonEmptyString) {
-  TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
-    Node* value = Parameter(0);
-    Node* effect = graph()->start();
-    Node* control = graph()->start();
-
-    Node* check1 = effect = graph()->NewNode(
-        simplified()->CheckNonEmptyString(), value, effect, control);
-    Reduction r1 = Reduce(check1);
-    ASSERT_TRUE(r1.Changed());
-    EXPECT_EQ(r1.replacement(), check1);
-
-    Node* check2 = effect = graph()->NewNode(
-        simplified()->CheckString(feedback), value, effect, control);
-    Reduction r2 = Reduce(check2);
-    ASSERT_TRUE(r2.Changed());
-    EXPECT_EQ(r2.replacement(), check1);
-  }
-}
-
-TEST_F(RedundancyEliminationTest,
-       CheckStringSubsumedByCheckNonEmptyOneByteString) {
-  TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
-    Node* value = Parameter(0);
-    Node* effect = graph()->start();
-    Node* control = graph()->start();
-
-    Node* check1 = effect = graph()->NewNode(
-        simplified()->CheckNonEmptyOneByteString(), value, effect, control);
-    Reduction r1 = Reduce(check1);
-    ASSERT_TRUE(r1.Changed());
-    EXPECT_EQ(r1.replacement(), check1);
-
-    Node* check2 = effect = graph()->NewNode(
-        simplified()->CheckString(feedback), value, effect, control);
-    Reduction r2 = Reduce(check2);
-    ASSERT_TRUE(r2.Changed());
-    EXPECT_EQ(r2.replacement(), check1);
-  }
-}
-
-TEST_F(RedundancyEliminationTest,
-       CheckStringSubsumedByCheckNonEmptyTwoByteString) {
-  TRACED_FOREACH(VectorSlotPair, feedback, vector_slot_pairs()) {
-    Node* value = Parameter(0);
-    Node* effect = graph()->start();
-    Node* control = graph()->start();
-
-    Node* check1 = effect = graph()->NewNode(
-        simplified()->CheckNonEmptyTwoByteString(), value, effect, control);
-    Reduction r1 = Reduce(check1);
-    ASSERT_TRUE(r1.Changed());
-    EXPECT_EQ(r1.replacement(), check1);
-
-    Node* check2 = effect = graph()->NewNode(
-        simplified()->CheckString(feedback), value, effect, control);
-    Reduction r2 = Reduce(check2);
-    ASSERT_TRUE(r2.Changed());
-    EXPECT_EQ(r2.replacement(), check1);
-  }
-}
-
 // -----------------------------------------------------------------------------
 // CheckSymbol
 
diff --git a/tools/v8heapconst.py b/tools/v8heapconst.py
index 38e01a7..b891154 100644
--- a/tools/v8heapconst.py
+++ b/tools/v8heapconst.py
@@ -25,115 +25,114 @@
   45: "THIN_ONE_BYTE_STRING_TYPE",
   50: "UNCACHED_EXTERNAL_STRING_TYPE",
   58: "UNCACHED_EXTERNAL_ONE_BYTE_STRING_TYPE",
-  72: "EMPTY_STRING_TYPE",
-  128: "SYMBOL_TYPE",
-  129: "HEAP_NUMBER_TYPE",
-  130: "BIGINT_TYPE",
-  131: "ODDBALL_TYPE",
-  132: "MAP_TYPE",
-  133: "CODE_TYPE",
-  134: "MUTABLE_HEAP_NUMBER_TYPE",
-  135: "FOREIGN_TYPE",
-  136: "BYTE_ARRAY_TYPE",
-  137: "BYTECODE_ARRAY_TYPE",
-  138: "FREE_SPACE_TYPE",
-  139: "FIXED_INT8_ARRAY_TYPE",
-  140: "FIXED_UINT8_ARRAY_TYPE",
-  141: "FIXED_INT16_ARRAY_TYPE",
-  142: "FIXED_UINT16_ARRAY_TYPE",
-  143: "FIXED_INT32_ARRAY_TYPE",
-  144: "FIXED_UINT32_ARRAY_TYPE",
-  145: "FIXED_FLOAT32_ARRAY_TYPE",
-  146: "FIXED_FLOAT64_ARRAY_TYPE",
-  147: "FIXED_UINT8_CLAMPED_ARRAY_TYPE",
-  148: "FIXED_BIGINT64_ARRAY_TYPE",
-  149: "FIXED_BIGUINT64_ARRAY_TYPE",
-  150: "FIXED_DOUBLE_ARRAY_TYPE",
-  151: "FEEDBACK_METADATA_TYPE",
-  152: "FILLER_TYPE",
-  153: "ACCESS_CHECK_INFO_TYPE",
-  154: "ACCESSOR_INFO_TYPE",
-  155: "ACCESSOR_PAIR_TYPE",
-  156: "ALIASED_ARGUMENTS_ENTRY_TYPE",
-  157: "ALLOCATION_MEMENTO_TYPE",
-  158: "ASM_WASM_DATA_TYPE",
-  159: "ASYNC_GENERATOR_REQUEST_TYPE",
-  160: "CLASS_POSITIONS_TYPE",
-  161: "DEBUG_INFO_TYPE",
-  162: "ENUM_CACHE_TYPE",
-  163: "FUNCTION_TEMPLATE_INFO_TYPE",
-  164: "FUNCTION_TEMPLATE_RARE_DATA_TYPE",
-  165: "INTERCEPTOR_INFO_TYPE",
-  166: "INTERPRETER_DATA_TYPE",
-  167: "MODULE_INFO_ENTRY_TYPE",
-  168: "MODULE_TYPE",
-  169: "OBJECT_TEMPLATE_INFO_TYPE",
-  170: "PROMISE_CAPABILITY_TYPE",
-  171: "PROMISE_REACTION_TYPE",
-  172: "PROTOTYPE_INFO_TYPE",
-  173: "SCRIPT_TYPE",
-  174: "STACK_FRAME_INFO_TYPE",
-  175: "STACK_TRACE_FRAME_TYPE",
-  176: "TUPLE2_TYPE",
-  177: "TUPLE3_TYPE",
-  178: "ARRAY_BOILERPLATE_DESCRIPTION_TYPE",
-  179: "WASM_DEBUG_INFO_TYPE",
-  180: "WASM_EXCEPTION_TAG_TYPE",
-  181: "WASM_EXPORTED_FUNCTION_DATA_TYPE",
-  182: "CALLABLE_TASK_TYPE",
-  183: "CALLBACK_TASK_TYPE",
-  184: "PROMISE_FULFILL_REACTION_JOB_TASK_TYPE",
-  185: "PROMISE_REJECT_REACTION_JOB_TASK_TYPE",
-  186: "PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE",
-  187: "FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE",
-  188: "ALLOCATION_SITE_TYPE",
-  189: "EMBEDDER_DATA_ARRAY_TYPE",
-  190: "FIXED_ARRAY_TYPE",
-  191: "OBJECT_BOILERPLATE_DESCRIPTION_TYPE",
-  192: "CLOSURE_FEEDBACK_CELL_ARRAY_TYPE",
-  193: "HASH_TABLE_TYPE",
-  194: "ORDERED_HASH_MAP_TYPE",
-  195: "ORDERED_HASH_SET_TYPE",
-  196: "ORDERED_NAME_DICTIONARY_TYPE",
-  197: "NAME_DICTIONARY_TYPE",
-  198: "GLOBAL_DICTIONARY_TYPE",
-  199: "NUMBER_DICTIONARY_TYPE",
-  200: "SIMPLE_NUMBER_DICTIONARY_TYPE",
-  201: "STRING_TABLE_TYPE",
-  202: "EPHEMERON_HASH_TABLE_TYPE",
-  203: "SCOPE_INFO_TYPE",
-  204: "SCRIPT_CONTEXT_TABLE_TYPE",
-  205: "AWAIT_CONTEXT_TYPE",
-  206: "BLOCK_CONTEXT_TYPE",
-  207: "CATCH_CONTEXT_TYPE",
-  208: "DEBUG_EVALUATE_CONTEXT_TYPE",
-  209: "EVAL_CONTEXT_TYPE",
-  210: "FUNCTION_CONTEXT_TYPE",
-  211: "MODULE_CONTEXT_TYPE",
-  212: "NATIVE_CONTEXT_TYPE",
-  213: "SCRIPT_CONTEXT_TYPE",
-  214: "WITH_CONTEXT_TYPE",
-  215: "WEAK_FIXED_ARRAY_TYPE",
-  216: "TRANSITION_ARRAY_TYPE",
-  217: "CALL_HANDLER_INFO_TYPE",
-  218: "CELL_TYPE",
-  219: "CODE_DATA_CONTAINER_TYPE",
-  220: "DESCRIPTOR_ARRAY_TYPE",
-  221: "FEEDBACK_CELL_TYPE",
-  222: "FEEDBACK_VECTOR_TYPE",
-  223: "LOAD_HANDLER_TYPE",
-  224: "PREPARSE_DATA_TYPE",
-  225: "PROPERTY_ARRAY_TYPE",
-  226: "PROPERTY_CELL_TYPE",
-  227: "SHARED_FUNCTION_INFO_TYPE",
-  228: "SMALL_ORDERED_HASH_MAP_TYPE",
-  229: "SMALL_ORDERED_HASH_SET_TYPE",
-  230: "SMALL_ORDERED_NAME_DICTIONARY_TYPE",
-  231: "STORE_HANDLER_TYPE",
-  232: "UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE",
-  233: "UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE",
-  234: "WEAK_ARRAY_LIST_TYPE",
-  235: "WEAK_CELL_TYPE",
+  64: "SYMBOL_TYPE",
+  65: "HEAP_NUMBER_TYPE",
+  66: "BIGINT_TYPE",
+  67: "ODDBALL_TYPE",
+  68: "MAP_TYPE",
+  69: "CODE_TYPE",
+  70: "MUTABLE_HEAP_NUMBER_TYPE",
+  71: "FOREIGN_TYPE",
+  72: "BYTE_ARRAY_TYPE",
+  73: "BYTECODE_ARRAY_TYPE",
+  74: "FREE_SPACE_TYPE",
+  75: "FIXED_INT8_ARRAY_TYPE",
+  76: "FIXED_UINT8_ARRAY_TYPE",
+  77: "FIXED_INT16_ARRAY_TYPE",
+  78: "FIXED_UINT16_ARRAY_TYPE",
+  79: "FIXED_INT32_ARRAY_TYPE",
+  80: "FIXED_UINT32_ARRAY_TYPE",
+  81: "FIXED_FLOAT32_ARRAY_TYPE",
+  82: "FIXED_FLOAT64_ARRAY_TYPE",
+  83: "FIXED_UINT8_CLAMPED_ARRAY_TYPE",
+  84: "FIXED_BIGINT64_ARRAY_TYPE",
+  85: "FIXED_BIGUINT64_ARRAY_TYPE",
+  86: "FIXED_DOUBLE_ARRAY_TYPE",
+  87: "FEEDBACK_METADATA_TYPE",
+  88: "FILLER_TYPE",
+  89: "ACCESS_CHECK_INFO_TYPE",
+  90: "ACCESSOR_INFO_TYPE",
+  91: "ACCESSOR_PAIR_TYPE",
+  92: "ALIASED_ARGUMENTS_ENTRY_TYPE",
+  93: "ALLOCATION_MEMENTO_TYPE",
+  94: "ASM_WASM_DATA_TYPE",
+  95: "ASYNC_GENERATOR_REQUEST_TYPE",
+  96: "CLASS_POSITIONS_TYPE",
+  97: "DEBUG_INFO_TYPE",
+  98: "ENUM_CACHE_TYPE",
+  99: "FUNCTION_TEMPLATE_INFO_TYPE",
+  100: "FUNCTION_TEMPLATE_RARE_DATA_TYPE",
+  101: "INTERCEPTOR_INFO_TYPE",
+  102: "INTERPRETER_DATA_TYPE",
+  103: "MODULE_INFO_ENTRY_TYPE",
+  104: "MODULE_TYPE",
+  105: "OBJECT_TEMPLATE_INFO_TYPE",
+  106: "PROMISE_CAPABILITY_TYPE",
+  107: "PROMISE_REACTION_TYPE",
+  108: "PROTOTYPE_INFO_TYPE",
+  109: "SCRIPT_TYPE",
+  110: "STACK_FRAME_INFO_TYPE",
+  111: "STACK_TRACE_FRAME_TYPE",
+  112: "TUPLE2_TYPE",
+  113: "TUPLE3_TYPE",
+  114: "ARRAY_BOILERPLATE_DESCRIPTION_TYPE",
+  115: "WASM_DEBUG_INFO_TYPE",
+  116: "WASM_EXCEPTION_TAG_TYPE",
+  117: "WASM_EXPORTED_FUNCTION_DATA_TYPE",
+  118: "CALLABLE_TASK_TYPE",
+  119: "CALLBACK_TASK_TYPE",
+  120: "PROMISE_FULFILL_REACTION_JOB_TASK_TYPE",
+  121: "PROMISE_REJECT_REACTION_JOB_TASK_TYPE",
+  122: "PROMISE_RESOLVE_THENABLE_JOB_TASK_TYPE",
+  123: "FINALIZATION_GROUP_CLEANUP_JOB_TASK_TYPE",
+  124: "ALLOCATION_SITE_TYPE",
+  125: "EMBEDDER_DATA_ARRAY_TYPE",
+  126: "FIXED_ARRAY_TYPE",
+  127: "OBJECT_BOILERPLATE_DESCRIPTION_TYPE",
+  128: "CLOSURE_FEEDBACK_CELL_ARRAY_TYPE",
+  129: "HASH_TABLE_TYPE",
+  130: "ORDERED_HASH_MAP_TYPE",
+  131: "ORDERED_HASH_SET_TYPE",
+  132: "ORDERED_NAME_DICTIONARY_TYPE",
+  133: "NAME_DICTIONARY_TYPE",
+  134: "GLOBAL_DICTIONARY_TYPE",
+  135: "NUMBER_DICTIONARY_TYPE",
+  136: "SIMPLE_NUMBER_DICTIONARY_TYPE",
+  137: "STRING_TABLE_TYPE",
+  138: "EPHEMERON_HASH_TABLE_TYPE",
+  139: "SCOPE_INFO_TYPE",
+  140: "SCRIPT_CONTEXT_TABLE_TYPE",
+  141: "AWAIT_CONTEXT_TYPE",
+  142: "BLOCK_CONTEXT_TYPE",
+  143: "CATCH_CONTEXT_TYPE",
+  144: "DEBUG_EVALUATE_CONTEXT_TYPE",
+  145: "EVAL_CONTEXT_TYPE",
+  146: "FUNCTION_CONTEXT_TYPE",
+  147: "MODULE_CONTEXT_TYPE",
+  148: "NATIVE_CONTEXT_TYPE",
+  149: "SCRIPT_CONTEXT_TYPE",
+  150: "WITH_CONTEXT_TYPE",
+  151: "WEAK_FIXED_ARRAY_TYPE",
+  152: "TRANSITION_ARRAY_TYPE",
+  153: "CALL_HANDLER_INFO_TYPE",
+  154: "CELL_TYPE",
+  155: "CODE_DATA_CONTAINER_TYPE",
+  156: "DESCRIPTOR_ARRAY_TYPE",
+  157: "FEEDBACK_CELL_TYPE",
+  158: "FEEDBACK_VECTOR_TYPE",
+  159: "LOAD_HANDLER_TYPE",
+  160: "PREPARSE_DATA_TYPE",
+  161: "PROPERTY_ARRAY_TYPE",
+  162: "PROPERTY_CELL_TYPE",
+  163: "SHARED_FUNCTION_INFO_TYPE",
+  164: "SMALL_ORDERED_HASH_MAP_TYPE",
+  165: "SMALL_ORDERED_HASH_SET_TYPE",
+  166: "SMALL_ORDERED_NAME_DICTIONARY_TYPE",
+  167: "STORE_HANDLER_TYPE",
+  168: "UNCOMPILED_DATA_WITHOUT_PREPARSE_DATA_TYPE",
+  169: "UNCOMPILED_DATA_WITH_PREPARSE_DATA_TYPE",
+  170: "WEAK_ARRAY_LIST_TYPE",
+  171: "WEAK_CELL_TYPE",
   1024: "JS_PROXY_TYPE",
   1025: "JS_GLOBAL_OBJECT_TYPE",
   1026: "JS_GLOBAL_PROXY_TYPE",
@@ -194,159 +193,158 @@
 
 # List of known V8 maps.
 KNOWN_MAPS = {
-  ("read_only_space", 0x00139): (138, "FreeSpaceMap"),
-  ("read_only_space", 0x00189): (132, "MetaMap"),
-  ("read_only_space", 0x00209): (131, "NullMap"),
-  ("read_only_space", 0x00271): (220, "DescriptorArrayMap"),
-  ("read_only_space", 0x002d1): (215, "WeakFixedArrayMap"),
-  ("read_only_space", 0x00321): (152, "OnePointerFillerMap"),
-  ("read_only_space", 0x00371): (152, "TwoPointerFillerMap"),
-  ("read_only_space", 0x003f1): (131, "UninitializedMap"),
+  ("read_only_space", 0x00139): (74, "FreeSpaceMap"),
+  ("read_only_space", 0x00189): (68, "MetaMap"),
+  ("read_only_space", 0x00209): (67, "NullMap"),
+  ("read_only_space", 0x00271): (156, "DescriptorArrayMap"),
+  ("read_only_space", 0x002d1): (151, "WeakFixedArrayMap"),
+  ("read_only_space", 0x00321): (88, "OnePointerFillerMap"),
+  ("read_only_space", 0x00371): (88, "TwoPointerFillerMap"),
+  ("read_only_space", 0x003f1): (67, "UninitializedMap"),
   ("read_only_space", 0x00461): (8, "OneByteInternalizedStringMap"),
-  ("read_only_space", 0x00501): (131, "UndefinedMap"),
-  ("read_only_space", 0x00561): (129, "HeapNumberMap"),
-  ("read_only_space", 0x005e1): (131, "TheHoleMap"),
-  ("read_only_space", 0x00689): (131, "BooleanMap"),
-  ("read_only_space", 0x00761): (72, "EmptyStringMap"),
-  ("read_only_space", 0x007b1): (136, "ByteArrayMap"),
-  ("read_only_space", 0x00801): (190, "FixedArrayMap"),
-  ("read_only_space", 0x00851): (190, "FixedCOWArrayMap"),
-  ("read_only_space", 0x008a1): (193, "HashTableMap"),
-  ("read_only_space", 0x008f1): (128, "SymbolMap"),
-  ("read_only_space", 0x00941): (40, "OneByteStringMap"),
-  ("read_only_space", 0x00991): (203, "ScopeInfoMap"),
-  ("read_only_space", 0x009e1): (227, "SharedFunctionInfoMap"),
-  ("read_only_space", 0x00a31): (133, "CodeMap"),
-  ("read_only_space", 0x00a81): (210, "FunctionContextMap"),
-  ("read_only_space", 0x00ad1): (218, "CellMap"),
-  ("read_only_space", 0x00b21): (226, "GlobalPropertyCellMap"),
-  ("read_only_space", 0x00b71): (135, "ForeignMap"),
-  ("read_only_space", 0x00bc1): (216, "TransitionArrayMap"),
-  ("read_only_space", 0x00c11): (222, "FeedbackVectorMap"),
-  ("read_only_space", 0x00cb1): (131, "ArgumentsMarkerMap"),
-  ("read_only_space", 0x00d51): (131, "ExceptionMap"),
-  ("read_only_space", 0x00df1): (131, "TerminationExceptionMap"),
-  ("read_only_space", 0x00e99): (131, "OptimizedOutMap"),
-  ("read_only_space", 0x00f39): (131, "StaleRegisterMap"),
-  ("read_only_space", 0x00fa9): (212, "NativeContextMap"),
-  ("read_only_space", 0x00ff9): (211, "ModuleContextMap"),
-  ("read_only_space", 0x01049): (209, "EvalContextMap"),
-  ("read_only_space", 0x01099): (213, "ScriptContextMap"),
-  ("read_only_space", 0x010e9): (205, "AwaitContextMap"),
-  ("read_only_space", 0x01139): (206, "BlockContextMap"),
-  ("read_only_space", 0x01189): (207, "CatchContextMap"),
-  ("read_only_space", 0x011d9): (214, "WithContextMap"),
-  ("read_only_space", 0x01229): (208, "DebugEvaluateContextMap"),
-  ("read_only_space", 0x01279): (204, "ScriptContextTableMap"),
-  ("read_only_space", 0x012c9): (192, "ClosureFeedbackCellArrayMap"),
-  ("read_only_space", 0x01319): (151, "FeedbackMetadataArrayMap"),
-  ("read_only_space", 0x01369): (190, "ArrayListMap"),
-  ("read_only_space", 0x013b9): (130, "BigIntMap"),
-  ("read_only_space", 0x01409): (191, "ObjectBoilerplateDescriptionMap"),
-  ("read_only_space", 0x01459): (137, "BytecodeArrayMap"),
-  ("read_only_space", 0x014a9): (219, "CodeDataContainerMap"),
-  ("read_only_space", 0x014f9): (150, "FixedDoubleArrayMap"),
-  ("read_only_space", 0x01549): (198, "GlobalDictionaryMap"),
-  ("read_only_space", 0x01599): (221, "ManyClosuresCellMap"),
-  ("read_only_space", 0x015e9): (190, "ModuleInfoMap"),
-  ("read_only_space", 0x01639): (134, "MutableHeapNumberMap"),
-  ("read_only_space", 0x01689): (197, "NameDictionaryMap"),
-  ("read_only_space", 0x016d9): (221, "NoClosuresCellMap"),
-  ("read_only_space", 0x01729): (199, "NumberDictionaryMap"),
-  ("read_only_space", 0x01779): (221, "OneClosureCellMap"),
-  ("read_only_space", 0x017c9): (194, "OrderedHashMapMap"),
-  ("read_only_space", 0x01819): (195, "OrderedHashSetMap"),
-  ("read_only_space", 0x01869): (196, "OrderedNameDictionaryMap"),
-  ("read_only_space", 0x018b9): (224, "PreparseDataMap"),
-  ("read_only_space", 0x01909): (225, "PropertyArrayMap"),
-  ("read_only_space", 0x01959): (217, "SideEffectCallHandlerInfoMap"),
-  ("read_only_space", 0x019a9): (217, "SideEffectFreeCallHandlerInfoMap"),
-  ("read_only_space", 0x019f9): (217, "NextCallSideEffectFreeCallHandlerInfoMap"),
-  ("read_only_space", 0x01a49): (200, "SimpleNumberDictionaryMap"),
-  ("read_only_space", 0x01a99): (190, "SloppyArgumentsElementsMap"),
-  ("read_only_space", 0x01ae9): (228, "SmallOrderedHashMapMap"),
-  ("read_only_space", 0x01b39): (229, "SmallOrderedHashSetMap"),
-  ("read_only_space", 0x01b89): (230, "SmallOrderedNameDictionaryMap"),
-  ("read_only_space", 0x01bd9): (201, "StringTableMap"),
-  ("read_only_space", 0x01c29): (232, "UncompiledDataWithoutPreparseDataMap"),
-  ("read_only_space", 0x01c79): (233, "UncompiledDataWithPreparseDataMap"),
-  ("read_only_space", 0x01cc9): (234, "WeakArrayListMap"),
-  ("read_only_space", 0x01d19): (202, "EphemeronHashTableMap"),
-  ("read_only_space", 0x01d69): (189, "EmbedderDataArrayMap"),
-  ("read_only_space", 0x01db9): (235, "WeakCellMap"),
-  ("read_only_space", 0x01e09): (58, "NativeSourceStringMap"),
-  ("read_only_space", 0x01e59): (32, "StringMap"),
-  ("read_only_space", 0x01ea9): (41, "ConsOneByteStringMap"),
-  ("read_only_space", 0x01ef9): (33, "ConsStringMap"),
-  ("read_only_space", 0x01f49): (45, "ThinOneByteStringMap"),
-  ("read_only_space", 0x01f99): (37, "ThinStringMap"),
-  ("read_only_space", 0x01fe9): (35, "SlicedStringMap"),
-  ("read_only_space", 0x02039): (43, "SlicedOneByteStringMap"),
-  ("read_only_space", 0x02089): (34, "ExternalStringMap"),
-  ("read_only_space", 0x020d9): (42, "ExternalOneByteStringMap"),
-  ("read_only_space", 0x02129): (50, "UncachedExternalStringMap"),
-  ("read_only_space", 0x02179): (0, "InternalizedStringMap"),
-  ("read_only_space", 0x021c9): (2, "ExternalInternalizedStringMap"),
-  ("read_only_space", 0x02219): (10, "ExternalOneByteInternalizedStringMap"),
-  ("read_only_space", 0x02269): (18, "UncachedExternalInternalizedStringMap"),
-  ("read_only_space", 0x022b9): (26, "UncachedExternalOneByteInternalizedStringMap"),
-  ("read_only_space", 0x02309): (58, "UncachedExternalOneByteStringMap"),
-  ("read_only_space", 0x02359): (140, "FixedUint8ArrayMap"),
-  ("read_only_space", 0x023a9): (139, "FixedInt8ArrayMap"),
-  ("read_only_space", 0x023f9): (142, "FixedUint16ArrayMap"),
-  ("read_only_space", 0x02449): (141, "FixedInt16ArrayMap"),
-  ("read_only_space", 0x02499): (144, "FixedUint32ArrayMap"),
-  ("read_only_space", 0x024e9): (143, "FixedInt32ArrayMap"),
-  ("read_only_space", 0x02539): (145, "FixedFloat32ArrayMap"),
-  ("read_only_space", 0x02589): (146, "FixedFloat64ArrayMap"),
-  ("read_only_space", 0x025d9): (147, "FixedUint8ClampedArrayMap"),
-  ("read_only_space", 0x02629): (149, "FixedBigUint64ArrayMap"),
-  ("read_only_space", 0x02679): (148, "FixedBigInt64ArrayMap"),
-  ("read_only_space", 0x026c9): (131, "SelfReferenceMarkerMap"),
-  ("read_only_space", 0x02731): (162, "EnumCacheMap"),
-  ("read_only_space", 0x027d1): (178, "ArrayBoilerplateDescriptionMap"),
-  ("read_only_space", 0x02b21): (165, "InterceptorInfoMap"),
-  ("read_only_space", 0x05109): (153, "AccessCheckInfoMap"),
-  ("read_only_space", 0x05159): (154, "AccessorInfoMap"),
-  ("read_only_space", 0x051a9): (155, "AccessorPairMap"),
-  ("read_only_space", 0x051f9): (156, "AliasedArgumentsEntryMap"),
-  ("read_only_space", 0x05249): (157, "AllocationMementoMap"),
-  ("read_only_space", 0x05299): (158, "AsmWasmDataMap"),
-  ("read_only_space", 0x052e9): (159, "AsyncGeneratorRequestMap"),
-  ("read_only_space", 0x05339): (160, "ClassPositionsMap"),
-  ("read_only_space", 0x05389): (161, "DebugInfoMap"),
-  ("read_only_space", 0x053d9): (163, "FunctionTemplateInfoMap"),
-  ("read_only_space", 0x05429): (164, "FunctionTemplateRareDataMap"),
-  ("read_only_space", 0x05479): (166, "InterpreterDataMap"),
-  ("read_only_space", 0x054c9): (167, "ModuleInfoEntryMap"),
-  ("read_only_space", 0x05519): (168, "ModuleMap"),
-  ("read_only_space", 0x05569): (169, "ObjectTemplateInfoMap"),
-  ("read_only_space", 0x055b9): (170, "PromiseCapabilityMap"),
-  ("read_only_space", 0x05609): (171, "PromiseReactionMap"),
-  ("read_only_space", 0x05659): (172, "PrototypeInfoMap"),
-  ("read_only_space", 0x056a9): (173, "ScriptMap"),
-  ("read_only_space", 0x056f9): (174, "StackFrameInfoMap"),
-  ("read_only_space", 0x05749): (175, "StackTraceFrameMap"),
-  ("read_only_space", 0x05799): (176, "Tuple2Map"),
-  ("read_only_space", 0x057e9): (177, "Tuple3Map"),
-  ("read_only_space", 0x05839): (179, "WasmDebugInfoMap"),
-  ("read_only_space", 0x05889): (180, "WasmExceptionTagMap"),
-  ("read_only_space", 0x058d9): (181, "WasmExportedFunctionDataMap"),
-  ("read_only_space", 0x05929): (182, "CallableTaskMap"),
-  ("read_only_space", 0x05979): (183, "CallbackTaskMap"),
-  ("read_only_space", 0x059c9): (184, "PromiseFulfillReactionJobTaskMap"),
-  ("read_only_space", 0x05a19): (185, "PromiseRejectReactionJobTaskMap"),
-  ("read_only_space", 0x05a69): (186, "PromiseResolveThenableJobTaskMap"),
-  ("read_only_space", 0x05ab9): (187, "FinalizationGroupCleanupJobTaskMap"),
-  ("read_only_space", 0x05b09): (188, "AllocationSiteWithWeakNextMap"),
-  ("read_only_space", 0x05b59): (188, "AllocationSiteWithoutWeakNextMap"),
-  ("read_only_space", 0x05ba9): (223, "LoadHandler1Map"),
-  ("read_only_space", 0x05bf9): (223, "LoadHandler2Map"),
-  ("read_only_space", 0x05c49): (223, "LoadHandler3Map"),
-  ("read_only_space", 0x05c99): (231, "StoreHandler0Map"),
-  ("read_only_space", 0x05ce9): (231, "StoreHandler1Map"),
-  ("read_only_space", 0x05d39): (231, "StoreHandler2Map"),
-  ("read_only_space", 0x05d89): (231, "StoreHandler3Map"),
+  ("read_only_space", 0x00501): (67, "UndefinedMap"),
+  ("read_only_space", 0x00561): (65, "HeapNumberMap"),
+  ("read_only_space", 0x005e1): (67, "TheHoleMap"),
+  ("read_only_space", 0x00689): (67, "BooleanMap"),
+  ("read_only_space", 0x00761): (72, "ByteArrayMap"),
+  ("read_only_space", 0x007b1): (126, "FixedArrayMap"),
+  ("read_only_space", 0x00801): (126, "FixedCOWArrayMap"),
+  ("read_only_space", 0x00851): (129, "HashTableMap"),
+  ("read_only_space", 0x008a1): (64, "SymbolMap"),
+  ("read_only_space", 0x008f1): (40, "OneByteStringMap"),
+  ("read_only_space", 0x00941): (139, "ScopeInfoMap"),
+  ("read_only_space", 0x00991): (163, "SharedFunctionInfoMap"),
+  ("read_only_space", 0x009e1): (69, "CodeMap"),
+  ("read_only_space", 0x00a31): (146, "FunctionContextMap"),
+  ("read_only_space", 0x00a81): (154, "CellMap"),
+  ("read_only_space", 0x00ad1): (162, "GlobalPropertyCellMap"),
+  ("read_only_space", 0x00b21): (71, "ForeignMap"),
+  ("read_only_space", 0x00b71): (152, "TransitionArrayMap"),
+  ("read_only_space", 0x00bc1): (158, "FeedbackVectorMap"),
+  ("read_only_space", 0x00c61): (67, "ArgumentsMarkerMap"),
+  ("read_only_space", 0x00d01): (67, "ExceptionMap"),
+  ("read_only_space", 0x00da1): (67, "TerminationExceptionMap"),
+  ("read_only_space", 0x00e49): (67, "OptimizedOutMap"),
+  ("read_only_space", 0x00ee9): (67, "StaleRegisterMap"),
+  ("read_only_space", 0x00f59): (148, "NativeContextMap"),
+  ("read_only_space", 0x00fa9): (147, "ModuleContextMap"),
+  ("read_only_space", 0x00ff9): (145, "EvalContextMap"),
+  ("read_only_space", 0x01049): (149, "ScriptContextMap"),
+  ("read_only_space", 0x01099): (141, "AwaitContextMap"),
+  ("read_only_space", 0x010e9): (142, "BlockContextMap"),
+  ("read_only_space", 0x01139): (143, "CatchContextMap"),
+  ("read_only_space", 0x01189): (150, "WithContextMap"),
+  ("read_only_space", 0x011d9): (144, "DebugEvaluateContextMap"),
+  ("read_only_space", 0x01229): (140, "ScriptContextTableMap"),
+  ("read_only_space", 0x01279): (128, "ClosureFeedbackCellArrayMap"),
+  ("read_only_space", 0x012c9): (87, "FeedbackMetadataArrayMap"),
+  ("read_only_space", 0x01319): (126, "ArrayListMap"),
+  ("read_only_space", 0x01369): (66, "BigIntMap"),
+  ("read_only_space", 0x013b9): (127, "ObjectBoilerplateDescriptionMap"),
+  ("read_only_space", 0x01409): (73, "BytecodeArrayMap"),
+  ("read_only_space", 0x01459): (155, "CodeDataContainerMap"),
+  ("read_only_space", 0x014a9): (86, "FixedDoubleArrayMap"),
+  ("read_only_space", 0x014f9): (134, "GlobalDictionaryMap"),
+  ("read_only_space", 0x01549): (157, "ManyClosuresCellMap"),
+  ("read_only_space", 0x01599): (126, "ModuleInfoMap"),
+  ("read_only_space", 0x015e9): (70, "MutableHeapNumberMap"),
+  ("read_only_space", 0x01639): (133, "NameDictionaryMap"),
+  ("read_only_space", 0x01689): (157, "NoClosuresCellMap"),
+  ("read_only_space", 0x016d9): (135, "NumberDictionaryMap"),
+  ("read_only_space", 0x01729): (157, "OneClosureCellMap"),
+  ("read_only_space", 0x01779): (130, "OrderedHashMapMap"),
+  ("read_only_space", 0x017c9): (131, "OrderedHashSetMap"),
+  ("read_only_space", 0x01819): (132, "OrderedNameDictionaryMap"),
+  ("read_only_space", 0x01869): (160, "PreparseDataMap"),
+  ("read_only_space", 0x018b9): (161, "PropertyArrayMap"),
+  ("read_only_space", 0x01909): (153, "SideEffectCallHandlerInfoMap"),
+  ("read_only_space", 0x01959): (153, "SideEffectFreeCallHandlerInfoMap"),
+  ("read_only_space", 0x019a9): (153, "NextCallSideEffectFreeCallHandlerInfoMap"),
+  ("read_only_space", 0x019f9): (136, "SimpleNumberDictionaryMap"),
+  ("read_only_space", 0x01a49): (126, "SloppyArgumentsElementsMap"),
+  ("read_only_space", 0x01a99): (164, "SmallOrderedHashMapMap"),
+  ("read_only_space", 0x01ae9): (165, "SmallOrderedHashSetMap"),
+  ("read_only_space", 0x01b39): (166, "SmallOrderedNameDictionaryMap"),
+  ("read_only_space", 0x01b89): (137, "StringTableMap"),
+  ("read_only_space", 0x01bd9): (168, "UncompiledDataWithoutPreparseDataMap"),
+  ("read_only_space", 0x01c29): (169, "UncompiledDataWithPreparseDataMap"),
+  ("read_only_space", 0x01c79): (170, "WeakArrayListMap"),
+  ("read_only_space", 0x01cc9): (138, "EphemeronHashTableMap"),
+  ("read_only_space", 0x01d19): (125, "EmbedderDataArrayMap"),
+  ("read_only_space", 0x01d69): (171, "WeakCellMap"),
+  ("read_only_space", 0x01db9): (58, "NativeSourceStringMap"),
+  ("read_only_space", 0x01e09): (32, "StringMap"),
+  ("read_only_space", 0x01e59): (41, "ConsOneByteStringMap"),
+  ("read_only_space", 0x01ea9): (33, "ConsStringMap"),
+  ("read_only_space", 0x01ef9): (45, "ThinOneByteStringMap"),
+  ("read_only_space", 0x01f49): (37, "ThinStringMap"),
+  ("read_only_space", 0x01f99): (35, "SlicedStringMap"),
+  ("read_only_space", 0x01fe9): (43, "SlicedOneByteStringMap"),
+  ("read_only_space", 0x02039): (34, "ExternalStringMap"),
+  ("read_only_space", 0x02089): (42, "ExternalOneByteStringMap"),
+  ("read_only_space", 0x020d9): (50, "UncachedExternalStringMap"),
+  ("read_only_space", 0x02129): (0, "InternalizedStringMap"),
+  ("read_only_space", 0x02179): (2, "ExternalInternalizedStringMap"),
+  ("read_only_space", 0x021c9): (10, "ExternalOneByteInternalizedStringMap"),
+  ("read_only_space", 0x02219): (18, "UncachedExternalInternalizedStringMap"),
+  ("read_only_space", 0x02269): (26, "UncachedExternalOneByteInternalizedStringMap"),
+  ("read_only_space", 0x022b9): (58, "UncachedExternalOneByteStringMap"),
+  ("read_only_space", 0x02309): (76, "FixedUint8ArrayMap"),
+  ("read_only_space", 0x02359): (75, "FixedInt8ArrayMap"),
+  ("read_only_space", 0x023a9): (78, "FixedUint16ArrayMap"),
+  ("read_only_space", 0x023f9): (77, "FixedInt16ArrayMap"),
+  ("read_only_space", 0x02449): (80, "FixedUint32ArrayMap"),
+  ("read_only_space", 0x02499): (79, "FixedInt32ArrayMap"),
+  ("read_only_space", 0x024e9): (81, "FixedFloat32ArrayMap"),
+  ("read_only_space", 0x02539): (82, "FixedFloat64ArrayMap"),
+  ("read_only_space", 0x02589): (83, "FixedUint8ClampedArrayMap"),
+  ("read_only_space", 0x025d9): (85, "FixedBigUint64ArrayMap"),
+  ("read_only_space", 0x02629): (84, "FixedBigInt64ArrayMap"),
+  ("read_only_space", 0x02679): (67, "SelfReferenceMarkerMap"),
+  ("read_only_space", 0x026e1): (98, "EnumCacheMap"),
+  ("read_only_space", 0x02781): (114, "ArrayBoilerplateDescriptionMap"),
+  ("read_only_space", 0x02ad1): (101, "InterceptorInfoMap"),
+  ("read_only_space", 0x050b9): (89, "AccessCheckInfoMap"),
+  ("read_only_space", 0x05109): (90, "AccessorInfoMap"),
+  ("read_only_space", 0x05159): (91, "AccessorPairMap"),
+  ("read_only_space", 0x051a9): (92, "AliasedArgumentsEntryMap"),
+  ("read_only_space", 0x051f9): (93, "AllocationMementoMap"),
+  ("read_only_space", 0x05249): (94, "AsmWasmDataMap"),
+  ("read_only_space", 0x05299): (95, "AsyncGeneratorRequestMap"),
+  ("read_only_space", 0x052e9): (96, "ClassPositionsMap"),
+  ("read_only_space", 0x05339): (97, "DebugInfoMap"),
+  ("read_only_space", 0x05389): (99, "FunctionTemplateInfoMap"),
+  ("read_only_space", 0x053d9): (100, "FunctionTemplateRareDataMap"),
+  ("read_only_space", 0x05429): (102, "InterpreterDataMap"),
+  ("read_only_space", 0x05479): (103, "ModuleInfoEntryMap"),
+  ("read_only_space", 0x054c9): (104, "ModuleMap"),
+  ("read_only_space", 0x05519): (105, "ObjectTemplateInfoMap"),
+  ("read_only_space", 0x05569): (106, "PromiseCapabilityMap"),
+  ("read_only_space", 0x055b9): (107, "PromiseReactionMap"),
+  ("read_only_space", 0x05609): (108, "PrototypeInfoMap"),
+  ("read_only_space", 0x05659): (109, "ScriptMap"),
+  ("read_only_space", 0x056a9): (110, "StackFrameInfoMap"),
+  ("read_only_space", 0x056f9): (111, "StackTraceFrameMap"),
+  ("read_only_space", 0x05749): (112, "Tuple2Map"),
+  ("read_only_space", 0x05799): (113, "Tuple3Map"),
+  ("read_only_space", 0x057e9): (115, "WasmDebugInfoMap"),
+  ("read_only_space", 0x05839): (116, "WasmExceptionTagMap"),
+  ("read_only_space", 0x05889): (117, "WasmExportedFunctionDataMap"),
+  ("read_only_space", 0x058d9): (118, "CallableTaskMap"),
+  ("read_only_space", 0x05929): (119, "CallbackTaskMap"),
+  ("read_only_space", 0x05979): (120, "PromiseFulfillReactionJobTaskMap"),
+  ("read_only_space", 0x059c9): (121, "PromiseRejectReactionJobTaskMap"),
+  ("read_only_space", 0x05a19): (122, "PromiseResolveThenableJobTaskMap"),
+  ("read_only_space", 0x05a69): (123, "FinalizationGroupCleanupJobTaskMap"),
+  ("read_only_space", 0x05ab9): (124, "AllocationSiteWithWeakNextMap"),
+  ("read_only_space", 0x05b09): (124, "AllocationSiteWithoutWeakNextMap"),
+  ("read_only_space", 0x05b59): (159, "LoadHandler1Map"),
+  ("read_only_space", 0x05ba9): (159, "LoadHandler2Map"),
+  ("read_only_space", 0x05bf9): (159, "LoadHandler3Map"),
+  ("read_only_space", 0x05c49): (167, "StoreHandler0Map"),
+  ("read_only_space", 0x05c99): (167, "StoreHandler1Map"),
+  ("read_only_space", 0x05ce9): (167, "StoreHandler2Map"),
+  ("read_only_space", 0x05d39): (167, "StoreHandler3Map"),
   ("map_space", 0x00139): (1057, "ExternalMap"),
   ("map_space", 0x00189): (1073, "JSMessageObjectMap"),
 }
@@ -364,45 +362,45 @@
   ("read_only_space", 0x00659): "TrueValue",
   ("read_only_space", 0x00709): "FalseValue",
   ("read_only_space", 0x00751): "empty_string",
-  ("read_only_space", 0x00c61): "EmptyScopeInfo",
-  ("read_only_space", 0x00c71): "EmptyFixedArray",
-  ("read_only_space", 0x00c81): "ArgumentsMarker",
-  ("read_only_space", 0x00d21): "Exception",
-  ("read_only_space", 0x00dc1): "TerminationException",
-  ("read_only_space", 0x00e69): "OptimizedOut",
-  ("read_only_space", 0x00f09): "StaleRegister",
-  ("read_only_space", 0x02719): "EmptyEnumCache",
-  ("read_only_space", 0x02781): "EmptyPropertyArray",
-  ("read_only_space", 0x02791): "EmptyByteArray",
-  ("read_only_space", 0x027a1): "EmptyObjectBoilerplateDescription",
-  ("read_only_space", 0x027b9): "EmptyArrayBoilerplateDescription",
-  ("read_only_space", 0x02821): "EmptyClosureFeedbackCellArray",
-  ("read_only_space", 0x02831): "EmptyFixedUint8Array",
-  ("read_only_space", 0x02851): "EmptyFixedInt8Array",
-  ("read_only_space", 0x02871): "EmptyFixedUint16Array",
-  ("read_only_space", 0x02891): "EmptyFixedInt16Array",
-  ("read_only_space", 0x028b1): "EmptyFixedUint32Array",
-  ("read_only_space", 0x028d1): "EmptyFixedInt32Array",
-  ("read_only_space", 0x028f1): "EmptyFixedFloat32Array",
-  ("read_only_space", 0x02911): "EmptyFixedFloat64Array",
-  ("read_only_space", 0x02931): "EmptyFixedUint8ClampedArray",
-  ("read_only_space", 0x02951): "EmptyFixedBigUint64Array",
-  ("read_only_space", 0x02971): "EmptyFixedBigInt64Array",
-  ("read_only_space", 0x02991): "EmptySloppyArgumentsElements",
-  ("read_only_space", 0x029b1): "EmptySlowElementDictionary",
-  ("read_only_space", 0x029f9): "EmptyOrderedHashMap",
-  ("read_only_space", 0x02a21): "EmptyOrderedHashSet",
-  ("read_only_space", 0x02a49): "EmptyFeedbackMetadata",
-  ("read_only_space", 0x02a59): "EmptyPropertyCell",
-  ("read_only_space", 0x02a81): "EmptyPropertyDictionary",
-  ("read_only_space", 0x02ad1): "NoOpInterceptorInfo",
-  ("read_only_space", 0x02b71): "EmptyWeakArrayList",
-  ("read_only_space", 0x02b89): "InfinityValue",
-  ("read_only_space", 0x02b99): "MinusZeroValue",
-  ("read_only_space", 0x02ba9): "MinusInfinityValue",
-  ("read_only_space", 0x02bb9): "SelfReferenceMarker",
-  ("read_only_space", 0x02c11): "OffHeapTrampolineRelocationInfo",
-  ("read_only_space", 0x02c29): "HashSeed",
+  ("read_only_space", 0x00c11): "EmptyScopeInfo",
+  ("read_only_space", 0x00c21): "EmptyFixedArray",
+  ("read_only_space", 0x00c31): "ArgumentsMarker",
+  ("read_only_space", 0x00cd1): "Exception",
+  ("read_only_space", 0x00d71): "TerminationException",
+  ("read_only_space", 0x00e19): "OptimizedOut",
+  ("read_only_space", 0x00eb9): "StaleRegister",
+  ("read_only_space", 0x026c9): "EmptyEnumCache",
+  ("read_only_space", 0x02731): "EmptyPropertyArray",
+  ("read_only_space", 0x02741): "EmptyByteArray",
+  ("read_only_space", 0x02751): "EmptyObjectBoilerplateDescription",
+  ("read_only_space", 0x02769): "EmptyArrayBoilerplateDescription",
+  ("read_only_space", 0x027d1): "EmptyClosureFeedbackCellArray",
+  ("read_only_space", 0x027e1): "EmptyFixedUint8Array",
+  ("read_only_space", 0x02801): "EmptyFixedInt8Array",
+  ("read_only_space", 0x02821): "EmptyFixedUint16Array",
+  ("read_only_space", 0x02841): "EmptyFixedInt16Array",
+  ("read_only_space", 0x02861): "EmptyFixedUint32Array",
+  ("read_only_space", 0x02881): "EmptyFixedInt32Array",
+  ("read_only_space", 0x028a1): "EmptyFixedFloat32Array",
+  ("read_only_space", 0x028c1): "EmptyFixedFloat64Array",
+  ("read_only_space", 0x028e1): "EmptyFixedUint8ClampedArray",
+  ("read_only_space", 0x02901): "EmptyFixedBigUint64Array",
+  ("read_only_space", 0x02921): "EmptyFixedBigInt64Array",
+  ("read_only_space", 0x02941): "EmptySloppyArgumentsElements",
+  ("read_only_space", 0x02961): "EmptySlowElementDictionary",
+  ("read_only_space", 0x029a9): "EmptyOrderedHashMap",
+  ("read_only_space", 0x029d1): "EmptyOrderedHashSet",
+  ("read_only_space", 0x029f9): "EmptyFeedbackMetadata",
+  ("read_only_space", 0x02a09): "EmptyPropertyCell",
+  ("read_only_space", 0x02a31): "EmptyPropertyDictionary",
+  ("read_only_space", 0x02a81): "NoOpInterceptorInfo",
+  ("read_only_space", 0x02b21): "EmptyWeakArrayList",
+  ("read_only_space", 0x02b39): "InfinityValue",
+  ("read_only_space", 0x02b49): "MinusZeroValue",
+  ("read_only_space", 0x02b59): "MinusInfinityValue",
+  ("read_only_space", 0x02b69): "SelfReferenceMarker",
+  ("read_only_space", 0x02bc1): "OffHeapTrampolineRelocationInfo",
+  ("read_only_space", 0x02bd9): "HashSeed",
   ("old_space", 0x00139): "ArgumentsIteratorAccessor",
   ("old_space", 0x001a9): "ArrayLengthAccessor",
   ("old_space", 0x00219): "BoundFunctionLengthAccessor",