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

Unified Diff: src/compiler/js-builtin-reducer.cc

Issue 2657243002: [turbofan] Introduce dedicated StringIndexOf operator. (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « src/compiler/escape-analysis.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/js-builtin-reducer.cc
diff --git a/src/compiler/js-builtin-reducer.cc b/src/compiler/js-builtin-reducer.cc
index abd150af40717f53c3cda5db0ed4bd2c3fbafaa9..12906953d764dfeabca3731c510b9a3192a8bd3c 100644
--- a/src/compiler/js-builtin-reducer.cc
+++ b/src/compiler/js-builtin-reducer.cc
@@ -1725,39 +1725,29 @@ Reduction JSBuiltinReducer::ReduceStringCharCodeAt(Node* node) {
// ES6 String.prototype.indexOf(searchString [, position])
// #sec-string.prototype.indexof
Reduction JSBuiltinReducer::ReduceStringIndexOf(Node* node) {
- int arg_count = node->op()->ValueInputCount();
- if (arg_count != 3 && arg_count != 4) return NoChange();
- Node* receiver;
- if (!(receiver = GetStringWitness(node))) return NoChange();
- Node* search_string = NodeProperties::GetValueInput(node, 2);
- if (!NodeProperties::GetType(search_string)->Is(Type::String())) {
- return NoChange();
+ // We need at least target, receiver and search_string parameters.
+ if (node->op()->ValueInputCount() >= 3) {
+ Node* search_string = NodeProperties::GetValueInput(node, 2);
+ Type* search_string_type = NodeProperties::GetType(search_string);
+ Node* position = (node->op()->ValueInputCount() >= 4)
+ ? NodeProperties::GetValueInput(node, 3)
+ : jsgraph()->ZeroConstant();
+ Type* position_type = NodeProperties::GetType(position);
+
+ if (search_string_type->Is(Type::String()) &&
+ position_type->Is(Type::SignedSmall())) {
+ if (Node* receiver = GetStringWitness(node)) {
+ RelaxEffectsAndControls(node);
+ node->ReplaceInput(0, receiver);
+ node->ReplaceInput(1, search_string);
+ node->ReplaceInput(2, position);
+ node->TrimInputCount(3);
+ NodeProperties::ChangeOp(node, simplified()->StringIndexOf());
+ return Changed(node);
+ }
+ }
}
- // Replace the current JSFunctionCall to String.prototype.indexOf with a
- // simple Call to the unchecked StringIndexOf builtin.
- Callable callable = CodeFactory::StringIndexOf(isolate());
- const CallInterfaceDescriptor& descriptor = callable.descriptor();
- CallDescriptor* desc =
- Linkage::GetStubCallDescriptor(isolate(), graph()->zone(), descriptor,
- descriptor.GetStackParameterCount(),
- CallDescriptor::kNoFlags, Operator::kPure);
- Node* stub_code = jsgraph()->HeapConstant(callable.code());
- // The Call Operator doesn't require an effect nor a control input.
- RelaxEffectsAndControls(node);
- // Remove framestate since StringIndexOf cannot deopt.
- node->RemoveInput(arg_count + 1);
- // Remove the control input.
- node->RemoveInput(arg_count + 2);
- // Replace the JSFunction from the JSFunctionCall node with the CodeStub.
- node->ReplaceInput(0, stub_code);
- if (arg_count == 3) {
- // Insert the missing position argument.
- node->InsertInput(graph()->zone(), 3, jsgraph()->ZeroConstant());
- }
- const Operator* op = common()->Call(desc);
- node->TrimInputCount(op->ValueInputCount());
- NodeProperties::ChangeOp(node, op);
- return Changed(node);
+ return NoChange();
}
Reduction JSBuiltinReducer::ReduceStringIterator(Node* node) {
« no previous file with comments | « src/compiler/escape-analysis.cc ('k') | src/compiler/opcodes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698