| Index: src/compiler/effect-control-linearizer.cc
|
| diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
|
| index b0158525723ee21ea7de1f8d0345a7ea5b820099..70b297da0d2a1377c400b910eca7672f8ad80cbe 100644
|
| --- a/src/compiler/effect-control-linearizer.cc
|
| +++ b/src/compiler/effect-control-linearizer.cc
|
| @@ -784,6 +784,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
|
| case IrOpcode::kStoreTypedElement:
|
| state = LowerStoreTypedElement(node, *effect, *control);
|
| break;
|
| + case IrOpcode::kLoadFunctionPrototype:
|
| + state = LowerLoadFunctionPrototype(node, *effect, *control);
|
| + break;
|
| case IrOpcode::kFloat64RoundUp:
|
| state = LowerFloat64RoundUp(node, *effect, *control);
|
| break;
|
| @@ -3274,6 +3277,50 @@ EffectControlLinearizer::LowerStoreTypedElement(Node* node, Node* effect,
|
| }
|
|
|
| EffectControlLinearizer::ValueEffectControl
|
| +EffectControlLinearizer::LowerLoadFunctionPrototype(Node* node, Node* effect,
|
| + Node* control) {
|
| + Node* function = node->InputAt(0);
|
| +
|
| + // Load the {JSFunction::prototype-or-initial-map} field.
|
| + Node* function_prototype_or_initial_map = effect =
|
| + graph()->NewNode(simplified()->LoadField(
|
| + AccessBuilder::ForJSFunctionPrototypeOrInitialMap()),
|
| + function, effect, control);
|
| + Node* function_prototype_or_initial_map_map = effect =
|
| + graph()->NewNode(simplified()->LoadField(AccessBuilder::ForMap()),
|
| + function, effect, control);
|
| +
|
| + // Check if the {function} has an initial map.
|
| + Node* check0 = graph()->NewNode(
|
| + machine()->WordEqual(), function_prototype_or_initial_map_map,
|
| + jsgraph()->HeapConstant(factory()->meta_map()));
|
| + Node* branch0 =
|
| + graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control);
|
| +
|
| + Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
|
| + Node* etrue0 = effect;
|
| + Node* vtrue0;
|
| + {
|
| + // Load the "prototype" from the initial map.
|
| + vtrue0 = etrue0 = graph()->NewNode(
|
| + simplified()->LoadField(AccessBuilder::ForMapPrototype()),
|
| + function_prototype_or_initial_map, etrue0, if_true0);
|
| + }
|
| +
|
| + Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
|
| + Node* efalse0 = effect;
|
| + Node* vfalse0 = function_prototype_or_initial_map;
|
| +
|
| + control = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
|
| + effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control);
|
| + Node* value =
|
| + graph()->NewNode(common()->Phi(MachineRepresentation::kTaggedPointer, 2),
|
| + vtrue0, vfalse0, control);
|
| +
|
| + return ValueEffectControl(value, effect, control);
|
| +}
|
| +
|
| +EffectControlLinearizer::ValueEffectControl
|
| EffectControlLinearizer::LowerFloat64RoundUp(Node* node, Node* effect,
|
| Node* control) {
|
| // Nothing to be done if a fast hardware instruction is available.
|
|
|