| 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 <limits> | 5 #include <limits> |
| 6 | 6 |
| 7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
| 8 #include "src/compiler/control-builders.h" | 8 #include "src/compiler/control-builders.h" |
| 9 #include "src/compiler/generic-node-inl.h" | 9 #include "src/compiler/generic-node-inl.h" |
| 10 #include "src/compiler/graph-visualizer.h" | 10 #include "src/compiler/graph-visualizer.h" |
| (...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 642 ret = | 642 ret = |
| 643 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); | 643 graph()->NewNode(common()->Return(), jsgraph.Constant(0), start, start); |
| 644 end = graph()->NewNode(common()->End(), ret); | 644 end = graph()->NewNode(common()->End(), ret); |
| 645 graph()->SetEnd(end); | 645 graph()->SetEnd(end); |
| 646 p0 = graph()->NewNode(common()->Parameter(0), start); | 646 p0 = graph()->NewNode(common()->Parameter(0), start); |
| 647 p1 = graph()->NewNode(common()->Parameter(1), start); | 647 p1 = graph()->NewNode(common()->Parameter(1), start); |
| 648 NodeProperties::SetBounds(p0, Bounds(p0_type)); | 648 NodeProperties::SetBounds(p0, Bounds(p0_type)); |
| 649 NodeProperties::SetBounds(p1, Bounds(p1_type)); | 649 NodeProperties::SetBounds(p1, Bounds(p1_type)); |
| 650 } | 650 } |
| 651 | 651 |
| 652 void CheckLoweringBinop(IrOpcode::Value expected, Operator* op) { | 652 void CheckLoweringBinop(IrOpcode::Value expected, const Operator* op) { |
| 653 Node* node = Return(graph()->NewNode(op, p0, p1)); | 653 Node* node = Return(graph()->NewNode(op, p0, p1)); |
| 654 Lower(); | 654 Lower(); |
| 655 CHECK_EQ(expected, node->opcode()); | 655 CHECK_EQ(expected, node->opcode()); |
| 656 } | 656 } |
| 657 | 657 |
| 658 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, Operator* op, | 658 void CheckLoweringTruncatedBinop(IrOpcode::Value expected, const Operator* op, |
| 659 Operator* trunc) { | 659 const Operator* trunc) { |
| 660 Node* node = graph()->NewNode(op, p0, p1); | 660 Node* node = graph()->NewNode(op, p0, p1); |
| 661 Return(graph()->NewNode(trunc, node)); | 661 Return(graph()->NewNode(trunc, node)); |
| 662 Lower(); | 662 Lower(); |
| 663 CHECK_EQ(expected, node->opcode()); | 663 CHECK_EQ(expected, node->opcode()); |
| 664 } | 664 } |
| 665 | 665 |
| 666 void Lower() { | 666 void Lower() { |
| 667 SimplifiedLowering lowering(&jsgraph); | 667 SimplifiedLowering lowering(&jsgraph); |
| 668 lowering.LowerAllNodes(); | 668 lowering.LowerAllNodes(); |
| 669 } | 669 } |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1101 kRepFloat64); | 1101 kRepFloat64); |
| 1102 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, kTypeInt32, kRepTagged); | 1102 CheckChangeInsertion(IrOpcode::kChangeInt32ToTagged, kTypeInt32, kRepTagged); |
| 1103 | 1103 |
| 1104 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, kTypeUint32, | 1104 CheckChangeInsertion(IrOpcode::kChangeUint32ToFloat64, kTypeUint32, |
| 1105 kRepFloat64); | 1105 kRepFloat64); |
| 1106 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, kTypeUint32, | 1106 CheckChangeInsertion(IrOpcode::kChangeUint32ToTagged, kTypeUint32, |
| 1107 kRepTagged); | 1107 kRepTagged); |
| 1108 } | 1108 } |
| 1109 | 1109 |
| 1110 | 1110 |
| 1111 static void CheckChangesAroundBinop(TestingGraph* t, Operator* op, | 1111 static void CheckChangesAroundBinop(TestingGraph* t, const Operator* op, |
| 1112 IrOpcode::Value input_change, | 1112 IrOpcode::Value input_change, |
| 1113 IrOpcode::Value output_change) { | 1113 IrOpcode::Value output_change) { |
| 1114 Node* binop = t->graph()->NewNode(op, t->p0, t->p1); | 1114 Node* binop = t->graph()->NewNode(op, t->p0, t->p1); |
| 1115 t->Return(binop); | 1115 t->Return(binop); |
| 1116 t->Lower(); | 1116 t->Lower(); |
| 1117 CHECK_EQ(input_change, binop->InputAt(0)->opcode()); | 1117 CHECK_EQ(input_change, binop->InputAt(0)->opcode()); |
| 1118 CHECK_EQ(input_change, binop->InputAt(1)->opcode()); | 1118 CHECK_EQ(input_change, binop->InputAt(1)->opcode()); |
| 1119 CHECK_EQ(t->p0, binop->InputAt(0)->InputAt(0)); | 1119 CHECK_EQ(t->p0, binop->InputAt(0)->InputAt(0)); |
| 1120 CHECK_EQ(t->p1, binop->InputAt(1)->InputAt(0)); | 1120 CHECK_EQ(t->p1, binop->InputAt(1)->InputAt(0)); |
| 1121 CHECK_EQ(output_change, t->ret->InputAt(0)->opcode()); | 1121 CHECK_EQ(output_change, t->ret->InputAt(0)->opcode()); |
| 1122 CHECK_EQ(binop, t->ret->InputAt(0)->InputAt(0)); | 1122 CHECK_EQ(binop, t->ret->InputAt(0)->InputAt(0)); |
| 1123 } | 1123 } |
| 1124 | 1124 |
| 1125 | 1125 |
| 1126 TEST(InsertChangesAroundInt32Binops) { | 1126 TEST(InsertChangesAroundInt32Binops) { |
| 1127 TestingGraph t(Type::Signed32(), Type::Signed32()); | 1127 TestingGraph t(Type::Signed32(), Type::Signed32()); |
| 1128 | 1128 |
| 1129 Operator* ops[] = {t.machine()->Int32Add(), t.machine()->Int32Sub(), | 1129 const Operator* ops[] = {t.machine()->Int32Add(), t.machine()->Int32Sub(), |
| 1130 t.machine()->Int32Mul(), t.machine()->Int32Div(), | 1130 t.machine()->Int32Mul(), t.machine()->Int32Div(), |
| 1131 t.machine()->Int32Mod(), t.machine()->Word32And(), | 1131 t.machine()->Int32Mod(), t.machine()->Word32And(), |
| 1132 t.machine()->Word32Or(), t.machine()->Word32Xor(), | 1132 t.machine()->Word32Or(), t.machine()->Word32Xor(), |
| 1133 t.machine()->Word32Shl(), t.machine()->Word32Sar()}; | 1133 t.machine()->Word32Shl(), t.machine()->Word32Sar()}; |
| 1134 | 1134 |
| 1135 for (size_t i = 0; i < arraysize(ops); i++) { | 1135 for (size_t i = 0; i < arraysize(ops); i++) { |
| 1136 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToInt32, | 1136 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToInt32, |
| 1137 IrOpcode::kChangeInt32ToTagged); | 1137 IrOpcode::kChangeInt32ToTagged); |
| 1138 } | 1138 } |
| 1139 } | 1139 } |
| 1140 | 1140 |
| 1141 | 1141 |
| 1142 TEST(InsertChangesAroundInt32Cmp) { | 1142 TEST(InsertChangesAroundInt32Cmp) { |
| 1143 TestingGraph t(Type::Signed32(), Type::Signed32()); | 1143 TestingGraph t(Type::Signed32(), Type::Signed32()); |
| 1144 | 1144 |
| 1145 Operator* ops[] = {t.machine()->Int32LessThan(), | 1145 const Operator* ops[] = {t.machine()->Int32LessThan(), |
| 1146 t.machine()->Int32LessThanOrEqual()}; | 1146 t.machine()->Int32LessThanOrEqual()}; |
| 1147 | 1147 |
| 1148 for (size_t i = 0; i < arraysize(ops); i++) { | 1148 for (size_t i = 0; i < arraysize(ops); i++) { |
| 1149 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToInt32, | 1149 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToInt32, |
| 1150 IrOpcode::kChangeBitToBool); | 1150 IrOpcode::kChangeBitToBool); |
| 1151 } | 1151 } |
| 1152 } | 1152 } |
| 1153 | 1153 |
| 1154 | 1154 |
| 1155 TEST(InsertChangesAroundUint32Cmp) { | 1155 TEST(InsertChangesAroundUint32Cmp) { |
| 1156 TestingGraph t(Type::Unsigned32(), Type::Unsigned32()); | 1156 TestingGraph t(Type::Unsigned32(), Type::Unsigned32()); |
| 1157 | 1157 |
| 1158 Operator* ops[] = {t.machine()->Uint32LessThan(), | 1158 const Operator* ops[] = {t.machine()->Uint32LessThan(), |
| 1159 t.machine()->Uint32LessThanOrEqual()}; | 1159 t.machine()->Uint32LessThanOrEqual()}; |
| 1160 | 1160 |
| 1161 for (size_t i = 0; i < arraysize(ops); i++) { | 1161 for (size_t i = 0; i < arraysize(ops); i++) { |
| 1162 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToUint32, | 1162 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToUint32, |
| 1163 IrOpcode::kChangeBitToBool); | 1163 IrOpcode::kChangeBitToBool); |
| 1164 } | 1164 } |
| 1165 } | 1165 } |
| 1166 | 1166 |
| 1167 | 1167 |
| 1168 TEST(InsertChangesAroundFloat64Binops) { | 1168 TEST(InsertChangesAroundFloat64Binops) { |
| 1169 TestingGraph t(Type::Number(), Type::Number()); | 1169 TestingGraph t(Type::Number(), Type::Number()); |
| 1170 | 1170 |
| 1171 Operator* ops[] = { | 1171 const Operator* ops[] = { |
| 1172 t.machine()->Float64Add(), t.machine()->Float64Sub(), | 1172 t.machine()->Float64Add(), t.machine()->Float64Sub(), |
| 1173 t.machine()->Float64Mul(), t.machine()->Float64Div(), | 1173 t.machine()->Float64Mul(), t.machine()->Float64Div(), |
| 1174 t.machine()->Float64Mod(), | 1174 t.machine()->Float64Mod(), |
| 1175 }; | 1175 }; |
| 1176 | 1176 |
| 1177 for (size_t i = 0; i < arraysize(ops); i++) { | 1177 for (size_t i = 0; i < arraysize(ops); i++) { |
| 1178 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToFloat64, | 1178 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToFloat64, |
| 1179 IrOpcode::kChangeFloat64ToTagged); | 1179 IrOpcode::kChangeFloat64ToTagged); |
| 1180 } | 1180 } |
| 1181 } | 1181 } |
| 1182 | 1182 |
| 1183 | 1183 |
| 1184 TEST(InsertChangesAroundFloat64Cmp) { | 1184 TEST(InsertChangesAroundFloat64Cmp) { |
| 1185 TestingGraph t(Type::Number(), Type::Number()); | 1185 TestingGraph t(Type::Number(), Type::Number()); |
| 1186 | 1186 |
| 1187 Operator* ops[] = {t.machine()->Float64Equal(), | 1187 const Operator* ops[] = {t.machine()->Float64Equal(), |
| 1188 t.machine()->Float64LessThan(), | 1188 t.machine()->Float64LessThan(), |
| 1189 t.machine()->Float64LessThanOrEqual()}; | 1189 t.machine()->Float64LessThanOrEqual()}; |
| 1190 | 1190 |
| 1191 for (size_t i = 0; i < arraysize(ops); i++) { | 1191 for (size_t i = 0; i < arraysize(ops); i++) { |
| 1192 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToFloat64, | 1192 CheckChangesAroundBinop(&t, ops[i], IrOpcode::kChangeTaggedToFloat64, |
| 1193 IrOpcode::kChangeBitToBool); | 1193 IrOpcode::kChangeBitToBool); |
| 1194 } | 1194 } |
| 1195 } | 1195 } |
| 1196 | 1196 |
| 1197 | 1197 |
| 1198 void CheckFieldAccessArithmetic(FieldAccess access, Node* load_or_store) { | 1198 void CheckFieldAccessArithmetic(FieldAccess access, Node* load_or_store) { |
| 1199 Int32Matcher index = Int32Matcher(load_or_store->InputAt(1)); | 1199 Int32Matcher index = Int32Matcher(load_or_store->InputAt(1)); |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1441 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, | 1441 Node* phi = t.graph()->NewNode(t.common()->Phi(kMachAnyTagged, 2), load0, |
| 1442 load1, t.start); | 1442 load1, t.start); |
| 1443 t.Return(t.Use(phi, kMachineTypes[i])); | 1443 t.Return(t.Use(phi, kMachineTypes[i])); |
| 1444 t.Lower(); | 1444 t.Lower(); |
| 1445 | 1445 |
| 1446 CHECK_EQ(IrOpcode::kPhi, phi->opcode()); | 1446 CHECK_EQ(IrOpcode::kPhi, phi->opcode()); |
| 1447 CHECK_EQ(RepresentationOf(kMachineTypes[i]), | 1447 CHECK_EQ(RepresentationOf(kMachineTypes[i]), |
| 1448 RepresentationOf(OpParameter<MachineType>(phi))); | 1448 RepresentationOf(OpParameter<MachineType>(phi))); |
| 1449 } | 1449 } |
| 1450 } | 1450 } |
| OLD | NEW |