| Index: src/compiler/common-operator.cc
|
| diff --git a/src/compiler/common-operator.cc b/src/compiler/common-operator.cc
|
| index aba43fa1bc667378f27e83e9e017be5821b20ffe..27a9d63f48626cc7339faf202c25f534c35d612e 100644
|
| --- a/src/compiler/common-operator.cc
|
| +++ b/src/compiler/common-operator.cc
|
| @@ -125,6 +125,15 @@ size_t ProjectionIndexOf(const Operator* const op) {
|
| V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1)
|
|
|
|
|
| +#define CACHED_EFFECT_PHI_LIST(V) \
|
| + V(1) \
|
| + V(2) \
|
| + V(3) \
|
| + V(4) \
|
| + V(5) \
|
| + V(6)
|
| +
|
| +
|
| #define CACHED_LOOP_LIST(V) \
|
| V(1) \
|
| V(2)
|
| @@ -151,6 +160,40 @@ size_t ProjectionIndexOf(const Operator* const op) {
|
| V(6)
|
|
|
|
|
| +#define CACHED_PHI_LIST(V) \
|
| + V(kMachAnyTagged, 1) \
|
| + V(kMachAnyTagged, 2) \
|
| + V(kMachAnyTagged, 3) \
|
| + V(kMachAnyTagged, 4) \
|
| + V(kMachAnyTagged, 5) \
|
| + V(kMachAnyTagged, 6) \
|
| + V(kMachBool, 2) \
|
| + V(kMachFloat64, 2) \
|
| + V(kMachInt32, 2)
|
| +
|
| +
|
| +#define CACHED_PROJECTION_LIST(V) \
|
| + V(0) \
|
| + V(1)
|
| +
|
| +
|
| +#define CACHED_STATE_VALUES_LIST(V) \
|
| + V(0) \
|
| + V(1) \
|
| + V(2) \
|
| + V(3) \
|
| + V(4) \
|
| + V(5) \
|
| + V(6) \
|
| + V(7) \
|
| + V(8) \
|
| + V(10) \
|
| + V(11) \
|
| + V(12) \
|
| + V(13) \
|
| + V(14)
|
| +
|
| +
|
| struct CommonOperatorGlobalCache FINAL {
|
| #define CACHED(Name, properties, value_input_count, effect_input_count, \
|
| control_input_count, value_output_count, effect_output_count, \
|
| @@ -179,6 +222,19 @@ struct CommonOperatorGlobalCache FINAL {
|
| BranchOperator<BranchHint::kTrue> kBranchTrueOperator;
|
| BranchOperator<BranchHint::kFalse> kBranchFalseOperator;
|
|
|
| + template <int kEffectInputCount>
|
| + struct EffectPhiOperator FINAL : public Operator {
|
| + EffectPhiOperator()
|
| + : Operator( // --
|
| + IrOpcode::kEffectPhi, Operator::kPure, // opcode
|
| + "EffectPhi", // name
|
| + 0, kEffectInputCount, 1, 0, 1, 0) {} // counts
|
| + };
|
| +#define CACHED_EFFECT_PHI(input_count) \
|
| + EffectPhiOperator<input_count> kEffectPhi##input_count##Operator;
|
| + CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
|
| +#undef CACHED_EFFECT_PHI
|
| +
|
| template <size_t kInputCount>
|
| struct LoopOperator FINAL : public Operator {
|
| LoopOperator()
|
| @@ -205,6 +261,20 @@ struct CommonOperatorGlobalCache FINAL {
|
| CACHED_MERGE_LIST(CACHED_MERGE)
|
| #undef CACHED_MERGE
|
|
|
| + template <MachineType kType, int kInputCount>
|
| + struct PhiOperator FINAL : public Operator1<MachineType> {
|
| + PhiOperator()
|
| + : Operator1<MachineType>( //--
|
| + IrOpcode::kPhi, Operator::kPure, // opcode
|
| + "Phi", // name
|
| + kInputCount, 0, 1, 1, 0, 0, // counts
|
| + kType) {} // parameter
|
| + };
|
| +#define CACHED_PHI(type, input_count) \
|
| + PhiOperator<type, input_count> kPhi##type##input_count##Operator;
|
| + CACHED_PHI_LIST(CACHED_PHI)
|
| +#undef CACHED_PHI
|
| +
|
| template <int kIndex>
|
| struct ParameterOperator FINAL : public Operator1<int> {
|
| ParameterOperator()
|
| @@ -218,6 +288,35 @@ struct CommonOperatorGlobalCache FINAL {
|
| ParameterOperator<index> kParameter##index##Operator;
|
| CACHED_PARAMETER_LIST(CACHED_PARAMETER)
|
| #undef CACHED_PARAMETER
|
| +
|
| + template <size_t kIndex>
|
| + struct ProjectionOperator FINAL : public Operator1<size_t> {
|
| + ProjectionOperator()
|
| + : Operator1<size_t>( // --
|
| + IrOpcode::kProjection, // opcode
|
| + Operator::kFoldable | Operator::kNoThrow, // flags
|
| + "Projection", // name
|
| + 1, 0, 0, 1, 0, 0, // counts,
|
| + kIndex) {} // parameter
|
| + };
|
| +#define CACHED_PROJECTION(index) \
|
| + ProjectionOperator<index> kProjection##index##Operator;
|
| + CACHED_PROJECTION_LIST(CACHED_PROJECTION)
|
| +#undef CACHED_PROJECTION
|
| +
|
| + template <int kInputCount>
|
| + struct StateValuesOperator FINAL : public Operator {
|
| + StateValuesOperator()
|
| + : Operator( // --
|
| + IrOpcode::kStateValues, // opcode
|
| + Operator::kPure, // flags
|
| + "StateValues", // name
|
| + kInputCount, 0, 0, 1, 0, 0) {} // counts
|
| + };
|
| +#define CACHED_STATE_VALUES(input_count) \
|
| + StateValuesOperator<input_count> kStateValues##input_count##Operator;
|
| + CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
|
| +#undef CACHED_STATE_VALUES
|
| };
|
|
|
|
|
| @@ -423,22 +522,40 @@ const Operator* CommonOperatorBuilder::Select(MachineType type,
|
| }
|
|
|
|
|
| -const Operator* CommonOperatorBuilder::Phi(MachineType type, int arguments) {
|
| - DCHECK(arguments > 0); // Disallow empty phis.
|
| +const Operator* CommonOperatorBuilder::Phi(MachineType type,
|
| + int value_input_count) {
|
| + DCHECK(value_input_count > 0); // Disallow empty phis.
|
| +#define CACHED_PHI(kType, kValueInputCount) \
|
| + if (kType == type && kValueInputCount == value_input_count) { \
|
| + return &cache_.kPhi##kType##kValueInputCount##Operator; \
|
| + }
|
| + CACHED_PHI_LIST(CACHED_PHI)
|
| +#undef CACHED_PHI
|
| + // Uncached.
|
| return new (zone()) Operator1<MachineType>( // --
|
| IrOpcode::kPhi, Operator::kPure, // opcode
|
| "Phi", // name
|
| - arguments, 0, 1, 1, 0, 0, // counts
|
| + value_input_count, 0, 1, 1, 0, 0, // counts
|
| type); // parameter
|
| }
|
|
|
|
|
| -const Operator* CommonOperatorBuilder::EffectPhi(int arguments) {
|
| - DCHECK(arguments > 0); // Disallow empty phis.
|
| +const Operator* CommonOperatorBuilder::EffectPhi(int effect_input_count) {
|
| + DCHECK(effect_input_count > 0); // Disallow empty effect phis.
|
| + switch (effect_input_count) {
|
| +#define CACHED_EFFECT_PHI(input_count) \
|
| + case input_count: \
|
| + return &cache_.kEffectPhi##input_count##Operator;
|
| + CACHED_EFFECT_PHI_LIST(CACHED_EFFECT_PHI)
|
| +#undef CACHED_EFFECT_PHI
|
| + default:
|
| + break;
|
| + }
|
| + // Uncached.
|
| return new (zone()) Operator( // --
|
| IrOpcode::kEffectPhi, Operator::kPure, // opcode
|
| "EffectPhi", // name
|
| - 0, arguments, 1, 0, 1, 0); // counts
|
| + 0, effect_input_count, 1, 0, 1, 0); // counts
|
| }
|
|
|
|
|
| @@ -470,6 +587,16 @@ const Operator* CommonOperatorBuilder::Finish(int arguments) {
|
|
|
|
|
| const Operator* CommonOperatorBuilder::StateValues(int arguments) {
|
| + switch (arguments) {
|
| +#define CACHED_STATE_VALUES(arguments) \
|
| + case arguments: \
|
| + return &cache_.kStateValues##arguments##Operator;
|
| + CACHED_STATE_VALUES_LIST(CACHED_STATE_VALUES)
|
| +#undef CACHED_STATE_VALUES
|
| + default:
|
| + break;
|
| + }
|
| + // Uncached.
|
| return new (zone()) Operator( // --
|
| IrOpcode::kStateValues, Operator::kPure, // opcode
|
| "StateValues", // name
|
| @@ -510,6 +637,16 @@ const Operator* CommonOperatorBuilder::Call(const CallDescriptor* descriptor) {
|
|
|
|
|
| const Operator* CommonOperatorBuilder::Projection(size_t index) {
|
| + switch (index) {
|
| +#define CACHED_PROJECTION(index) \
|
| + case index: \
|
| + return &cache_.kProjection##index##Operator;
|
| + CACHED_PROJECTION_LIST(CACHED_PROJECTION)
|
| +#undef CACHED_PROJECTION
|
| + default:
|
| + break;
|
| + }
|
| + // Uncached.
|
| return new (zone()) Operator1<size_t>( // --
|
| IrOpcode::kProjection, // opcode
|
| Operator::kFoldable | Operator::kNoThrow, // flags
|
|
|