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

Side by Side Diff: src/compiler/js-typed-lowering.cc

Issue 1417503008: [turbofan] Use CompareNilIC for abstract equality with null/undefined. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 1 month 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-stubs-hydrogen.cc ('k') | src/full-codegen/arm/full-codegen-arm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/compiler/access-builder.h" 6 #include "src/compiler/access-builder.h"
7 #include "src/compiler/js-graph.h" 7 #include "src/compiler/js-graph.h"
8 #include "src/compiler/js-typed-lowering.h" 8 #include "src/compiler/js-typed-lowering.h"
9 #include "src/compiler/linkage.h" 9 #include "src/compiler/linkage.h"
10 #include "src/compiler/node-matchers.h" 10 #include "src/compiler/node-matchers.h"
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 215 }
216 return lowering_->Changed(node_); 216 return lowering_->Changed(node_);
217 } 217 }
218 218
219 Reduction ChangeToPureOperator(const Operator* op, Type* type) { 219 Reduction ChangeToPureOperator(const Operator* op, Type* type) {
220 return ChangeToPureOperator(op, false, type); 220 return ChangeToPureOperator(op, false, type);
221 } 221 }
222 222
223 bool IsStrong() { return is_strong(OpParameter<LanguageMode>(node_)); } 223 bool IsStrong() { return is_strong(OpParameter<LanguageMode>(node_)); }
224 224
225 bool OneInputIs(Type* t) { return left_type()->Is(t) || right_type()->Is(t); } 225 bool LeftInputIs(Type* t) { return left_type()->Is(t); }
226 226
227 bool BothInputsAre(Type* t) { 227 bool RightInputIs(Type* t) { return right_type()->Is(t); }
228 return left_type()->Is(t) && right_type()->Is(t); 228
229 } 229 bool OneInputIs(Type* t) { return LeftInputIs(t) || RightInputIs(t); }
230
231 bool BothInputsAre(Type* t) { return LeftInputIs(t) && RightInputIs(t); }
230 232
231 bool OneInputCannotBe(Type* t) { 233 bool OneInputCannotBe(Type* t) {
232 return !left_type()->Maybe(t) || !right_type()->Maybe(t); 234 return !left_type()->Maybe(t) || !right_type()->Maybe(t);
233 } 235 }
234 236
235 bool NeitherInputCanBe(Type* t) { 237 bool NeitherInputCanBe(Type* t) {
236 return !left_type()->Maybe(t) && !right_type()->Maybe(t); 238 return !left_type()->Maybe(t) && !right_type()->Maybe(t);
237 } 239 }
238 240
239 Node* effect() { return NodeProperties::GetEffectInput(node_); } 241 Node* effect() { return NodeProperties::GetEffectInput(node_); }
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 invert); 599 invert);
598 } 600 }
599 if (r.BothInputsAre(Type::Boolean())) { 601 if (r.BothInputsAre(Type::Boolean())) {
600 return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Boolean()), 602 return r.ChangeToPureOperator(simplified()->ReferenceEqual(Type::Boolean()),
601 invert); 603 invert);
602 } 604 }
603 if (r.BothInputsAre(Type::Receiver())) { 605 if (r.BothInputsAre(Type::Receiver())) {
604 return r.ChangeToPureOperator( 606 return r.ChangeToPureOperator(
605 simplified()->ReferenceEqual(Type::Receiver()), invert); 607 simplified()->ReferenceEqual(Type::Receiver()), invert);
606 } 608 }
607 // TODO(turbofan): js-typed-lowering of Equal(undefined) 609 if (r.OneInputIs(Type::NullOrUndefined())) {
608 // TODO(turbofan): js-typed-lowering of Equal(null) 610 Callable const callable = CodeFactory::CompareNilIC(isolate(), kNullValue);
611 CallDescriptor const* const desc = Linkage::GetStubCallDescriptor(
612 isolate(), graph()->zone(), callable.descriptor(), 0,
613 CallDescriptor::kNeedsFrameState, node->op()->properties());
614 node->RemoveInput(r.LeftInputIs(Type::NullOrUndefined()) ? 0 : 1);
615 node->InsertInput(graph()->zone(), 0,
616 jsgraph()->HeapConstant(callable.code()));
617 NodeProperties::ChangeOp(node, common()->Call(desc));
618 if (invert) {
619 // Insert an boolean not to invert the value.
620 Node* value = graph()->NewNode(simplified()->BooleanNot(), node);
621 node->ReplaceUses(value);
622 // Note: ReplaceUses() smashes all uses, so smash it back here.
623 value->ReplaceInput(0, node);
Jarin 2015/10/27 11:00:00 This whole input/use massaging business is really
624 return Replace(value);
625 }
626 return Changed(node);
627 }
609 return NoChange(); 628 return NoChange();
610 } 629 }
611 630
612 631
613 Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) { 632 Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) {
614 JSBinopReduction r(this, node); 633 JSBinopReduction r(this, node);
615 if (r.left() == r.right()) { 634 if (r.left() == r.right()) {
616 // x === x is always true if x != NaN 635 // x === x is always true if x != NaN
617 if (!r.left_type()->Maybe(Type::NaN())) { 636 if (!r.left_type()->Maybe(Type::NaN())) {
618 Node* replacement = jsgraph()->BooleanConstant(!invert); 637 Node* replacement = jsgraph()->BooleanConstant(!invert);
(...skipping 1302 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 } 1940 }
1922 1941
1923 1942
1924 MachineOperatorBuilder* JSTypedLowering::machine() const { 1943 MachineOperatorBuilder* JSTypedLowering::machine() const {
1925 return jsgraph()->machine(); 1944 return jsgraph()->machine();
1926 } 1945 }
1927 1946
1928 } // namespace compiler 1947 } // namespace compiler
1929 } // namespace internal 1948 } // namespace internal
1930 } // namespace v8 1949 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/full-codegen/arm/full-codegen-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698