| Index: src/heap/mark-compact.cc
 | 
| diff --git a/src/heap/mark-compact.cc b/src/heap/mark-compact.cc
 | 
| index 2a77888fa784b510f230743fd9e461d6ea29f66d..fc5495163e69b5c9c0dacedfd5ac4cb34e00d747 100644
 | 
| --- a/src/heap/mark-compact.cc
 | 
| +++ b/src/heap/mark-compact.cc
 | 
| @@ -1550,9 +1550,16 @@ class MarkCompactCollector::HeapObjectVisitor {
 | 
|  
 | 
|  class MarkCompactCollector::EvacuateVisitorBase
 | 
|      : public MarkCompactCollector::HeapObjectVisitor {
 | 
| - public:
 | 
| + protected:
 | 
| +  enum MigrationMode { kFast, kProfiled };
 | 
| +
 | 
|    EvacuateVisitorBase(Heap* heap, CompactionSpaceCollection* compaction_spaces)
 | 
| -      : heap_(heap), compaction_spaces_(compaction_spaces) {}
 | 
| +      : heap_(heap),
 | 
| +        compaction_spaces_(compaction_spaces),
 | 
| +        profiling_(
 | 
| +            heap->isolate()->cpu_profiler()->is_profiling() ||
 | 
| +            heap->isolate()->logger()->is_logging_code_events() ||
 | 
| +            heap->isolate()->heap_profiler()->is_tracking_object_moves()) {}
 | 
|  
 | 
|    inline bool TryEvacuateObject(PagedSpace* target_space, HeapObject* object,
 | 
|                                  HeapObject** target_object) {
 | 
| @@ -1568,6 +1575,16 @@ class MarkCompactCollector::EvacuateVisitorBase
 | 
|  
 | 
|    inline void MigrateObject(HeapObject* dst, HeapObject* src, int size,
 | 
|                              AllocationSpace dest) {
 | 
| +    if (profiling_) {
 | 
| +      MigrateObject<kProfiled>(dst, src, size, dest);
 | 
| +    } else {
 | 
| +      MigrateObject<kFast>(dst, src, size, dest);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  template <MigrationMode mode>
 | 
| +  inline void MigrateObject(HeapObject* dst, HeapObject* src, int size,
 | 
| +                            AllocationSpace dest) {
 | 
|      Address dst_addr = dst->address();
 | 
|      Address src_addr = src->address();
 | 
|      DCHECK(heap_->AllowedToBeMigrated(src, dest));
 | 
| @@ -1575,8 +1592,8 @@ class MarkCompactCollector::EvacuateVisitorBase
 | 
|      if (dest == OLD_SPACE) {
 | 
|        DCHECK_OBJECT_SIZE(size);
 | 
|        DCHECK(IsAligned(size, kPointerSize));
 | 
| -      heap_->MoveBlock(dst_addr, src_addr, size);
 | 
| -      if (FLAG_ignition && dst->IsBytecodeArray()) {
 | 
| +      heap_->CopyBlock(dst_addr, src_addr, size);
 | 
| +      if ((mode == kProfiled) && FLAG_ignition && dst->IsBytecodeArray()) {
 | 
|          PROFILE(heap_->isolate(),
 | 
|                  CodeMoveEvent(AbstractCode::cast(src), dst_addr));
 | 
|        }
 | 
| @@ -1584,24 +1601,28 @@ class MarkCompactCollector::EvacuateVisitorBase
 | 
|        dst->IterateBodyFast(dst->map()->instance_type(), size, &visitor);
 | 
|      } else if (dest == CODE_SPACE) {
 | 
|        DCHECK_CODEOBJECT_SIZE(size, heap_->code_space());
 | 
| -      PROFILE(heap_->isolate(),
 | 
| -              CodeMoveEvent(AbstractCode::cast(src), dst_addr));
 | 
| -      heap_->MoveBlock(dst_addr, src_addr, size);
 | 
| +      if (mode == kProfiled) {
 | 
| +        PROFILE(heap_->isolate(),
 | 
| +                CodeMoveEvent(AbstractCode::cast(src), dst_addr));
 | 
| +      }
 | 
| +      heap_->CopyBlock(dst_addr, src_addr, size);
 | 
|        RememberedSet<OLD_TO_OLD>::InsertTyped(Page::FromAddress(dst_addr),
 | 
|                                               RELOCATED_CODE_OBJECT, dst_addr);
 | 
|        Code::cast(dst)->Relocate(dst_addr - src_addr);
 | 
|      } else {
 | 
|        DCHECK_OBJECT_SIZE(size);
 | 
|        DCHECK(dest == NEW_SPACE);
 | 
| -      heap_->MoveBlock(dst_addr, src_addr, size);
 | 
| +      heap_->CopyBlock(dst_addr, src_addr, size);
 | 
| +    }
 | 
| +    if (mode == kProfiled) {
 | 
| +      heap_->OnMoveEvent(dst, src, size);
 | 
|      }
 | 
| -    heap_->OnMoveEvent(dst, src, size);
 | 
|      Memory::Address_at(src_addr) = dst_addr;
 | 
|    }
 | 
|  
 | 
| - protected:
 | 
|    Heap* heap_;
 | 
|    CompactionSpaceCollection* compaction_spaces_;
 | 
| +  bool profiling_;
 | 
|  };
 | 
|  
 | 
|  class MarkCompactCollector::EvacuateNewSpaceVisitor final
 | 
| 
 |