Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(87)

Unified Diff: src/compiler/effect-control-linearizer.cc

Issue 2697063002: Fix typeof optimization for undetectable (Closed)
Patch Set: Add TypeOfIsFunction to EscapeStatusAnalysis Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/effect-control-linearizer.cc
diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
index 1aa0ec6668c8ea5e228447ab3c3a082014acf9d5..7c4d16913213aa006d50f908c4530793bc2ee39f 100644
--- a/src/compiler/effect-control-linearizer.cc
+++ b/src/compiler/effect-control-linearizer.cc
@@ -738,6 +738,9 @@ bool EffectControlLinearizer::TryWireInStateEffect(Node* node,
case IrOpcode::kObjectIsUndetectable:
result = LowerObjectIsUndetectable(node);
break;
+ case IrOpcode::kTypeOfIsFunction:
+ result = LowerObjectTypeOfIsFunction(node);
+ break;
case IrOpcode::kNewRestParameterElements:
result = LowerNewRestParameterElements(node);
break;
@@ -1847,6 +1850,34 @@ Node* EffectControlLinearizer::LowerObjectIsUndetectable(Node* node) {
return done.PhiAt(0);
}
+Node* EffectControlLinearizer::LowerObjectTypeOfIsFunction(Node* node) {
+ Node* value = node->InputAt(0);
+
+ auto return_false = __ MakeDeferredLabel<3>();
+ auto done = __ MakeLabel<2>(MachineRepresentation::kBit);
+
+ Node* check0 = ObjectIsSmi(value);
+ __ GotoIf(check0, &return_false);
+
+ Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
+ Node* value_instance_type =
+ __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
+ Node* check1 = __ Uint32LessThanOrEqual(
+ __ Uint32Constant(FIRST_FUNCTION_TYPE), value_instance_type);
+ __ GotoUnless(check1, &return_false);
+ Node* check2 = __ Uint32LessThanOrEqual(
+ value_instance_type, __ Uint32Constant(LAST_FUNCTION_TYPE));
+ __ GotoUnless(check2, &return_false);
vabr (Chromium) 2017/02/15 23:36:41 This ignores proxies (which was helpfully pointed
Benedikt Meurer 2017/02/16 04:01:19 The code of ObjectIsCallable is the correct code f
+
+ __ Goto(&done, __ Int32Constant(1));
+
+ __ Bind(&return_false);
+ __ Goto(&done, __ Int32Constant(0));
+
+ __ Bind(&done);
+ return done.PhiAt(0);
+}
+
Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) {
int const formal_parameter_count = ParameterCountOf(node->op());

Powered by Google App Engine
This is Rietveld 408576698