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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2658253002: [csa] Add IsIntPtrOrSmiConstantZero to detect and optimize constant zero values (Closed)
Patch Set: 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
« no previous file with comments | « src/code-stub-assembler.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" 4 #include "src/code-stub-assembler.h"
5 #include "src/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/frames-inl.h" 6 #include "src/frames-inl.h"
7 #include "src/frames.h" 7 #include "src/frames.h"
8 8
9 namespace v8 { 9 namespace v8 {
10 namespace internal { 10 namespace internal {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 164
165 Node* CodeStubAssembler::IntPtrOrSmiConstant(int value, ParameterMode mode) { 165 Node* CodeStubAssembler::IntPtrOrSmiConstant(int value, ParameterMode mode) {
166 if (mode == SMI_PARAMETERS) { 166 if (mode == SMI_PARAMETERS) {
167 return SmiConstant(Smi::FromInt(value)); 167 return SmiConstant(Smi::FromInt(value));
168 } else { 168 } else {
169 DCHECK_EQ(INTPTR_PARAMETERS, mode); 169 DCHECK_EQ(INTPTR_PARAMETERS, mode);
170 return IntPtrConstant(value); 170 return IntPtrConstant(value);
171 } 171 }
172 } 172 }
173 173
174 bool CodeStubAssembler::IsIntPtrOrSmiConstantZero(Node* test) {
175 int32_t constant_test;
176 Smi* smi_test;
177 if ((ToInt32Constant(test, constant_test) && constant_test == 0) ||
178 (ToSmiConstant(test, smi_test) && smi_test->value() == 0)) {
179 return true;
180 }
181 return false;
182 }
183
174 Node* CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32(Node* value) { 184 Node* CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32(Node* value) {
175 Comment("IntPtrRoundUpToPowerOfTwo32"); 185 Comment("IntPtrRoundUpToPowerOfTwo32");
176 CSA_ASSERT(this, UintPtrLessThanOrEqual(value, IntPtrConstant(0x80000000u))); 186 CSA_ASSERT(this, UintPtrLessThanOrEqual(value, IntPtrConstant(0x80000000u)));
177 value = IntPtrSub(value, IntPtrConstant(1)); 187 value = IntPtrSub(value, IntPtrConstant(1));
178 for (int i = 1; i <= 16; i *= 2) { 188 for (int i = 1; i <= 16; i *= 2) {
179 value = WordOr(value, WordShr(value, IntPtrConstant(i))); 189 value = WordOr(value, WordShr(value, IntPtrConstant(i)));
180 } 190 }
181 return IntPtrAdd(value, IntPtrConstant(1)); 191 return IntPtrAdd(value, IntPtrConstant(1));
182 } 192 }
183 193
(...skipping 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after
2055 InitializeAllocationMemento(array, JSArray::kSize, allocation_site); 2065 InitializeAllocationMemento(array, JSArray::kSize, allocation_site);
2056 } 2066 }
2057 return array; 2067 return array;
2058 } 2068 }
2059 2069
2060 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map, 2070 Node* CodeStubAssembler::AllocateJSArray(ElementsKind kind, Node* array_map,
2061 Node* capacity, Node* length, 2071 Node* capacity, Node* length,
2062 Node* allocation_site, 2072 Node* allocation_site,
2063 ParameterMode capacity_mode) { 2073 ParameterMode capacity_mode) {
2064 Node *array = nullptr, *elements = nullptr; 2074 Node *array = nullptr, *elements = nullptr;
2065 int32_t constant_capacity; 2075 if (IsIntPtrOrSmiConstantZero(capacity)) {
2066 if (ToInt32Constant(capacity, constant_capacity) && constant_capacity == 0) {
2067 // Array is empty. Use the shared empty fixed array instead of allocating a 2076 // Array is empty. Use the shared empty fixed array instead of allocating a
2068 // new one. 2077 // new one.
2069 array = AllocateUninitializedJSArrayWithoutElements(kind, array_map, length, 2078 array = AllocateUninitializedJSArrayWithoutElements(kind, array_map, length,
2070 nullptr); 2079 nullptr);
2071 StoreObjectFieldRoot(array, JSArray::kElementsOffset, 2080 StoreObjectFieldRoot(array, JSArray::kElementsOffset,
2072 Heap::kEmptyFixedArrayRootIndex); 2081 Heap::kEmptyFixedArrayRootIndex);
2073 } else { 2082 } else {
2074 // Allocate both array and elements object, and initialize the JSArray. 2083 // Allocate both array and elements object, and initialize the JSArray.
2075 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements( 2084 std::tie(array, elements) = AllocateUninitializedJSArrayWithElements(
2076 kind, array_map, length, allocation_site, capacity, capacity_mode); 2085 kind, array_map, length, allocation_site, capacity, capacity_mode);
(...skipping 6311 matching lines...) Expand 10 before | Expand all | Expand 10 after
8388 formatted.c_str(), TENURED); 8397 formatted.c_str(), TENURED);
8389 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), 8398 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(),
8390 HeapConstant(string)); 8399 HeapConstant(string));
8391 } 8400 }
8392 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), tagged_value); 8401 CallRuntime(Runtime::kGlobalPrint, NoContextConstant(), tagged_value);
8393 #endif 8402 #endif
8394 } 8403 }
8395 8404
8396 } // namespace internal 8405 } // namespace internal
8397 } // namespace v8 8406 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698