| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "src/compiler/common-operator.h" | |
| 6 | |
| 7 #include <limits> | |
| 8 | |
| 9 #include "src/compiler/operator-properties-inl.h" | |
| 10 #include "src/test/test-utils.h" | |
| 11 | |
| 12 namespace v8 { | |
| 13 namespace internal { | |
| 14 namespace compiler { | |
| 15 | |
| 16 | |
| 17 // ----------------------------------------------------------------------------- | |
| 18 // Shared operators. | |
| 19 | |
| 20 | |
| 21 namespace { | |
| 22 | |
| 23 struct SharedOperator { | |
| 24 const Operator* (CommonOperatorBuilder::*constructor)(); | |
| 25 IrOpcode::Value opcode; | |
| 26 Operator::Properties properties; | |
| 27 int value_input_count; | |
| 28 int effect_input_count; | |
| 29 int control_input_count; | |
| 30 int effect_output_count; | |
| 31 int control_output_count; | |
| 32 }; | |
| 33 | |
| 34 | |
| 35 std::ostream& operator<<(std::ostream& os, const SharedOperator& fop) { | |
| 36 return os << IrOpcode::Mnemonic(fop.opcode); | |
| 37 } | |
| 38 | |
| 39 | |
| 40 const SharedOperator kSharedOperators[] = { | |
| 41 #define SHARED(Name, properties, value_input_count, effect_input_count, \ | |
| 42 control_input_count, effect_output_count, control_output_count) \ | |
| 43 { \ | |
| 44 &CommonOperatorBuilder::Name, IrOpcode::k##Name, properties, \ | |
| 45 value_input_count, effect_input_count, control_input_count, \ | |
| 46 effect_output_count, control_output_count \ | |
| 47 } | |
| 48 SHARED(Dead, Operator::kFoldable, 0, 0, 0, 0, 1), | |
| 49 SHARED(End, Operator::kFoldable, 0, 0, 1, 0, 0), | |
| 50 SHARED(Branch, Operator::kFoldable, 1, 0, 1, 0, 2), | |
| 51 SHARED(IfTrue, Operator::kFoldable, 0, 0, 1, 0, 1), | |
| 52 SHARED(IfFalse, Operator::kFoldable, 0, 0, 1, 0, 1), | |
| 53 SHARED(Throw, Operator::kFoldable, 1, 0, 1, 0, 1), | |
| 54 SHARED(Return, Operator::kNoProperties, 1, 1, 1, 1, 1), | |
| 55 SHARED(ControlEffect, Operator::kPure, 0, 0, 1, 1, 0) | |
| 56 #undef SHARED | |
| 57 }; | |
| 58 | |
| 59 | |
| 60 class CommonSharedOperatorTest | |
| 61 : public TestWithZone, | |
| 62 public ::testing::WithParamInterface<SharedOperator> {}; | |
| 63 | |
| 64 } // namespace | |
| 65 | |
| 66 | |
| 67 TEST_P(CommonSharedOperatorTest, InstancesAreGloballyShared) { | |
| 68 const SharedOperator& sop = GetParam(); | |
| 69 CommonOperatorBuilder common1(zone()); | |
| 70 CommonOperatorBuilder common2(zone()); | |
| 71 EXPECT_EQ((common1.*sop.constructor)(), (common2.*sop.constructor)()); | |
| 72 } | |
| 73 | |
| 74 | |
| 75 TEST_P(CommonSharedOperatorTest, NumberOfInputsAndOutputs) { | |
| 76 CommonOperatorBuilder common(zone()); | |
| 77 const SharedOperator& sop = GetParam(); | |
| 78 const Operator* op = (common.*sop.constructor)(); | |
| 79 | |
| 80 EXPECT_EQ(sop.value_input_count, OperatorProperties::GetValueInputCount(op)); | |
| 81 EXPECT_EQ(sop.effect_input_count, | |
| 82 OperatorProperties::GetEffectInputCount(op)); | |
| 83 EXPECT_EQ(sop.control_input_count, | |
| 84 OperatorProperties::GetControlInputCount(op)); | |
| 85 EXPECT_EQ( | |
| 86 sop.value_input_count + sop.effect_input_count + sop.control_input_count, | |
| 87 OperatorProperties::GetTotalInputCount(op)); | |
| 88 | |
| 89 EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); | |
| 90 EXPECT_EQ(sop.effect_output_count, | |
| 91 OperatorProperties::GetEffectOutputCount(op)); | |
| 92 EXPECT_EQ(sop.control_output_count, | |
| 93 OperatorProperties::GetControlOutputCount(op)); | |
| 94 } | |
| 95 | |
| 96 | |
| 97 TEST_P(CommonSharedOperatorTest, OpcodeIsCorrect) { | |
| 98 CommonOperatorBuilder common(zone()); | |
| 99 const SharedOperator& sop = GetParam(); | |
| 100 const Operator* op = (common.*sop.constructor)(); | |
| 101 EXPECT_EQ(sop.opcode, op->opcode()); | |
| 102 } | |
| 103 | |
| 104 | |
| 105 TEST_P(CommonSharedOperatorTest, Properties) { | |
| 106 CommonOperatorBuilder common(zone()); | |
| 107 const SharedOperator& sop = GetParam(); | |
| 108 const Operator* op = (common.*sop.constructor)(); | |
| 109 EXPECT_EQ(sop.properties, op->properties()); | |
| 110 } | |
| 111 | |
| 112 | |
| 113 INSTANTIATE_TEST_CASE_P(CommonOperatorTest, CommonSharedOperatorTest, | |
| 114 ::testing::ValuesIn(kSharedOperators)); | |
| 115 | |
| 116 | |
| 117 // ----------------------------------------------------------------------------- | |
| 118 // Other operators. | |
| 119 | |
| 120 | |
| 121 namespace { | |
| 122 | |
| 123 class CommonOperatorTest : public TestWithZone { | |
| 124 public: | |
| 125 CommonOperatorTest() : common_(zone()) {} | |
| 126 virtual ~CommonOperatorTest() {} | |
| 127 | |
| 128 CommonOperatorBuilder* common() { return &common_; } | |
| 129 | |
| 130 private: | |
| 131 CommonOperatorBuilder common_; | |
| 132 }; | |
| 133 | |
| 134 | |
| 135 const int kArguments[] = {1, 5, 6, 42, 100, 10000, kMaxInt}; | |
| 136 | |
| 137 const float kFloat32Values[] = { | |
| 138 std::numeric_limits<float>::min(), -1.0f, -0.0f, 0.0f, 1.0f, | |
| 139 std::numeric_limits<float>::max()}; | |
| 140 | |
| 141 } // namespace | |
| 142 | |
| 143 | |
| 144 TEST_F(CommonOperatorTest, Float32Constant) { | |
| 145 TRACED_FOREACH(float, value, kFloat32Values) { | |
| 146 const Operator* op = common()->Float32Constant(value); | |
| 147 EXPECT_FLOAT_EQ(value, OpParameter<float>(op)); | |
| 148 EXPECT_EQ(0, OperatorProperties::GetValueInputCount(op)); | |
| 149 EXPECT_EQ(0, OperatorProperties::GetTotalInputCount(op)); | |
| 150 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | |
| 151 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | |
| 152 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | |
| 153 } | |
| 154 } | |
| 155 | |
| 156 | |
| 157 TEST_F(CommonOperatorTest, ValueEffect) { | |
| 158 TRACED_FOREACH(int, arguments, kArguments) { | |
| 159 const Operator* op = common()->ValueEffect(arguments); | |
| 160 EXPECT_EQ(arguments, OperatorProperties::GetValueInputCount(op)); | |
| 161 EXPECT_EQ(arguments, OperatorProperties::GetTotalInputCount(op)); | |
| 162 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | |
| 163 EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op)); | |
| 164 EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op)); | |
| 165 } | |
| 166 } | |
| 167 | |
| 168 | |
| 169 TEST_F(CommonOperatorTest, Finish) { | |
| 170 TRACED_FOREACH(int, arguments, kArguments) { | |
| 171 const Operator* op = common()->Finish(arguments); | |
| 172 EXPECT_EQ(1, OperatorProperties::GetValueInputCount(op)); | |
| 173 EXPECT_EQ(arguments, OperatorProperties::GetEffectInputCount(op)); | |
| 174 EXPECT_EQ(arguments + 1, OperatorProperties::GetTotalInputCount(op)); | |
| 175 EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op)); | |
| 176 EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op)); | |
| 177 EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op)); | |
| 178 } | |
| 179 } | |
| 180 | |
| 181 } // namespace compiler | |
| 182 } // namespace internal | |
| 183 } // namespace v8 | |
| OLD | NEW |