Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index 44eed8fddfd64d417c749b94e50f58ea82dd50cd..486d470e4fee571625b8118b03cd8e799b011fa3 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -193,9 +193,10 @@ void SimplifiedLowering::DoChangeBitToBool(Node* node, Node* effect, |
static WriteBarrierKind ComputeWriteBarrierKind( |
- MachineRepresentation representation, Type* type) { |
+ bool base_is_tagged, MachineRepresentation representation, Type* type) { |
// TODO(turbofan): skip write barriers for Smis, etc. |
- if (representation == kMachineTagged) { |
+ if (base_is_tagged && representation == kMachineTagged) { |
+ // Write barriers are only for writes into heap objects (i.e. tagged base). |
return kFullWriteBarrier; |
} |
return kNoWriteBarrier; |
@@ -205,19 +206,19 @@ static WriteBarrierKind ComputeWriteBarrierKind( |
void SimplifiedLowering::DoLoadField(Node* node, Node* effect, Node* control) { |
const FieldAccess& access = FieldAccessOf(node->op()); |
node->set_op(machine_.Load(access.representation)); |
- Node* offset = |
- graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag)); |
+ int tag = access.base_is_tagged ? kHeapObjectTag : 0; |
+ Node* offset = graph()->NewNode(common()->Int32Constant(access.offset - tag)); |
node->InsertInput(zone(), 1, offset); |
} |
void SimplifiedLowering::DoStoreField(Node* node, Node* effect, Node* control) { |
const FieldAccess& access = FieldAccessOf(node->op()); |
- WriteBarrierKind kind = |
- ComputeWriteBarrierKind(access.representation, access.type); |
+ WriteBarrierKind kind = ComputeWriteBarrierKind( |
+ access.base_is_tagged, access.representation, access.type); |
node->set_op(machine_.Store(access.representation, kind)); |
- Node* offset = |
- graph()->NewNode(common()->Int32Constant(access.offset - kHeapObjectTag)); |
+ int tag = access.base_is_tagged ? kHeapObjectTag : 0; |
+ Node* offset = graph()->NewNode(common()->Int32Constant(access.offset - tag)); |
node->InsertInput(zone(), 1, offset); |
} |
@@ -251,7 +252,8 @@ Node* SimplifiedLowering::ComputeIndex(const ElementAccess& access, |
machine()->Int32Mul(), |
graph()->NewNode(common()->Int32Constant(element_size)), index); |
} |
- int fixed_offset = access.header_size - kHeapObjectTag; |
+ int tag = access.base_is_tagged ? kHeapObjectTag : 0; |
+ int fixed_offset = access.header_size - tag; |
if (fixed_offset == 0) return index; |
return graph()->NewNode( |
machine()->Int32Add(), |
@@ -270,8 +272,8 @@ void SimplifiedLowering::DoLoadElement(Node* node, Node* effect, |
void SimplifiedLowering::DoStoreElement(Node* node, Node* effect, |
Node* control) { |
const ElementAccess& access = ElementAccessOf(node->op()); |
- WriteBarrierKind kind = |
- ComputeWriteBarrierKind(access.representation, access.type); |
+ WriteBarrierKind kind = ComputeWriteBarrierKind( |
+ access.base_is_tagged, access.representation, access.type); |
node->set_op(machine_.Store(access.representation, kind)); |
node->ReplaceInput(1, ComputeIndex(access, node->InputAt(1))); |
} |