Index: runtime/vm/intermediate_language.h |
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h |
index 588d082bc70a03551fc685729f18f6c3db2a823a..a00be28e4f53a3468bf8838ed7cc517cca17cc4a 100644 |
--- a/runtime/vm/intermediate_language.h |
+++ b/runtime/vm/intermediate_language.h |
@@ -7266,12 +7266,26 @@ class UnaryDoubleOpInstr : public TemplateDefinition<1, NoThrow, Pure> { |
class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { |
public: |
+ enum Kind { |
+ // Full stack overflow checks are emitted in both unoptimized and |
+ // optimized versions of the code. |
+ kFull, |
+ |
+ // OsrEntry stack overflow checks are only needed in the unoptimized code |
+ // because we can't OSR optimized code. |
+ kOsrEntry, |
+ }; |
+ |
CheckStackOverflowInstr(TokenPosition token_pos, |
intptr_t loop_depth, |
- intptr_t deopt_id) |
+ intptr_t deopt_id, |
+ Kind kind = kFull) |
: TemplateInstruction(deopt_id), |
token_pos_(token_pos), |
- loop_depth_(loop_depth) {} |
+ loop_depth_(loop_depth), |
+ kind_(kind) { |
+ ASSERT(kind != kOsrEntry || loop_depth > 0); |
+ } |
virtual TokenPosition token_pos() const { return token_pos_; } |
bool in_loop() const { return loop_depth_ > 0; } |
@@ -7281,6 +7295,8 @@ class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { |
virtual bool ComputeCanDeoptimize() const { return true; } |
+ virtual Instruction* Canonicalize(FlowGraph* flow_graph); |
+ |
virtual EffectSet Effects() const { return EffectSet::None(); } |
PRINT_OPERANDS_TO_SUPPORT |
@@ -7288,6 +7304,7 @@ class CheckStackOverflowInstr : public TemplateInstruction<0, NoThrow> { |
private: |
const TokenPosition token_pos_; |
const intptr_t loop_depth_; |
+ const Kind kind_; |
DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowInstr); |
}; |