@@ -402,11 +402,9 @@ struct InstrAttrs {
402402 };
403403};
404404
405- #define FOR_EACH_INSTRUCTION (M ) \
405+ #define FOR_EACH_LEAF_INSTRUCTION (M ) \
406406 M (GraphEntry, kNoGC ) \
407- M (JoinEntry, kNoGC ) \
408407 M (TargetEntry, kNoGC ) \
409- M (FunctionEntry, kNoGC ) \
410408 M (NativeEntry, kNoGC ) \
411409 M (OsrEntry, kNoGC ) \
412410 M (IndirectEntry, kNoGC ) \
@@ -495,14 +493,11 @@ struct InstrAttrs {
495493 M (CheckSmi, kNoGC ) \
496494 M (CheckNull, kNoGC ) \
497495 M (CheckCondition, kNoGC ) \
498- M (Constant, kNoGC ) \
499496 M (UnboxedConstant, kNoGC ) \
500497 M (CheckEitherNonSmi, kNoGC ) \
501498 M (BinaryDoubleOp, kNoGC ) \
502499 M (DoubleTestOp, kNoGC ) \
503500 M (MathMinMax, kNoGC ) \
504- M (Box, _) \
505- M (Unbox, kNoGC ) \
506501 M (BoxInt64, _) \
507502 M (UnboxInt64, kNoGC ) \
508503 M (CaseInsensitiveCompare, kNoGC ) \
@@ -549,6 +544,17 @@ struct InstrAttrs {
549544 M (SimdOp, kNoGC ) \
550545 M (Suspend, _)
551546
547+ #define FOR_EACH_STEM_INSTRUCTION (M ) \
548+ M (FunctionEntry, kNoGC ) \
549+ M (JoinEntry, kNoGC ) \
550+ M (Constant, kNoGC ) \
551+ M (Box, _) \
552+ M (Unbox, kNoGC )
553+
554+ #define FOR_EACH_CONCRETE_INSTRUCTION (M ) \
555+ FOR_EACH_STEM_INSTRUCTION (M) \
556+ FOR_EACH_LEAF_INSTRUCTION (M)
557+
552558#define FOR_EACH_ABSTRACT_INSTRUCTION (M ) \
553559 M (Allocation, _) \
554560 M (ArrayAllocation, _) \
@@ -564,7 +570,7 @@ struct InstrAttrs {
564570 M (UnboxInteger, _)
565571
566572#define FORWARD_DECLARATION (type, attrs ) class type ##Instr;
567- FOR_EACH_INSTRUCTION (FORWARD_DECLARATION)
573+ FOR_EACH_CONCRETE_INSTRUCTION (FORWARD_DECLARATION)
568574FOR_EACH_ABSTRACT_INSTRUCTION (FORWARD_DECLARATION)
569575#undef FORWARD_DECLARATION
570576
@@ -961,7 +967,7 @@ class ValueListIterable {
961967class Instruction : public ZoneAllocated {
962968 public:
963969#define DECLARE_TAG (type, attrs ) k##type,
964- enum Tag { FOR_EACH_INSTRUCTION (DECLARE_TAG) kNumInstructions };
970+ enum Tag { FOR_EACH_CONCRETE_INSTRUCTION (DECLARE_TAG) kNumInstructions };
965971#undef DECLARE_TAG
966972
967973 static const intptr_t kInstructionAttrs [kNumInstructions ];
@@ -1170,8 +1176,26 @@ class Instruction : public ZoneAllocated {
11701176 DECLARE_INSTRUCTION_TYPE_CHECK (Definition, Definition)
11711177 DECLARE_INSTRUCTION_TYPE_CHECK (BlockEntryWithInitialDefs,
11721178 BlockEntryWithInitialDefs)
1173- FOR_EACH_INSTRUCTION (INSTRUCTION_TYPE_CHECK)
11741179 FOR_EACH_ABSTRACT_INSTRUCTION (INSTRUCTION_TYPE_CHECK)
1180+ FOR_EACH_STEM_INSTRUCTION (INSTRUCTION_TYPE_CHECK)
1181+
1182+ #undef DECLARE_INSTRUCTION_TYPE_CHECK
1183+ #undef INSTRUCTION_TYPE_CHECK
1184+
1185+ #define DECLARE_INSTRUCTION_TYPE_CHECK (Name, Type ) \
1186+ bool Is##Name() const { return (As##Name () != nullptr ); } \
1187+ Type* As##Name() { \
1188+ auto const_this = static_cast <const Instruction*>(this ); \
1189+ return const_cast <Type*>(const_this->As ##Name ()); \
1190+ } \
1191+ const Type* As##Name() const { \
1192+ if (tag () == k##Name) return reinterpret_cast <const Type*>(this ); \
1193+ return nullptr ; \
1194+ }
1195+ #define INSTRUCTION_TYPE_CHECK (Name, Attrs ) \
1196+ DECLARE_INSTRUCTION_TYPE_CHECK (Name, Name##Instr)
1197+
1198+ FOR_EACH_LEAF_INSTRUCTION (INSTRUCTION_TYPE_CHECK)
11751199
11761200#undef INSTRUCTION_TYPE_CHECK
11771201#undef DECLARE_INSTRUCTION_TYPE_CHECK
@@ -11811,7 +11835,7 @@ class InstructionVisitor : public ValueObject {
1181111835#define DECLARE_VISIT_INSTRUCTION (ShortName, Attrs ) \
1181211836 virtual void Visit##ShortName(ShortName##Instr* instr) {}
1181311837
11814- FOR_EACH_INSTRUCTION (DECLARE_VISIT_INSTRUCTION)
11838+ FOR_EACH_CONCRETE_INSTRUCTION (DECLARE_VISIT_INSTRUCTION)
1181511839
1181611840#undef DECLARE_VISIT_INSTRUCTION
1181711841
0 commit comments