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

Side by Side Diff: src/compiler/effect-control-linearizer.cc

Issue 2692753004: [turbofan] escape analysis supports arguments object and rest elements (Closed)
Patch Set: switch to ZoneVector 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::kNewRestParameterElements: 741 case IrOpcode::kArgumentsFrame:
742 result = LowerNewRestParameterElements(node); 742 result = LowerArgumentsFrame(node);
743 break;
744 case IrOpcode::kArgumentsLength:
745 result = LowerArgumentsLength(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:
751 result = LowerStringFromCharCode(node); 754 result = LowerStringFromCharCode(node);
752 break; 755 break;
(...skipping 1087 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
1850 Node* EffectControlLinearizer::LowerNewRestParameterElements(Node* node) { 1853 Node* EffectControlLinearizer::LowerArgumentsLength(Node* node) {
1851 int const formal_parameter_count = ParameterCountOf(node->op()); 1854 Node* arguments_frame = NodeProperties::GetValueInput(node, 0);
1855 int formal_parameter_count = FormalParameterCountOf(node->op());
1856 bool is_rest_length = IsRestLengthOf(node->op());
1857 DCHECK(formal_parameter_count >= 0);
1852 1858
1853 Callable const callable = CodeFactory::NewRestParameterElements(isolate()); 1859 if (is_rest_length) {
1854 Operator::Properties const properties = node->op()->properties(); 1860 auto if_adaptor_frame = __ MakeLabel<1>();
1855 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; 1861 auto done = __ MakeLabel<3>(MachineRepresentation::kTaggedSigned);
1856 CallDescriptor* desc = Linkage::GetStubCallDescriptor( 1862
1857 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); 1863 Node* frame = graph()->NewNode(machine()->LoadFramePointer());
1858 return __ Call(desc, __ HeapConstant(callable.code()), 1864 __ GotoIf(__ WordEqual(arguments_frame, frame), &done, __ SmiConstant(0));
1859 __ IntPtrConstant(formal_parameter_count), 1865 __ Goto(&if_adaptor_frame);
1860 __ NoContextConstant()); 1866
1867 __ Bind(&if_adaptor_frame);
1868 Node* arguments_length = __ Load(
1869 MachineType::TaggedSigned(), arguments_frame,
1870 __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset));
1871
1872 Node* rest_length =
1873 graph()->NewNode(machine()->IntSub(), arguments_length,
1874 __ SmiConstant(formal_parameter_count));
1875 __ GotoIf(graph()->NewNode(machine()->IntLessThan(), rest_length,
1876 __ SmiConstant(0)),
1877 &done, __ SmiConstant(0));
1878 __ Goto(&done, rest_length);
1879
1880 __ Bind(&done);
1881 return done.PhiAt(0);
1882 } else {
1883 auto if_adaptor_frame = __ MakeLabel<1>();
1884 auto done = __ MakeLabel<2>(MachineRepresentation::kTaggedSigned);
1885
1886 Node* frame = graph()->NewNode(machine()->LoadFramePointer());
1887 __ GotoIf(__ WordEqual(arguments_frame, frame), &done,
1888 __ SmiConstant(formal_parameter_count));
1889 __ Goto(&if_adaptor_frame);
1890
1891 __ Bind(&if_adaptor_frame);
1892 Node* arguments_length = __ Load(
1893 MachineType::TaggedSigned(), arguments_frame,
1894 __ IntPtrConstant(ArgumentsAdaptorFrameConstants::kLengthOffset));
1895 __ Goto(&done, arguments_length);
1896
1897 __ Bind(&done);
1898 return done.PhiAt(0);
1899 }
1900 }
1901
1902 Node* EffectControlLinearizer::LowerArgumentsFrame(Node* node) {
1903 auto done = __ MakeLabel<2>(MachineType::PointerRepresentation());
1904
1905 Node* frame = graph()->NewNode(machine()->LoadFramePointer());
1906 Node* parent_frame =
1907 __ Load(MachineType::AnyTagged(), frame,
1908 __ IntPtrConstant(StandardFrameConstants::kCallerFPOffset));
1909 Node* parent_frame_type = __ Load(
1910 MachineType::AnyTagged(), parent_frame,
1911 __ IntPtrConstant(CommonFrameConstants::kContextOrFrameTypeOffset));
1912 __ GotoIf(__ WordEqual(parent_frame_type,
1913 __ SmiConstant(StackFrame::ARGUMENTS_ADAPTOR)),
1914 &done, parent_frame);
1915 __ Goto(&done, frame);
1916
1917 __ Bind(&done);
1918 return done.PhiAt(0);
1861 } 1919 }
1862 1920
1863 Node* EffectControlLinearizer::LowerNewUnmappedArgumentsElements(Node* node) { 1921 Node* EffectControlLinearizer::LowerNewUnmappedArgumentsElements(Node* node) {
1864 int const formal_parameter_count = ParameterCountOf(node->op()); 1922 Node* frame = NodeProperties::GetValueInput(node, 0);
1923 Node* length = NodeProperties::GetValueInput(node, 1);
1865 1924
1866 Callable const callable = 1925 Callable const callable =
1867 CodeFactory::NewUnmappedArgumentsElements(isolate()); 1926 CodeFactory::NewUnmappedArgumentsElements(isolate());
1868 Operator::Properties const properties = node->op()->properties(); 1927 Operator::Properties const properties = node->op()->properties();
1869 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags; 1928 CallDescriptor::Flags const flags = CallDescriptor::kNoFlags;
1870 CallDescriptor* desc = Linkage::GetStubCallDescriptor( 1929 CallDescriptor* desc = Linkage::GetStubCallDescriptor(
1871 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties); 1930 isolate(), graph()->zone(), callable.descriptor(), 0, flags, properties);
1872 return __ Call(desc, __ HeapConstant(callable.code()), 1931 return __ Call(desc, __ HeapConstant(callable.code()), frame, length,
1873 __ IntPtrConstant(formal_parameter_count),
1874 __ NoContextConstant()); 1932 __ NoContextConstant());
1875 } 1933 }
1876 1934
1877 Node* EffectControlLinearizer::LowerArrayBufferWasNeutered(Node* node) { 1935 Node* EffectControlLinearizer::LowerArrayBufferWasNeutered(Node* node) {
1878 Node* value = node->InputAt(0); 1936 Node* value = node->InputAt(0);
1879 1937
1880 Node* value_bit_field = 1938 Node* value_bit_field =
1881 __ LoadField(AccessBuilder::ForJSArrayBufferBitField(), value); 1939 __ LoadField(AccessBuilder::ForJSArrayBufferBitField(), value);
1882 return __ Word32Equal( 1940 return __ Word32Equal(
1883 __ Word32Equal( 1941 __ Word32Equal(
(...skipping 911 matching lines...) Expand 10 before | Expand all | Expand 10 after
2795 return isolate()->factory(); 2853 return isolate()->factory();
2796 } 2854 }
2797 2855
2798 Isolate* EffectControlLinearizer::isolate() const { 2856 Isolate* EffectControlLinearizer::isolate() const {
2799 return jsgraph()->isolate(); 2857 return jsgraph()->isolate();
2800 } 2858 }
2801 2859
2802 } // namespace compiler 2860 } // namespace compiler
2803 } // namespace internal 2861 } // namespace internal
2804 } // namespace v8 2862 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698