| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 82f1e377be41160caa2c6902a41a35384f2e4ebc..5f70885a61f36d826aa64f28739c44e3e2bb9495 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -6906,14 +6906,46 @@ void HOptimizedGraphBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
|
| pointer_size,
|
| mode);
|
| } else {
|
| + NoObservableSideEffectsScope no_effects(this);
|
| + // Boilerplate already exists and constant elements are never accessed,
|
| + // pass an empty fixed array to the runtime function instead.
|
| + Handle<FixedArray> constants = isolate()->factory()->empty_fixed_array();
|
| + int literal_index = expr->literal_index();
|
| +
|
| + // TODO(mstarzinger): The following check and deopt is actually obsolete
|
| + // but test cases for the tick processor fails because profile differs.
|
| +
|
| + // Deopt if the array literal boilerplate ElementsKind is of a type
|
| + // different than the expected one. The check isn't necessary if the
|
| + // boilerplate has already been converted to TERMINAL_FAST_ELEMENTS_KIND.
|
| + if (CanTransitionToMoreGeneralFastElementsKind(
|
| + boilerplate_elements_kind, true)) {
|
| + IfBuilder builder(this);
|
| + HValue* boilerplate = AddInstruction(new(zone())
|
| + HConstant(original_boilerplate_object, Representation::Tagged()));
|
| + HValue* elements_kind = AddInstruction(new(zone())
|
| + HElementsKind(boilerplate));
|
| + HValue* expected_kind = AddInstruction(new(zone())
|
| + HConstant(boilerplate_elements_kind, Representation::Integer32()));
|
| + builder.IfCompare(elements_kind, expected_kind, Token::EQ);
|
| + builder.Then();
|
| + builder.ElseDeopt();
|
| + }
|
| +
|
| + AddInstruction(new(zone()) HPushArgument(AddInstruction(
|
| + new(zone()) HConstant(literals, Representation::Tagged()))));
|
| + AddInstruction(new(zone()) HPushArgument(AddInstruction(
|
| + new(zone()) HConstant(literal_index, Representation::Tagged()))));
|
| + AddInstruction(new(zone()) HPushArgument(AddInstruction(
|
| + new(zone()) HConstant(constants, Representation::Tagged()))));
|
| +
|
| + Runtime::FunctionId function_id = (expr->depth() > 1)
|
| + ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow;
|
| literal = AddInstruction(
|
| - new(zone()) HArrayLiteral(context,
|
| - original_boilerplate_object,
|
| - literals,
|
| - length,
|
| - expr->literal_index(),
|
| - expr->depth(),
|
| - mode));
|
| + new(zone()) HCallRuntime(context,
|
| + isolate()->factory()->empty_string(),
|
| + Runtime::FunctionForId(function_id),
|
| + 3));
|
| }
|
|
|
| // The array is expected in the bailout environment during computation
|
|
|