| Index: src/compiler/js-builtin-reducer.cc
 | 
| diff --git a/src/compiler/js-builtin-reducer.cc b/src/compiler/js-builtin-reducer.cc
 | 
| index bc7ab6f1d29866ba64b1ea07be823ac62f96e0af..a7e05b8bfeebc027a180b3976a6d55b909986c62 100644
 | 
| --- a/src/compiler/js-builtin-reducer.cc
 | 
| +++ b/src/compiler/js-builtin-reducer.cc
 | 
| @@ -235,17 +235,27 @@ Reduction JSBuiltinReducer::ReduceArrayIterator(Handle<Map> receiver_map,
 | 
|    Node* control = NodeProperties::GetControlInput(node);
 | 
|  
 | 
|    if (iter_kind == ArrayIteratorKind::kTypedArray) {
 | 
| -    // For JSTypedArray iterator methods, deopt if the buffer is neutered. This
 | 
| -    // is potentially a deopt loop, but should be extremely unlikely.
 | 
| -    DCHECK_EQ(JS_TYPED_ARRAY_TYPE, receiver_map->instance_type());
 | 
| -    Node* buffer = effect = graph()->NewNode(
 | 
| -        simplified()->LoadField(AccessBuilder::ForJSArrayBufferViewBuffer()),
 | 
| -        receiver, effect, control);
 | 
| -
 | 
| -    Node* check = effect = graph()->NewNode(
 | 
| -        simplified()->ArrayBufferWasNeutered(), buffer, effect, control);
 | 
| -    check = graph()->NewNode(simplified()->BooleanNot(), check);
 | 
| -    effect = graph()->NewNode(simplified()->CheckIf(), check, effect, control);
 | 
| +    // See if we can skip the neutering check.
 | 
| +    if (isolate()->IsArrayBufferNeuteringIntact()) {
 | 
| +      // Add a code dependency so we are deoptimized in case an ArrayBuffer
 | 
| +      // gets neutered.
 | 
| +      dependencies()->AssumePropertyCell(
 | 
| +          factory()->array_buffer_neutering_protector());
 | 
| +    } else {
 | 
| +      // For JSTypedArray iterator methods, deopt if the buffer is neutered.
 | 
| +      // This is potentially a deopt loop, but should be extremely unlikely.
 | 
| +      DCHECK_EQ(JS_TYPED_ARRAY_TYPE, receiver_map->instance_type());
 | 
| +      Node* buffer = effect = graph()->NewNode(
 | 
| +          simplified()->LoadField(AccessBuilder::ForJSArrayBufferViewBuffer()),
 | 
| +          receiver, effect, control);
 | 
| +
 | 
| +      // Deoptimize if the {buffer} has been neutered.
 | 
| +      Node* check = effect = graph()->NewNode(
 | 
| +          simplified()->ArrayBufferWasNeutered(), buffer, effect, control);
 | 
| +      check = graph()->NewNode(simplified()->BooleanNot(), check);
 | 
| +      effect =
 | 
| +          graph()->NewNode(simplified()->CheckIf(), check, effect, control);
 | 
| +    }
 | 
|    }
 | 
|  
 | 
|    int map_index = -1;
 | 
| @@ -535,11 +545,20 @@ Reduction JSBuiltinReducer::ReduceTypedArrayIteratorNext(
 | 
|          simplified()->LoadField(AccessBuilder::ForJSArrayBufferViewBuffer()),
 | 
|          array, efalse0, if_false0);
 | 
|  
 | 
| -    Node* check1 = efalse0 = graph()->NewNode(
 | 
| -        simplified()->ArrayBufferWasNeutered(), buffer, efalse0, if_false0);
 | 
| -    check1 = graph()->NewNode(simplified()->BooleanNot(), check1);
 | 
| -    efalse0 =
 | 
| -        graph()->NewNode(simplified()->CheckIf(), check1, efalse0, if_false0);
 | 
| +    // See if we can skip the neutering check.
 | 
| +    if (isolate()->IsArrayBufferNeuteringIntact()) {
 | 
| +      // Add a code dependency so we are deoptimized in case an ArrayBuffer
 | 
| +      // gets neutered.
 | 
| +      dependencies()->AssumePropertyCell(
 | 
| +          factory()->array_buffer_neutering_protector());
 | 
| +    } else {
 | 
| +      // Deoptimize if the array byuffer was neutered.
 | 
| +      Node* check1 = efalse0 = graph()->NewNode(
 | 
| +          simplified()->ArrayBufferWasNeutered(), buffer, efalse0, if_false0);
 | 
| +      check1 = graph()->NewNode(simplified()->BooleanNot(), check1);
 | 
| +      efalse0 =
 | 
| +          graph()->NewNode(simplified()->CheckIf(), check1, efalse0, if_false0);
 | 
| +    }
 | 
|  
 | 
|      Node* length = efalse0 = graph()->NewNode(
 | 
|          simplified()->LoadField(AccessBuilder::ForJSTypedArrayLength()), array,
 | 
| @@ -1775,21 +1794,29 @@ Reduction JSBuiltinReducer::ReduceArrayBufferViewAccessor(
 | 
|    Node* control = NodeProperties::GetControlInput(node);
 | 
|    if (HasInstanceTypeWitness(receiver, effect, instance_type)) {
 | 
|      // Load the {receiver}s field.
 | 
| -    Node* receiver_value = effect = graph()->NewNode(
 | 
| -        simplified()->LoadField(access), receiver, effect, control);
 | 
| -
 | 
| -    // Check if the {receiver}s buffer was neutered.
 | 
| -    Node* receiver_buffer = effect = graph()->NewNode(
 | 
| -        simplified()->LoadField(AccessBuilder::ForJSArrayBufferViewBuffer()),
 | 
| -        receiver, effect, control);
 | 
| -    Node* check = effect =
 | 
| -        graph()->NewNode(simplified()->ArrayBufferWasNeutered(),
 | 
| -                         receiver_buffer, effect, control);
 | 
| -
 | 
| -    // Default to zero if the {receiver}s buffer was neutered.
 | 
| -    Node* value = graph()->NewNode(
 | 
| -        common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse),
 | 
| -        check, jsgraph()->ZeroConstant(), receiver_value);
 | 
| +    Node* value = effect = graph()->NewNode(simplified()->LoadField(access),
 | 
| +                                            receiver, effect, control);
 | 
| +
 | 
| +    // See if we can skip the neutering check.
 | 
| +    if (isolate()->IsArrayBufferNeuteringIntact()) {
 | 
| +      // Add a code dependency so we are deoptimized in case an ArrayBuffer
 | 
| +      // gets neutered.
 | 
| +      dependencies()->AssumePropertyCell(
 | 
| +          factory()->array_buffer_neutering_protector());
 | 
| +    } else {
 | 
| +      // Check if the {receiver}s buffer was neutered.
 | 
| +      Node* receiver_buffer = effect = graph()->NewNode(
 | 
| +          simplified()->LoadField(AccessBuilder::ForJSArrayBufferViewBuffer()),
 | 
| +          receiver, effect, control);
 | 
| +      Node* check = effect =
 | 
| +          graph()->NewNode(simplified()->ArrayBufferWasNeutered(),
 | 
| +                           receiver_buffer, effect, control);
 | 
| +
 | 
| +      // Default to zero if the {receiver}s buffer was neutered.
 | 
| +      value = graph()->NewNode(
 | 
| +          common()->Select(MachineRepresentation::kTagged, BranchHint::kFalse),
 | 
| +          check, jsgraph()->ZeroConstant(), value);
 | 
| +    }
 | 
|  
 | 
|      ReplaceWithValue(node, value, effect, control);
 | 
|      return Replace(value);
 | 
| 
 |