| 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/v8.h" | 5 #include "src/v8.h" |
| 6 #include "test/cctest/cctest.h" | 6 #include "test/cctest/cctest.h" |
| 7 | 7 |
| 8 #include "src/compiler/graph-inl.h" | 8 #include "src/compiler/graph-inl.h" |
| 9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" |
| 10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
| (...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 540 | 540 |
| 541 TEST(JSToBoolean_replacement) { | 541 TEST(JSToBoolean_replacement) { |
| 542 JSTypedLoweringTester R; | 542 JSTypedLoweringTester R; |
| 543 | 543 |
| 544 Type* types[] = {Type::Null(), Type::Undefined(), | 544 Type* types[] = {Type::Null(), Type::Undefined(), |
| 545 Type::Boolean(), Type::OrderedNumber(), | 545 Type::Boolean(), Type::OrderedNumber(), |
| 546 Type::DetectableObject(), Type::Undetectable()}; | 546 Type::DetectableObject(), Type::Undetectable()}; |
| 547 | 547 |
| 548 for (size_t i = 0; i < arraysize(types); i++) { | 548 for (size_t i = 0; i < arraysize(types); i++) { |
| 549 Node* n = R.Parameter(types[i]); | 549 Node* n = R.Parameter(types[i]); |
| 550 Node* c = R.graph.NewNode(R.javascript.ToBoolean(), n, R.context(), | 550 Node* c = R.graph.NewNode(R.javascript.ToBoolean(), n, R.context()); |
| 551 R.start(), R.start()); | |
| 552 Node* effect_use = R.UseForEffect(c); | |
| 553 Node* add = R.graph.NewNode(R.simplified.ReferenceEqual(Type::Any()), n, c); | |
| 554 | |
| 555 R.CheckEffectInput(c, effect_use); | |
| 556 Node* r = R.reduce(c); | 551 Node* r = R.reduce(c); |
| 557 | 552 |
| 558 if (types[i]->Is(Type::Boolean())) { | 553 if (types[i]->Is(Type::Boolean())) { |
| 559 CHECK_EQ(n, r); | 554 CHECK_EQ(n, r); |
| 560 } else if (types[i]->Is(Type::OrderedNumber())) { | 555 } else if (types[i]->Is(Type::OrderedNumber())) { |
| 561 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); | 556 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); |
| 562 } else { | 557 } else { |
| 563 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); | 558 CHECK_EQ(IrOpcode::kHeapConstant, r->opcode()); |
| 564 } | 559 } |
| 565 | |
| 566 CHECK_EQ(n, add->InputAt(0)); | |
| 567 CHECK_EQ(r, add->InputAt(1)); | |
| 568 R.CheckEffectInput(R.start(), effect_use); | |
| 569 } | 560 } |
| 570 } | 561 } |
| 571 | 562 |
| 572 | 563 |
| 573 TEST(JSToString1) { | 564 TEST(JSToString1) { |
| 574 JSTypedLoweringTester R; | 565 JSTypedLoweringTester R; |
| 575 | 566 |
| 576 for (size_t i = 0; i < arraysize(kStringTypes); i++) { | 567 for (size_t i = 0; i < arraysize(kStringTypes); i++) { |
| 577 Node* r = R.ReduceUnop(R.javascript.ToString(), kStringTypes[i]); | 568 Node* r = R.ReduceUnop(R.javascript.ToString(), kStringTypes[i]); |
| 578 CHECK_EQ(IrOpcode::kParameter, r->opcode()); | 569 CHECK_EQ(IrOpcode::kParameter, r->opcode()); |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 750 } | 741 } |
| 751 } | 742 } |
| 752 | 743 |
| 753 | 744 |
| 754 TEST(UnaryNot) { | 745 TEST(UnaryNot) { |
| 755 JSTypedLoweringTester R; | 746 JSTypedLoweringTester R; |
| 756 const Operator* opnot = R.javascript.UnaryNot(); | 747 const Operator* opnot = R.javascript.UnaryNot(); |
| 757 | 748 |
| 758 for (size_t i = 0; i < arraysize(kJSTypes); i++) { | 749 for (size_t i = 0; i < arraysize(kJSTypes); i++) { |
| 759 Node* orig = R.Unop(opnot, R.Parameter(kJSTypes[i])); | 750 Node* orig = R.Unop(opnot, R.Parameter(kJSTypes[i])); |
| 760 Node* use = R.graph.NewNode(R.common.Return(), orig); | |
| 761 Node* r = R.reduce(orig); | 751 Node* r = R.reduce(orig); |
| 762 // TODO(titzer): test will break if/when js-typed-lowering constant folds. | |
| 763 CHECK_EQ(IrOpcode::kBooleanNot, use->InputAt(0)->opcode()); | |
| 764 | 752 |
| 765 if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) { | 753 if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) { |
| 766 // The original node was turned into a ToBoolean. | 754 // The original node was turned into a ToBoolean. |
| 767 CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode()); | 755 CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode()); |
| 768 } else { | 756 } else if (r->opcode() != IrOpcode::kHeapConstant) { |
| 769 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); | 757 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); |
| 770 } | 758 } |
| 771 } | 759 } |
| 772 } | 760 } |
| 773 | 761 |
| 774 | 762 |
| 775 TEST(RemoveToNumberEffects) { | 763 TEST(RemoveToNumberEffects) { |
| 776 FLAG_turbo_deoptimization = true; | 764 FLAG_turbo_deoptimization = true; |
| 777 | 765 |
| 778 JSTypedLoweringTester R; | 766 JSTypedLoweringTester R; |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1179 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); | 1167 Node* ii1 = B.CheckConverted(IrOpcode::kJSToNumber, i1->InputAt(0), true); |
| 1180 | 1168 |
| 1181 CHECK_EQ(B.p0, ii0->InputAt(0)); | 1169 CHECK_EQ(B.p0, ii0->InputAt(0)); |
| 1182 CHECK_EQ(B.p1, ii1->InputAt(0)); | 1170 CHECK_EQ(B.p1, ii1->InputAt(0)); |
| 1183 | 1171 |
| 1184 B.CheckEffectOrdering(ii0, ii1); | 1172 B.CheckEffectOrdering(ii0, ii1); |
| 1185 } | 1173 } |
| 1186 } | 1174 } |
| 1187 | 1175 |
| 1188 | 1176 |
| 1189 TEST(UnaryNotEffects) { | |
| 1190 JSTypedLoweringTester R; | |
| 1191 const Operator* opnot = R.javascript.UnaryNot(); | |
| 1192 | |
| 1193 for (size_t i = 0; i < arraysize(kJSTypes); i++) { | |
| 1194 Node* p0 = R.Parameter(kJSTypes[i], 0); | |
| 1195 Node* orig = R.Unop(opnot, p0); | |
| 1196 Node* effect_use = R.UseForEffect(orig); | |
| 1197 Node* value_use = R.graph.NewNode(R.common.Return(), orig); | |
| 1198 Node* r = R.reduce(orig); | |
| 1199 // TODO(titzer): test will break if/when js-typed-lowering constant folds. | |
| 1200 CHECK_EQ(IrOpcode::kBooleanNot, value_use->InputAt(0)->opcode()); | |
| 1201 | |
| 1202 if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) { | |
| 1203 // The original node was turned into a ToBoolean, which has an effect. | |
| 1204 CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode()); | |
| 1205 R.CheckEffectInput(R.start(), orig); | |
| 1206 R.CheckEffectInput(orig, effect_use); | |
| 1207 } else { | |
| 1208 // effect should have been removed from this node. | |
| 1209 CHECK_EQ(IrOpcode::kBooleanNot, r->opcode()); | |
| 1210 R.CheckEffectInput(R.start(), effect_use); | |
| 1211 } | |
| 1212 } | |
| 1213 } | |
| 1214 | |
| 1215 | |
| 1216 TEST(Int32AddNarrowing) { | 1177 TEST(Int32AddNarrowing) { |
| 1217 { | 1178 { |
| 1218 JSBitwiseTypedLoweringTester R; | 1179 JSBitwiseTypedLoweringTester R; |
| 1219 | 1180 |
| 1220 for (int o = 0; o < R.kNumberOps; o += 2) { | 1181 for (int o = 0; o < R.kNumberOps; o += 2) { |
| 1221 for (size_t i = 0; i < arraysize(kInt32Types); i++) { | 1182 for (size_t i = 0; i < arraysize(kInt32Types); i++) { |
| 1222 Node* n0 = R.Parameter(kInt32Types[i]); | 1183 Node* n0 = R.Parameter(kInt32Types[i]); |
| 1223 for (size_t j = 0; j < arraysize(kInt32Types); j++) { | 1184 for (size_t j = 0; j < arraysize(kInt32Types); j++) { |
| 1224 Node* n1 = R.Parameter(kInt32Types[j]); | 1185 Node* n1 = R.Parameter(kInt32Types[j]); |
| 1225 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); | 1186 Node* one = R.graph.NewNode(R.common.NumberConstant(1)); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1333 CHECK_EQ(p1, r->InputAt(0)); | 1294 CHECK_EQ(p1, r->InputAt(0)); |
| 1334 CHECK_EQ(p0, r->InputAt(1)); | 1295 CHECK_EQ(p0, r->InputAt(1)); |
| 1335 } else { | 1296 } else { |
| 1336 CHECK_EQ(p0, r->InputAt(0)); | 1297 CHECK_EQ(p0, r->InputAt(0)); |
| 1337 CHECK_EQ(p1, r->InputAt(1)); | 1298 CHECK_EQ(p1, r->InputAt(1)); |
| 1338 } | 1299 } |
| 1339 } | 1300 } |
| 1340 } | 1301 } |
| 1341 } | 1302 } |
| 1342 } | 1303 } |
| OLD | NEW |