Reviewers: Hannes Payer,

Description:
Add counters for write barriers in optimized code.

[email protected]

Please review this at https://codereview.chromium.org/78953003/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+21, -0 lines):
  M src/ia32/lithium-codegen-ia32.cc
  M src/v8-counters.h
  M src/x64/lithium-codegen-x64.cc


Index: src/ia32/lithium-codegen-ia32.cc
diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 648bb734538681ea2307499f4511005aa6da3dff..23ba2031097f8230fb159bd82e82d14392562d65 100644
--- a/src/ia32/lithium-codegen-ia32.cc
+++ b/src/ia32/lithium-codegen-ia32.cc
@@ -4490,6 +4490,9 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
     if (!instr->hydrogen()->NeedsWriteBarrierForMap()) {
       __ mov(FieldOperand(object, HeapObject::kMapOffset), transition);
     } else {
+      Counters* counters = isolate()->counters();
+      counters->write_barriers_opt_static()->Increment();
+      __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
       Register temp = ToRegister(instr->temp());
       Register temp_map = ToRegister(instr->temp_map());
       __ mov(temp_map, transition);
@@ -4541,6 +4544,9 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
   }

   if (instr->hydrogen()->NeedsWriteBarrier()) {
+    Counters* counters = isolate()->counters();
+    counters->write_barriers_opt_static()->Increment();
+    __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
     Register value = ToRegister(instr->value());
Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object;
     // Update the write barrier for the object for in-object properties.
@@ -4767,6 +4773,9 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) {
   }

   if (instr->hydrogen()->NeedsWriteBarrier()) {
+    Counters* counters = isolate()->counters();
+    counters->write_barriers_opt_static()->Increment();
+    __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
     ASSERT(instr->value()->IsRegister());
     Register value = ToRegister(instr->value());
     ASSERT(!instr->key()->IsConstantOperand());
Index: src/v8-counters.h
diff --git a/src/v8-counters.h b/src/v8-counters.h
index c1541b097f616f475605b4e56f26ca9260321924..775bdbe37dc2b68876f38b77ec4575e94798fc0b 100644
--- a/src/v8-counters.h
+++ b/src/v8-counters.h
@@ -242,6 +242,9 @@ namespace internal {
   SC(soft_deopts_requested, V8.SoftDeoptsRequested)                   \
   SC(soft_deopts_inserted, V8.SoftDeoptsInserted)                     \
   SC(soft_deopts_executed, V8.SoftDeoptsExecuted)                     \
+  /* Number of write barriers in optimized code. */                   \
+  SC(write_barriers_opt_dynamic, V8.WriteBarriersOptDynamic)          \
+  SC(write_barriers_opt_static, V8.WriteBarriersOptStatic)            \
   SC(new_space_bytes_available, V8.MemoryNewSpaceBytesAvailable)      \
   SC(new_space_bytes_committed, V8.MemoryNewSpaceBytesCommitted)      \
   SC(new_space_bytes_used, V8.MemoryNewSpaceBytesUsed)                \
Index: src/x64/lithium-codegen-x64.cc
diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc
index 1c8bbbe28d05654e4d39de8d664e1d5fa17b9998..bbd51fbe89c4fbabd368956de556ac31908b8dbf 100644
--- a/src/x64/lithium-codegen-x64.cc
+++ b/src/x64/lithium-codegen-x64.cc
@@ -3916,6 +3916,9 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
     if (!instr->hydrogen()->NeedsWriteBarrierForMap()) {
       __ Move(FieldOperand(object, HeapObject::kMapOffset), transition);
     } else {
+      Counters* counters = isolate()->counters();
+      counters->write_barriers_opt_static()->Increment();
+      __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
       Register temp = ToRegister(instr->temp());
       __ Move(kScratchRegister, transition);
__ movq(FieldOperand(object, HeapObject::kMapOffset), kScratchRegister); @@ -3957,6 +3960,9 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
   }

   if (instr->hydrogen()->NeedsWriteBarrier()) {
+    Counters* counters = isolate()->counters();
+    counters->write_barriers_opt_static()->Increment();
+    __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
     Register value = ToRegister(instr->value());
Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object;
     // Update the write barrier for the object for in-object properties.
@@ -4178,6 +4184,9 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) {
   }

   if (instr->hydrogen()->NeedsWriteBarrier()) {
+    Counters* counters = isolate()->counters();
+    counters->write_barriers_opt_static()->Increment();
+    __ IncrementCounter(counters->write_barriers_opt_dynamic(), 1);
     ASSERT(instr->value()->IsRegister());
     Register value = ToRegister(instr->value());
     ASSERT(!instr->key()->IsConstantOperand());


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to