OLD | NEW |
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/compiler/js-typed-lowering.h" | 5 #include "src/compiler/js-typed-lowering.h" |
6 | 6 |
7 #include "src/ast/modules.h" | 7 #include "src/ast/modules.h" |
8 #include "src/builtins/builtins-utils.h" | 8 #include "src/builtins/builtins-utils.h" |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/compilation-dependencies.h" | 10 #include "src/compilation-dependencies.h" |
(...skipping 970 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
981 r.CheckInputsToString(); | 981 r.CheckInputsToString(); |
982 return r.ChangeToPureOperator(simplified()->StringEqual(), invert); | 982 return r.ChangeToPureOperator(simplified()->StringEqual(), invert); |
983 } | 983 } |
984 return NoChange(); | 984 return NoChange(); |
985 } | 985 } |
986 | 986 |
987 Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) { | 987 Reduction JSTypedLowering::ReduceJSStrictEqual(Node* node, bool invert) { |
988 JSBinopReduction r(this, node); | 988 JSBinopReduction r(this, node); |
989 if (r.left() == r.right()) { | 989 if (r.left() == r.right()) { |
990 // x === x is always true if x != NaN | 990 // x === x is always true if x != NaN |
991 if (!r.left_type()->Maybe(Type::NaN())) { | 991 Node* replacement = graph()->NewNode(simplified()->ObjectIsNaN(), r.left()); |
992 Node* replacement = jsgraph()->BooleanConstant(!invert); | 992 if (!invert) { |
993 ReplaceWithValue(node, replacement); | 993 replacement = graph()->NewNode(simplified()->BooleanNot(), replacement); |
994 return Replace(replacement); | |
995 } | 994 } |
| 995 ReplaceWithValue(node, replacement); |
| 996 return Replace(replacement); |
996 } | 997 } |
997 if (r.OneInputCannotBe(Type::NumberOrString())) { | 998 if (r.OneInputCannotBe(Type::NumberOrString())) { |
998 // For values with canonical representation (i.e. neither String, nor | 999 // For values with canonical representation (i.e. neither String, nor |
999 // Number) an empty type intersection means the values cannot be strictly | 1000 // Number) an empty type intersection means the values cannot be strictly |
1000 // equal. | 1001 // equal. |
1001 if (!r.left_type()->Maybe(r.right_type())) { | 1002 if (!r.left_type()->Maybe(r.right_type())) { |
1002 Node* replacement = jsgraph()->BooleanConstant(invert); | 1003 Node* replacement = jsgraph()->BooleanConstant(invert); |
1003 ReplaceWithValue(node, replacement); | 1004 ReplaceWithValue(node, replacement); |
1004 return Replace(replacement); | 1005 return Replace(replacement); |
1005 } | 1006 } |
(...skipping 1476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2482 } | 2483 } |
2483 | 2484 |
2484 | 2485 |
2485 CompilationDependencies* JSTypedLowering::dependencies() const { | 2486 CompilationDependencies* JSTypedLowering::dependencies() const { |
2486 return dependencies_; | 2487 return dependencies_; |
2487 } | 2488 } |
2488 | 2489 |
2489 } // namespace compiler | 2490 } // namespace compiler |
2490 } // namespace internal | 2491 } // namespace internal |
2491 } // namespace v8 | 2492 } // namespace v8 |
OLD | NEW |