heap: Apply some fixes to the generational barrier

1) Fix IsInLastAllocatedRegion() semi-interval check;
2) Simplify GenerationalBarrier() a bit.

Bug: 1029379
Change-Id: If2c23ffc2c9addb7a996b6094e8666b226173466
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2066729
Commit-Queue: Anton Bikineev <bikineev@chromium.org>
Reviewed-by: Kentaro Hara <haraken@chromium.org>
Cr-Commit-Position: refs/heads/master@{#743678}
diff --git a/third_party/blink/renderer/platform/heap/heap.h b/third_party/blink/renderer/platform/heap/heap.h
index efbd15514..66c8272 100644
--- a/third_party/blink/renderer/platform/heap/heap.h
+++ b/third_party/blink/renderer/platform/heap/heap.h
@@ -641,8 +641,8 @@
 
 inline bool ThreadHeap::IsInLastAllocatedRegion(Address address) const {
   return last_allocated_region_.start <= address &&
-         address <=
-             last_allocated_region_.start + last_allocated_region_.length;
+         address <
+             (last_allocated_region_.start + last_allocated_region_.length);
 }
 
 inline void ThreadHeap::SetLastAllocatedRegion(Address start, size_t length) {
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.cc b/third_party/blink/renderer/platform/heap/marking_visitor.cc
index da8b4eb..a96bffbb 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.cc
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.cc
@@ -184,9 +184,9 @@
 
   if (UNLIKELY(slot_page->IsLargeObjectPage())) {
     auto* large_page = static_cast<LargeObjectPage*>(slot_page);
-    if (LIKELY(!large_page->ObjectHeader()->IsMarked()))
-      return;
-    large_page->SetRemembered(true);
+    if (UNLIKELY(large_page->ObjectHeader()->IsMarked())) {
+      large_page->SetRemembered(true);
+    }
     return;
   }
 
@@ -194,6 +194,7 @@
   const HeapObjectHeader* source_header = reinterpret_cast<HeapObjectHeader*>(
       normal_page->object_start_bit_map()->FindHeader(slot));
   DCHECK_LT(0u, source_header->GcInfoIndex());
+  DCHECK_GT(source_header->PayloadEnd(), slot);
   if (UNLIKELY(source_header->IsMarked())) {
     normal_page->MarkCard(slot);
   }
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h
index 7c99815..0cf6dd4 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.h
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -177,7 +177,7 @@
   template <typename T>
   static bool WriteBarrier(T** slot);
 
-  static bool GenerationalBarrier(Address slot, ThreadState* state);
+  static void GenerationalBarrier(Address slot, ThreadState* state);
 
   // Eagerly traces an already marked backing store ensuring that all its
   // children are discovered by the marker. The barrier bails out if marking
@@ -227,6 +227,7 @@
   // Dijkstra barrier if concurrent marking is in progress.
   BasePage* value_page = PageFromObject(value);
   ThreadState* thread_state = value_page->thread_state();
+
   if (UNLIKELY(thread_state->IsIncrementalMarking()))
     return MarkValue(value, value_page, thread_state);
 
@@ -243,14 +244,14 @@
 }
 
 // static
-ALWAYS_INLINE bool MarkingVisitor::GenerationalBarrier(Address slot,
+ALWAYS_INLINE void MarkingVisitor::GenerationalBarrier(Address slot,
                                                        ThreadState* state) {
+  // First, check if the source object is in the last allocated region of heap.
   if (LIKELY(state->Heap().IsInLastAllocatedRegion(slot)))
-    return false;
+    return;
   if (UNLIKELY(state->IsOnStack(slot)))
-    return false;
+    return;
   GenerationalBarrierSlow(slot, state);
-  return false;
 }
 
 // static