Index: src/compiler/common-operator.cc |
diff --git a/src/compiler/common-operator.cc b/src/compiler/common-operator.cc |
index 4c261f9a248826fe1fbdc63eac003fbad15f2ef3..239382eb07cc220c7acbaaf33967e36bdad67fba 100644 |
--- a/src/compiler/common-operator.cc |
+++ b/src/compiler/common-operator.cc |
@@ -102,7 +102,6 @@ std::ostream& operator<<(std::ostream& os, ParameterInfo const& i) { |
#define CACHED_OP_LIST(V) \ |
V(Dead, Operator::kFoldable, 0, 0, 0, 0, 0, 1) \ |
- V(End, Operator::kKontrol, 0, 0, 1, 0, 0, 0) \ |
V(IfTrue, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
V(IfFalse, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
V(IfSuccess, Operator::kKontrol, 0, 0, 1, 0, 0, 1) \ |
@@ -116,6 +115,17 @@ std::ostream& operator<<(std::ostream& os, ParameterInfo const& i) { |
V(OsrLoopEntry, Operator::kFoldable, 0, 1, 1, 0, 1, 1) |
+#define CACHED_END_LIST(V) \ |
+ V(1) \ |
+ V(2) \ |
+ V(3) \ |
+ V(4) \ |
+ V(5) \ |
+ V(6) \ |
+ V(7) \ |
+ V(8) |
+ |
+ |
#define CACHED_EFFECT_PHI_LIST(V) \ |
V(1) \ |
V(2) \ |
@@ -200,6 +210,19 @@ struct CommonOperatorGlobalCache final { |
CACHED_OP_LIST(CACHED) |
#undef CACHED |
+ template <size_t kInputCount> |
+ struct EndOperator final : public Operator { |
+ EndOperator() |
+ : Operator( // -- |
+ IrOpcode::kEnd, Operator::kKontrol, // opcode |
+ "End", // name |
+ 0, 0, kInputCount, 0, 0, 0) {} // counts |
+ }; |
+#define CACHED_END(input_count) \ |
+ EndOperator<input_count> kEnd##input_count##Operator; |
+ CACHED_END_LIST(CACHED_END) |
+#undef CACHED_END |
+ |
template <BranchHint kBranchHint> |
struct BranchOperator final : public Operator1<BranchHint> { |
BranchOperator() |
@@ -329,6 +352,25 @@ CACHED_OP_LIST(CACHED) |
#undef CACHED |
+const Operator* CommonOperatorBuilder::End(size_t control_input_count) { |
+ DCHECK_NE(0u, control_input_count); // Disallow empty ends. |
+ switch (control_input_count) { |
+#define CACHED_END(input_count) \ |
+ case input_count: \ |
+ return &cache_.kEnd##input_count##Operator; |
+ CACHED_END_LIST(CACHED_END) |
+#undef CACHED_END |
+ default: |
+ break; |
+ } |
+ // Uncached. |
+ return new (zone()) Operator( //-- |
+ IrOpcode::kEnd, Operator::kKontrol, // opcode |
+ "End", // name |
+ 0, 0, control_input_count, 0, 0, 0); // counts |
+} |
+ |
+ |
const Operator* CommonOperatorBuilder::Branch(BranchHint hint) { |
switch (hint) { |
case BranchHint::kNone: |