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

Side by Side 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/effect-control-linearizer.h" 5 #include "src/compiler/effect-control-linearizer.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler/access-builder.h" 8 #include "src/compiler/access-builder.h"
9 #include "src/compiler/compiler-source-position-table.h" 9 #include "src/compiler/compiler-source-position-table.h"
10 #include "src/compiler/js-graph.h" 10 #include "src/compiler/js-graph.h"
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
731 break; 731 break;
732 case IrOpcode::kObjectIsSmi: 732 case IrOpcode::kObjectIsSmi:
733 result = LowerObjectIsSmi(node); 733 result = LowerObjectIsSmi(node);
734 break; 734 break;
735 case IrOpcode::kObjectIsString: 735 case IrOpcode::kObjectIsString:
736 result = LowerObjectIsString(node); 736 result = LowerObjectIsString(node);
737 break; 737 break;
738 case IrOpcode::kObjectIsUndetectable: 738 case IrOpcode::kObjectIsUndetectable:
739 result = LowerObjectIsUndetectable(node); 739 result = LowerObjectIsUndetectable(node);
740 break; 740 break;
741 case IrOpcode::kTypeOfIsFunction:
742 result = LowerObjectTypeOfIsFunction(node);
743 break;
741 case IrOpcode::kNewRestParameterElements: 744 case IrOpcode::kNewRestParameterElements:
742 result = LowerNewRestParameterElements(node); 745 result = LowerNewRestParameterElements(node);
743 break; 746 break;
744 case IrOpcode::kNewUnmappedArgumentsElements: 747 case IrOpcode::kNewUnmappedArgumentsElements:
745 result = LowerNewUnmappedArgumentsElements(node); 748 result = LowerNewUnmappedArgumentsElements(node);
746 break; 749 break;
747 case IrOpcode::kArrayBufferWasNeutered: 750 case IrOpcode::kArrayBufferWasNeutered:
748 result = LowerArrayBufferWasNeutered(node); 751 result = LowerArrayBufferWasNeutered(node);
749 break; 752 break;
750 case IrOpcode::kStringFromCharCode: 753 case IrOpcode::kStringFromCharCode:
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after
1840 __ Int32Constant(0)); 1843 __ Int32Constant(0));
1841 __ Goto(&done, vfalse); 1844 __ Goto(&done, vfalse);
1842 1845
1843 __ Bind(&if_smi); 1846 __ Bind(&if_smi);
1844 __ Goto(&done, __ Int32Constant(0)); 1847 __ Goto(&done, __ Int32Constant(0));
1845 1848
1846 __ Bind(&done); 1849 __ Bind(&done);
1847 return done.PhiAt(0); 1850 return done.PhiAt(0);
1848 } 1851 }
1849 1852
1853 Node* EffectControlLinearizer::LowerObjectTypeOfIsFunction(Node* node) {
1854 Node* value = node->InputAt(0);
1855
1856 auto return_false = __ MakeDeferredLabel<3>();
1857 auto done = __ MakeLabel<2>(MachineRepresentation::kBit);
1858
1859 Node* check0 = ObjectIsSmi(value);
1860 __ GotoIf(check0, &return_false);
1861
1862 Node* value_map = __ LoadField(AccessBuilder::ForMap(), value);
1863 Node* value_instance_type =
1864 __ LoadField(AccessBuilder::ForMapInstanceType(), value_map);
1865 Node* check1 = __ Uint32LessThanOrEqual(
1866 __ Uint32Constant(FIRST_FUNCTION_TYPE), value_instance_type);
1867 __ GotoUnless(check1, &return_false);
1868 Node* check2 = __ Uint32LessThanOrEqual(
1869 value_instance_type, __ Uint32Constant(LAST_FUNCTION_TYPE));
1870 __ 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
1871
1872 __ Goto(&done, __ Int32Constant(1));
1873
1874 __ Bind(&return_false);
1875 __ Goto(&done, __ Int32Constant(0));
1876
1877 __ Bind(&done);
1878 return done.PhiAt(0);
1879 }
1880
1850 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { 1881 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) {
1851 int const formal_parameter_count = ParameterCountOf(node->op()); 1882 int const formal_parameter_count = ParameterCountOf(node->op());
1852 1883
1853 Callable const callable = CodeFactory::NewRestParameterElements(isolate()); 1884 Callable const callable = CodeFactory::NewRestParameterElements(isolate());
1854 Operator::Properties const properties = node->op()->properties(); 1885 Operator::Properties const properties = node->op()->properties();
1855 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; 1886 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags;
1856 CallDescriptor* desc = Linkage::GetStubCallDescriptor( 1887 CallDescriptor* desc = Linkage::GetStubCallDescriptor(
1857 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); 1888 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties);
1858 return __ Call(desc, __ HeapConstant(callable.code()), 1889 return __ Call(desc, __ HeapConstant(callable.code()),
1859 __ IntPtrConstant(formal_parameter_count), 1890 __ IntPtrConstant(formal_parameter_count),
(...skipping 935 matching lines...) Expand 10 before | Expand all | Expand 10 after
2795 return isolate()->factory(); 2826 return isolate()->factory();
2796 } 2827 }
2797 2828
2798 Isolate* EffectControlLinearizer::isolate() const { 2829 Isolate* EffectControlLinearizer::isolate() const {
2799 return jsgraph()->isolate(); 2830 return jsgraph()->isolate();
2800 } 2831 }
2801 2832
2802 } // namespace compiler 2833 } // namespace compiler
2803 } // namespace internal 2834 } // namespace internal
2804 } // namespace v8 2835 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698