From 88f90680fd7357d1b561594b9e8592fbdc474946 Mon Sep 17 00:00:00 2001 From: bmeurer Date: Wed, 12 Aug 2015 06:44:06 -0700 Subject: [PATCH] [runtime] Remove useless %_IsUndetectableObject intrinsic. Instead of using a sequence if (something == null && !IS_UNDETECTABLE(something))) { ... } which will be true if something is either null or undefined, it is way simpler and way more efficient to just write if (something === null || something === (void 0)) { ... } instead, which allows the compiler(s) to generate pretty decent code without any need to resort to type feedback from a CompareNil IC. R=yangguo@chromium.org Review URL: https://codereview.chromium.org/1288623003 Cr-Commit-Position: refs/heads/master@{#30135} --- src/full-codegen/arm/full-codegen-arm.cc | 24 ------------------------ src/full-codegen/arm64/full-codegen-arm64.cc | 25 ------------------------- src/full-codegen/full-codegen.h | 1 - src/full-codegen/ia32/full-codegen-ia32.cc | 24 ------------------------ src/full-codegen/mips/full-codegen-mips.cc | 24 ------------------------ src/full-codegen/mips64/full-codegen-mips64.cc | 24 ------------------------ src/full-codegen/ppc/full-codegen-ppc.cc | 24 ------------------------ src/full-codegen/x64/full-codegen-x64.cc | 24 ------------------------ src/full-codegen/x87/full-codegen-x87.cc | 24 ------------------------ src/hydrogen.cc | 9 --------- src/hydrogen.h | 1 - src/macros.py | 1 - src/messages.js | 2 +- src/runtime/runtime-object.cc | 8 -------- src/runtime/runtime.h | 1 - src/v8natives.js | 10 +++++----- 16 files changed, 6 insertions(+), 220 deletions(-) diff --git a/src/full-codegen/arm/full-codegen-arm.cc b/src/full-codegen/arm/full-codegen-arm.cc index 82c3f94..b64da3a 100644 --- a/src/full-codegen/arm/full-codegen-arm.cc +++ b/src/full-codegen/arm/full-codegen-arm.cc @@ -3448,30 +3448,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(r0, if_false); - __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset)); - __ ldrb(r1, FieldMemOperand(r1, Map::kBitFieldOffset)); - __ tst(r1, Operand(1 << Map::kIsUndetectable)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(ne, if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/arm64/full-codegen-arm64.cc b/src/full-codegen/arm64/full-codegen-arm64.cc index d0719ff..dea09fc 100644 --- a/src/full-codegen/arm64/full-codegen-arm64.cc +++ b/src/full-codegen/arm64/full-codegen-arm64.cc @@ -3139,31 +3139,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ASM_LOCATION("FullCodeGenerator::EmitIsUndetectableObject"); - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(x0, if_false); - __ Ldr(x10, FieldMemOperand(x0, HeapObject::kMapOffset)); - __ Ldrb(x11, FieldMemOperand(x10, Map::kBitFieldOffset)); - __ Tst(x11, 1 << Map::kIsUndetectable); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(ne, if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/full-codegen.h b/src/full-codegen/full-codegen.h index 897d55e..846a6af 100644 --- a/src/full-codegen/full-codegen.h +++ b/src/full-codegen/full-codegen.h @@ -509,7 +509,6 @@ class FullCodeGenerator: public AstVisitor { F(ObjectEquals) \ F(IsObject) \ F(IsFunction) \ - F(IsUndetectableObject) \ F(IsSpecObject) \ F(IsSimdValue) \ F(IsStringWrapperSafeForDefaultValueOf) \ diff --git a/src/full-codegen/ia32/full-codegen-ia32.cc b/src/full-codegen/ia32/full-codegen-ia32.cc index 42f433a..7015691 100644 --- a/src/full-codegen/ia32/full-codegen-ia32.cc +++ b/src/full-codegen/ia32/full-codegen-ia32.cc @@ -3340,30 +3340,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(eax, if_false); - __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); - __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); - __ test(ebx, Immediate(1 << Map::kIsUndetectable)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(not_zero, if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/mips/full-codegen-mips.cc b/src/full-codegen/mips/full-codegen-mips.cc index c265876..0e8c4a0 100644 --- a/src/full-codegen/mips/full-codegen-mips.cc +++ b/src/full-codegen/mips/full-codegen-mips.cc @@ -3438,30 +3438,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(v0, if_false); - __ lw(a1, FieldMemOperand(v0, HeapObject::kMapOffset)); - __ lbu(a1, FieldMemOperand(a1, Map::kBitFieldOffset)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - __ And(at, a1, Operand(1 << Map::kIsUndetectable)); - Split(ne, at, Operand(zero_reg), if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/mips64/full-codegen-mips64.cc b/src/full-codegen/mips64/full-codegen-mips64.cc index ccad351..fab263e 100644 --- a/src/full-codegen/mips64/full-codegen-mips64.cc +++ b/src/full-codegen/mips64/full-codegen-mips64.cc @@ -3439,30 +3439,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(v0, if_false); - __ ld(a1, FieldMemOperand(v0, HeapObject::kMapOffset)); - __ lbu(a1, FieldMemOperand(a1, Map::kBitFieldOffset)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - __ And(at, a1, Operand(1 << Map::kIsUndetectable)); - Split(ne, at, Operand(zero_reg), if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/ppc/full-codegen-ppc.cc b/src/full-codegen/ppc/full-codegen-ppc.cc index 2d8e8cf..10dc8d6 100644 --- a/src/full-codegen/ppc/full-codegen-ppc.cc +++ b/src/full-codegen/ppc/full-codegen-ppc.cc @@ -3445,30 +3445,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, &if_true, - &if_false, &fall_through); - - __ JumpIfSmi(r3, if_false); - __ LoadP(r4, FieldMemOperand(r3, HeapObject::kMapOffset)); - __ lbz(r4, FieldMemOperand(r4, Map::kBitFieldOffset)); - __ andi(r0, r4, Operand(1 << Map::kIsUndetectable)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(ne, if_true, if_false, fall_through, cr0); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/x64/full-codegen-x64.cc b/src/full-codegen/x64/full-codegen-x64.cc index 8697704..d351c81 100644 --- a/src/full-codegen/x64/full-codegen-x64.cc +++ b/src/full-codegen/x64/full-codegen-x64.cc @@ -3332,30 +3332,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(rax, if_false); - __ movp(rbx, FieldOperand(rax, HeapObject::kMapOffset)); - __ testb(FieldOperand(rbx, Map::kBitFieldOffset), - Immediate(1 << Map::kIsUndetectable)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(not_zero, if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/full-codegen/x87/full-codegen-x87.cc b/src/full-codegen/x87/full-codegen-x87.cc index 1e916c7..afd2039 100644 --- a/src/full-codegen/x87/full-codegen-x87.cc +++ b/src/full-codegen/x87/full-codegen-x87.cc @@ -3335,30 +3335,6 @@ void FullCodeGenerator::EmitIsSimdValue(CallRuntime* expr) { } -void FullCodeGenerator::EmitIsUndetectableObject(CallRuntime* expr) { - ZoneList* args = expr->arguments(); - DCHECK(args->length() == 1); - - VisitForAccumulatorValue(args->at(0)); - - Label materialize_true, materialize_false; - Label* if_true = NULL; - Label* if_false = NULL; - Label* fall_through = NULL; - context()->PrepareTest(&materialize_true, &materialize_false, - &if_true, &if_false, &fall_through); - - __ JumpIfSmi(eax, if_false); - __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); - __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); - __ test(ebx, Immediate(1 << Map::kIsUndetectable)); - PrepareForBailoutBeforeSplit(expr, true, if_true, if_false); - Split(not_zero, if_true, if_false, fall_through); - - context()->Plug(if_true, if_false); -} - - void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf( CallRuntime* expr) { ZoneList* args = expr->arguments(); diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 504c8b8..559eca6 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -12095,15 +12095,6 @@ void HOptimizedGraphBuilder::GenerateHasFastPackedElements(CallRuntime* call) { } -void HOptimizedGraphBuilder::GenerateIsUndetectableObject(CallRuntime* call) { - DCHECK(call->arguments()->length() == 1); - CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); - HValue* value = Pop(); - HIsUndetectableAndBranch* result = New(value); - return ast_context()->ReturnControl(result, call->id()); -} - - // Support for construct call checks. void HOptimizedGraphBuilder::GenerateIsConstructCall(CallRuntime* call) { DCHECK(call->arguments()->length() == 0); diff --git a/src/hydrogen.h b/src/hydrogen.h index 92576a3..c6953cd 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -2197,7 +2197,6 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor { F(IsObject) \ F(ToObject) \ F(IsFunction) \ - F(IsUndetectableObject) \ F(IsSpecObject) \ F(MathPow) \ F(IsMinusZero) \ diff --git a/src/macros.py b/src/macros.py index ee0770b..090b9e0 100644 --- a/src/macros.py +++ b/src/macros.py @@ -117,7 +117,6 @@ macro IS_SHAREDARRAYBUFFER(arg) = (%_ClassOf(arg) === 'SharedArrayBuffer'); macro IS_GENERATOR(arg) = (%_ClassOf(arg) === 'Generator'); macro IS_SET_ITERATOR(arg) = (%_ClassOf(arg) === 'Set Iterator'); macro IS_MAP_ITERATOR(arg) = (%_ClassOf(arg) === 'Map Iterator'); -macro IS_UNDETECTABLE(arg) = (%_IsUndetectableObject(arg)); macro IS_STRONG(arg) = (%IsStrong(arg)); # Macro for ECMAScript 5 queries of the type: diff --git a/src/messages.js b/src/messages.js index 0f14c1a..719c387 100644 --- a/src/messages.js +++ b/src/messages.js @@ -82,7 +82,7 @@ var GlobalEvalError; function NoSideEffectsObjectToString() { - if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; + if (IS_UNDEFINED(this)) return "[object Undefined]"; if (IS_NULL(this)) return "[object Null]"; return "[object " + %_ClassOf(TO_OBJECT(this)) + "]"; } diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc index d7fca52..b054664 100644 --- a/src/runtime/runtime-object.cc +++ b/src/runtime/runtime-object.cc @@ -1372,14 +1372,6 @@ RUNTIME_FUNCTION(Runtime_IsObject) { } -RUNTIME_FUNCTION(Runtime_IsUndetectableObject) { - SealHandleScope shs(isolate); - DCHECK(args.length() == 1); - CONVERT_ARG_CHECKED(Object, obj, 0); - return isolate->heap()->ToBoolean(obj->IsUndetectableObject()); -} - - RUNTIME_FUNCTION(Runtime_IsSpecObject) { SealHandleScope shs(isolate); DCHECK(args.length() == 1); diff --git a/src/runtime/runtime.h b/src/runtime/runtime.h index 1bc247c..62acb22 100644 --- a/src/runtime/runtime.h +++ b/src/runtime/runtime.h @@ -484,7 +484,6 @@ namespace internal { F(MapGetInstanceType, 1, 1) \ F(ObjectEquals, 2, 1) \ F(IsObject, 1, 1) \ - F(IsUndetectableObject, 1, 1) \ F(IsSpecObject, 1, 1) \ F(IsStrong, 1, 1) \ F(ClassOf, 1, 1) \ diff --git a/src/v8natives.js b/src/v8natives.js index 29481d1..b950d4a 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -139,7 +139,7 @@ utils.InstallFunctions(global, DONT_ENUM, [ // ECMA-262 - 15.2.4.2 function ObjectToString() { - if (IS_UNDEFINED(this) && !IS_UNDETECTABLE(this)) return "[object Undefined]"; + if (IS_UNDEFINED(this)) return "[object Undefined]"; if (IS_NULL(this)) return "[object Null]"; var O = TO_OBJECT(this); var builtinTag = %_ClassOf(O); @@ -213,7 +213,7 @@ function ObjectPropertyIsEnumerable(V) { // Extensions for providing property getters and setters. function ObjectDefineGetter(name, fun) { var receiver = this; - if (receiver == null && !IS_UNDETECTABLE(receiver)) { + if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { receiver = %GlobalProxy(ObjectDefineGetter); } if (!IS_SPEC_FUNCTION(fun)) { @@ -229,7 +229,7 @@ function ObjectDefineGetter(name, fun) { function ObjectLookupGetter(name) { var receiver = this; - if (receiver == null && !IS_UNDETECTABLE(receiver)) { + if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { receiver = %GlobalProxy(ObjectLookupGetter); } return %LookupAccessor(TO_OBJECT(receiver), $toName(name), GETTER); @@ -238,7 +238,7 @@ function ObjectLookupGetter(name) { function ObjectDefineSetter(name, fun) { var receiver = this; - if (receiver == null && !IS_UNDETECTABLE(receiver)) { + if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { receiver = %GlobalProxy(ObjectDefineSetter); } if (!IS_SPEC_FUNCTION(fun)) { @@ -254,7 +254,7 @@ function ObjectDefineSetter(name, fun) { function ObjectLookupSetter(name) { var receiver = this; - if (receiver == null && !IS_UNDETECTABLE(receiver)) { + if (IS_NULL(receiver) || IS_UNDEFINED(receiver)) { receiver = %GlobalProxy(ObjectLookupSetter); } return %LookupAccessor(TO_OBJECT(receiver), $toName(name), SETTER); -- 2.7.4