| 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/common-operator.h" | 5 #include "src/compiler/common-operator.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/compiler/operator-properties-inl.h" | 9 #include "src/compiler/operator-properties-inl.h" |
| 10 #include "test/unittests/test-utils.h" | 10 #include "test/unittests/test-utils.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 CommonOperatorBuilder common2(zone()); | 68 CommonOperatorBuilder common2(zone()); |
| 69 EXPECT_EQ((common1.*sop.constructor)(), (common2.*sop.constructor)()); | 69 EXPECT_EQ((common1.*sop.constructor)(), (common2.*sop.constructor)()); |
| 70 } | 70 } |
| 71 | 71 |
| 72 | 72 |
| 73 TEST_P(CommonSharedOperatorTest, NumberOfInputsAndOutputs) { | 73 TEST_P(CommonSharedOperatorTest, NumberOfInputsAndOutputs) { |
| 74 CommonOperatorBuilder common(zone()); | 74 CommonOperatorBuilder common(zone()); |
| 75 const SharedOperator& sop = GetParam(); | 75 const SharedOperator& sop = GetParam(); |
| 76 const Operator* op = (common.*sop.constructor)(); | 76 const Operator* op = (common.*sop.constructor)(); |
| 77 | 77 |
| 78 EXPECT_EQ(sop.value_input_count, OperatorProperties::GetValueInputCount(op)); | 78 EXPECT_EQ(sop.value_input_count, op->ValueInputCount()); |
| 79 EXPECT_EQ(sop.effect_input_count, | 79 EXPECT_EQ(sop.effect_input_count, op->EffectInputCount()); |
| 80 OperatorProperties::GetEffectInputCount(op)); | 80 EXPECT_EQ(sop.control_input_count, op->ControlInputCount()); |
| 81 EXPECT_EQ(sop.control_input_count, | |
| 82 OperatorProperties::GetControlInputCount(op)); | |
| 83 EXPECT_EQ( | 81 EXPECT_EQ( |
| 84 sop.value_input_count + sop.effect_input_count + sop.control_input_count, | 82 sop.value_input_count + sop.effect_input_count + sop.control_input_count, |
| 85 OperatorProperties::GetTotalInputCount(op)); | 83 OperatorProperties::GetTotalInputCount(op)); |
| 86 | 84 |
| 87 EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); | 85 EXPECT_EQ(0, op->ValueOutputCount()); |
| 88 EXPECT_EQ(sop.effect_output_count, | 86 EXPECT_EQ(sop.effect_output_count, op->EffectOutputCount()); |
| 89 OperatorProperties::GetEffectOutputCount(op)); | 87 EXPECT_EQ(sop.control_output_count, op->ControlOutputCount()); |
| 90 EXPECT_EQ(sop.control_output_count, | |
| 91 OperatorProperties::GetControlOutputCount(op)); | |
| 92 } | 88 } |
| 93 | 89 |
| 94 | 90 |
| 95 TEST_P(CommonSharedOperatorTest, OpcodeIsCorrect) { | 91 TEST_P(CommonSharedOperatorTest, OpcodeIsCorrect) { |
| 96 CommonOperatorBuilder common(zone()); | 92 CommonOperatorBuilder common(zone()); |
| 97 const SharedOperator& sop = GetParam(); | 93 const SharedOperator& sop = GetParam(); |
| 98 const Operator* op = (common.*sop.constructor)(); | 94 const Operator* op = (common.*sop.constructor)(); |
| 99 EXPECT_EQ(sop.opcode, op->opcode()); | 95 EXPECT_EQ(sop.opcode, op->opcode()); |
| 100 } | 96 } |
| 101 | 97 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 | 158 |
| 163 } // namespace | 159 } // namespace |
| 164 | 160 |
| 165 | 161 |
| 166 TEST_F(CommonOperatorTest, Branch) { | 162 TEST_F(CommonOperatorTest, Branch) { |
| 167 TRACED_FOREACH(BranchHint, hint, kHints) { | 163 TRACED_FOREACH(BranchHint, hint, kHints) { |
| 168 const Operator* const op = common()->Branch(hint); | 164 const Operator* const op = common()->Branch(hint); |
| 169 EXPECT_EQ(IrOpcode::kBranch, op->opcode()); | 165 EXPECT_EQ(IrOpcode::kBranch, op->opcode()); |
| 170 EXPECT_EQ(Operator::kFoldable, op->properties()); | 166 EXPECT_EQ(Operator::kFoldable, op->properties()); |
| 171 EXPECT_EQ(hint, BranchHintOf(op)); | 167 EXPECT_EQ(hint, BranchHintOf(op)); |
| 172 EXPECT_EQ(1, OperatorProperties::GetValueInputCount(op)); | 168 EXPECT_EQ(1, op->ValueInputCount()); |
| 173 EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op)); | 169 EXPECT_EQ(0, op->EffectInputCount()); |
| 174 EXPECT_EQ(1, OperatorProperties::GetControlInputCount(op)); | 170 EXPECT_EQ(1, op->ControlInputCount()); |
| 175 EXPECT_EQ(2, OperatorProperties::GetTotalInputCount(op)); | 171 EXPECT_EQ(2, OperatorProperties::GetTotalInputCount(op)); |
| 176 EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); | 172 EXPECT_EQ(0, op->ValueOutputCount()); |
| 177 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 173 EXPECT_EQ(0, op->EffectOutputCount()); |
| 178 EXPECT_EQ(2, OperatorProperties::GetControlOutputCount(op)); | 174 EXPECT_EQ(2, op->ControlOutputCount()); |
| 179 } | 175 } |
| 180 } | 176 } |
| 181 | 177 |
| 182 | 178 |
| 183 TEST_F(CommonOperatorTest, Select) { | 179 TEST_F(CommonOperatorTest, Select) { |
| 184 static const MachineType kTypes[] = { | 180 static const MachineType kTypes[] = { |
| 185 kMachInt8, kMachUint8, kMachInt16, kMachUint16, | 181 kMachInt8, kMachUint8, kMachInt16, kMachUint16, |
| 186 kMachInt32, kMachUint32, kMachInt64, kMachUint64, | 182 kMachInt32, kMachUint32, kMachInt64, kMachUint64, |
| 187 kMachFloat32, kMachFloat64, kMachAnyTagged}; | 183 kMachFloat32, kMachFloat64, kMachAnyTagged}; |
| 188 TRACED_FOREACH(MachineType, type, kTypes) { | 184 TRACED_FOREACH(MachineType, type, kTypes) { |
| 189 TRACED_FOREACH(BranchHint, hint, kHints) { | 185 TRACED_FOREACH(BranchHint, hint, kHints) { |
| 190 const Operator* const op = common()->Select(type, hint); | 186 const Operator* const op = common()->Select(type, hint); |
| 191 EXPECT_EQ(IrOpcode::kSelect, op->opcode()); | 187 EXPECT_EQ(IrOpcode::kSelect, op->opcode()); |
| 192 EXPECT_EQ(Operator::kPure, op->properties()); | 188 EXPECT_EQ(Operator::kPure, op->properties()); |
| 193 EXPECT_EQ(type, SelectParametersOf(op).type()); | 189 EXPECT_EQ(type, SelectParametersOf(op).type()); |
| 194 EXPECT_EQ(hint, SelectParametersOf(op).hint()); | 190 EXPECT_EQ(hint, SelectParametersOf(op).hint()); |
| 195 EXPECT_EQ(3, OperatorProperties::GetValueInputCount(op)); | 191 EXPECT_EQ(3, op->ValueInputCount()); |
| 196 EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op)); | 192 EXPECT_EQ(0, op->EffectInputCount()); |
| 197 EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op)); | 193 EXPECT_EQ(0, op->ControlInputCount()); |
| 198 EXPECT_EQ(3, OperatorProperties::GetTotalInputCount(op)); | 194 EXPECT_EQ(3, OperatorProperties::GetTotalInputCount(op)); |
| 199 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | 195 EXPECT_EQ(1, op->ValueOutputCount()); |
| 200 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 196 EXPECT_EQ(0, op->EffectOutputCount()); |
| 201 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 197 EXPECT_EQ(0, op->ControlOutputCount()); |
| 202 } | 198 } |
| 203 } | 199 } |
| 204 } | 200 } |
| 205 | 201 |
| 206 | 202 |
| 207 TEST_F(CommonOperatorTest, Float32Constant) { | 203 TEST_F(CommonOperatorTest, Float32Constant) { |
| 208 TRACED_FOREACH(float, value, kFloatValues) { | 204 TRACED_FOREACH(float, value, kFloatValues) { |
| 209 const Operator* op = common()->Float32Constant(value); | 205 const Operator* op = common()->Float32Constant(value); |
| 210 EXPECT_PRED2(base::bit_equal_to<float>(), value, OpParameter<float>(op)); | 206 EXPECT_PRED2(base::bit_equal_to<float>(), value, OpParameter<float>(op)); |
| 211 EXPECT_EQ(0, OperatorProperties::GetValueInputCount(op)); | 207 EXPECT_EQ(0, op->ValueInputCount()); |
| 212 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); | 208 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); |
| 213 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 209 EXPECT_EQ(0, op->ControlOutputCount()); |
| 214 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 210 EXPECT_EQ(0, op->EffectOutputCount()); |
| 215 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | 211 EXPECT_EQ(1, op->ValueOutputCount()); |
| 216 } | 212 } |
| 217 TRACED_FOREACH(float, v1, kFloatValues) { | 213 TRACED_FOREACH(float, v1, kFloatValues) { |
| 218 TRACED_FOREACH(float, v2, kFloatValues) { | 214 TRACED_FOREACH(float, v2, kFloatValues) { |
| 219 const Operator* op1 = common()->Float32Constant(v1); | 215 const Operator* op1 = common()->Float32Constant(v1); |
| 220 const Operator* op2 = common()->Float32Constant(v2); | 216 const Operator* op2 = common()->Float32Constant(v2); |
| 221 EXPECT_EQ(bit_cast<uint32_t>(v1) == bit_cast<uint32_t>(v2), | 217 EXPECT_EQ(bit_cast<uint32_t>(v1) == bit_cast<uint32_t>(v2), |
| 222 op1->Equals(op2)); | 218 op1->Equals(op2)); |
| 223 } | 219 } |
| 224 } | 220 } |
| 225 } | 221 } |
| 226 | 222 |
| 227 | 223 |
| 228 TEST_F(CommonOperatorTest, Float64Constant) { | 224 TEST_F(CommonOperatorTest, Float64Constant) { |
| 229 TRACED_FOREACH(double, value, kFloatValues) { | 225 TRACED_FOREACH(double, value, kFloatValues) { |
| 230 const Operator* op = common()->Float64Constant(value); | 226 const Operator* op = common()->Float64Constant(value); |
| 231 EXPECT_PRED2(base::bit_equal_to<double>(), value, OpParameter<double>(op)); | 227 EXPECT_PRED2(base::bit_equal_to<double>(), value, OpParameter<double>(op)); |
| 232 EXPECT_EQ(0, OperatorProperties::GetValueInputCount(op)); | 228 EXPECT_EQ(0, op->ValueInputCount()); |
| 233 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); | 229 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); |
| 234 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 230 EXPECT_EQ(0, op->ControlOutputCount()); |
| 235 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 231 EXPECT_EQ(0, op->EffectOutputCount()); |
| 236 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | 232 EXPECT_EQ(1, op->ValueOutputCount()); |
| 237 } | 233 } |
| 238 TRACED_FOREACH(double, v1, kFloatValues) { | 234 TRACED_FOREACH(double, v1, kFloatValues) { |
| 239 TRACED_FOREACH(double, v2, kFloatValues) { | 235 TRACED_FOREACH(double, v2, kFloatValues) { |
| 240 const Operator* op1 = common()->Float64Constant(v1); | 236 const Operator* op1 = common()->Float64Constant(v1); |
| 241 const Operator* op2 = common()->Float64Constant(v2); | 237 const Operator* op2 = common()->Float64Constant(v2); |
| 242 EXPECT_EQ(bit_cast<uint64_t>(v1) == bit_cast<uint64_t>(v2), | 238 EXPECT_EQ(bit_cast<uint64_t>(v1) == bit_cast<uint64_t>(v2), |
| 243 op1->Equals(op2)); | 239 op1->Equals(op2)); |
| 244 } | 240 } |
| 245 } | 241 } |
| 246 } | 242 } |
| 247 | 243 |
| 248 | 244 |
| 249 TEST_F(CommonOperatorTest, NumberConstant) { | 245 TEST_F(CommonOperatorTest, NumberConstant) { |
| 250 TRACED_FOREACH(double, value, kFloatValues) { | 246 TRACED_FOREACH(double, value, kFloatValues) { |
| 251 const Operator* op = common()->NumberConstant(value); | 247 const Operator* op = common()->NumberConstant(value); |
| 252 EXPECT_PRED2(base::bit_equal_to<double>(), value, OpParameter<double>(op)); | 248 EXPECT_PRED2(base::bit_equal_to<double>(), value, OpParameter<double>(op)); |
| 253 EXPECT_EQ(0, OperatorProperties::GetValueInputCount(op)); | 249 EXPECT_EQ(0, op->ValueInputCount()); |
| 254 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); | 250 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); |
| 255 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 251 EXPECT_EQ(0, op->ControlOutputCount()); |
| 256 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 252 EXPECT_EQ(0, op->EffectOutputCount()); |
| 257 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | 253 EXPECT_EQ(1, op->ValueOutputCount()); |
| 258 } | 254 } |
| 259 TRACED_FOREACH(double, v1, kFloatValues) { | 255 TRACED_FOREACH(double, v1, kFloatValues) { |
| 260 TRACED_FOREACH(double, v2, kFloatValues) { | 256 TRACED_FOREACH(double, v2, kFloatValues) { |
| 261 const Operator* op1 = common()->NumberConstant(v1); | 257 const Operator* op1 = common()->NumberConstant(v1); |
| 262 const Operator* op2 = common()->NumberConstant(v2); | 258 const Operator* op2 = common()->NumberConstant(v2); |
| 263 EXPECT_EQ(bit_cast<uint64_t>(v1) == bit_cast<uint64_t>(v2), | 259 EXPECT_EQ(bit_cast<uint64_t>(v1) == bit_cast<uint64_t>(v2), |
| 264 op1->Equals(op2)); | 260 op1->Equals(op2)); |
| 265 } | 261 } |
| 266 } | 262 } |
| 267 } | 263 } |
| 268 | 264 |
| 269 | 265 |
| 270 TEST_F(CommonOperatorTest, ValueEffect) { | 266 TEST_F(CommonOperatorTest, ValueEffect) { |
| 271 TRACED_FOREACH(int, arguments, kArguments) { | 267 TRACED_FOREACH(int, arguments, kArguments) { |
| 272 const Operator* op = common()->ValueEffect(arguments); | 268 const Operator* op = common()->ValueEffect(arguments); |
| 273 EXPECT_EQ(arguments, OperatorProperties::GetValueInputCount(op)); | 269 EXPECT_EQ(arguments, op->ValueInputCount()); |
| 274 EXPECT_EQ(arguments, OperatorProperties::GetTotalInputCount(op)); | 270 EXPECT_EQ(arguments, OperatorProperties::GetTotalInputCount(op)); |
| 275 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 271 EXPECT_EQ(0, op->ControlOutputCount()); |
| 276 EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op)); | 272 EXPECT_EQ(1, op->EffectOutputCount()); |
| 277 EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); | 273 EXPECT_EQ(0, op->ValueOutputCount()); |
| 278 } | 274 } |
| 279 } | 275 } |
| 280 | 276 |
| 281 | 277 |
| 282 TEST_F(CommonOperatorTest, Finish) { | 278 TEST_F(CommonOperatorTest, Finish) { |
| 283 TRACED_FOREACH(int, arguments, kArguments) { | 279 TRACED_FOREACH(int, arguments, kArguments) { |
| 284 const Operator* op = common()->Finish(arguments); | 280 const Operator* op = common()->Finish(arguments); |
| 285 EXPECT_EQ(1, OperatorProperties::GetValueInputCount(op)); | 281 EXPECT_EQ(1, op->ValueInputCount()); |
| 286 EXPECT_EQ(arguments, OperatorProperties::GetEffectInputCount(op)); | 282 EXPECT_EQ(arguments, op->EffectInputCount()); |
| 287 EXPECT_EQ(arguments + 1, OperatorProperties::GetTotalInputCount(op)); | 283 EXPECT_EQ(arguments + 1, OperatorProperties::GetTotalInputCount(op)); |
| 288 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | 284 EXPECT_EQ(0, op->ControlOutputCount()); |
| 289 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | 285 EXPECT_EQ(0, op->EffectOutputCount()); |
| 290 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | 286 EXPECT_EQ(1, op->ValueOutputCount()); |
| 291 } | 287 } |
| 292 } | 288 } |
| 293 | 289 |
| 294 } // namespace compiler | 290 } // namespace compiler |
| 295 } // namespace internal | 291 } // namespace internal |
| 296 } // namespace v8 | 292 } // namespace v8 |
| OLD | NEW |