| Index: src/compiler/change-lowering.cc
|
| diff --git a/src/compiler/change-lowering.cc b/src/compiler/change-lowering.cc
|
| index e217f3786b02c43ee5278b1c2555108857d24832..907b36a93b7dd860c2a32e27a6b685444c9baf33 100644
|
| --- a/src/compiler/change-lowering.cc
|
| +++ b/src/compiler/change-lowering.cc
|
| @@ -55,6 +55,8 @@ Reduction ChangeLowering::Reduce(Node* node) {
|
| return ObjectIsSmi(node);
|
| case IrOpcode::kObjectIsNumber:
|
| return ObjectIsNumber(node);
|
| + case IrOpcode::kObjectIsUndetectable:
|
| + return ObjectIsUndetectable(node);
|
| default:
|
| return NoChange();
|
| }
|
| @@ -603,6 +605,13 @@ Node* ChangeLowering::LoadHeapObjectMap(Node* object, Node* control) {
|
| graph()->start(), control);
|
| }
|
|
|
| +Node* ChangeLowering::LoadMapBitField(Node* map) {
|
| + return graph()->NewNode(
|
| + machine()->Load(MachineType::Uint8()), map,
|
| + jsgraph()->IntPtrConstant(Map::kBitFieldOffset - kHeapObjectTag),
|
| + graph()->start(), graph()->start());
|
| +}
|
| +
|
| Node* ChangeLowering::LoadMapInstanceType(Node* map) {
|
| return graph()->NewNode(
|
| machine()->Load(MachineType::Uint8()), map,
|
| @@ -650,6 +659,31 @@ Reduction ChangeLowering::ObjectIsReceiver(Node* node) {
|
| return Changed(node);
|
| }
|
|
|
| +Reduction ChangeLowering::ObjectIsUndetectable(Node* node) {
|
| + Node* input = NodeProperties::GetValueInput(node, 0);
|
| + // TODO(bmeurer): Optimize somewhat based on input type.
|
| + Node* check = IsSmi(input);
|
| + Node* branch = graph()->NewNode(common()->Branch(), check, graph()->start());
|
| + Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
|
| + Node* vtrue = jsgraph()->Int32Constant(0);
|
| + Node* if_false = graph()->NewNode(common()->IfFalse(), branch);
|
| + Node* vfalse = graph()->NewNode(
|
| + machine()->Word32Equal(),
|
| + graph()->NewNode(
|
| + machine()->Word32Equal(),
|
| + graph()->NewNode(machine()->Word32And(),
|
| + jsgraph()->Uint32Constant(1 << Map::kIsUndetectable),
|
| + LoadMapBitField(LoadHeapObjectMap(input, if_false))),
|
| + jsgraph()->Int32Constant(0)),
|
| + jsgraph()->Int32Constant(0));
|
| + Node* control = graph()->NewNode(common()->Merge(2), if_true, if_false);
|
| + node->ReplaceInput(0, vtrue);
|
| + node->AppendInput(graph()->zone(), vfalse);
|
| + node->AppendInput(graph()->zone(), control);
|
| + NodeProperties::ChangeOp(node, common()->Phi(MachineRepresentation::kBit, 2));
|
| + return Changed(node);
|
| +}
|
| +
|
| Reduction ChangeLowering::ObjectIsSmi(Node* node) {
|
| node->ReplaceInput(0,
|
| graph()->NewNode(machine()->WordAnd(), node->InputAt(0),
|
|
|