| Index: runtime/vm/flow_graph.h
 | 
| diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
 | 
| index d071b3688294c0dc0284351744ae427004559f31..ec85594358b9856c6e8981a7eaa983280a271d74 100644
 | 
| --- a/runtime/vm/flow_graph.h
 | 
| +++ b/runtime/vm/flow_graph.h
 | 
| @@ -150,6 +150,23 @@ class FlowGraph : public ZoneAllocated {
 | 
|    // Remove the redefinition instructions inserted to inhibit code motion.
 | 
|    void RemoveRedefinitions();
 | 
|  
 | 
| +  // Copy deoptimization target from one instruction to another if we still
 | 
| +  // have to keep deoptimization environment at gotos for LICM purposes.
 | 
| +  void CopyDeoptTarget(Instruction* to, Instruction* from) {
 | 
| +    if (is_licm_allowed()) {
 | 
| +      to->InheritDeoptTarget(from);
 | 
| +    }
 | 
| +  }
 | 
| +
 | 
| +  // Returns true if every Goto in the graph is expected to have a
 | 
| +  // deoptimization environment and can be used as deoptimization target
 | 
| +  // for hoisted instructions.
 | 
| +  bool is_licm_allowed() const { return licm_allowed_; }
 | 
| +
 | 
| +  // Stop preserving environments on Goto instructions. LICM is not allowed
 | 
| +  // after this point.
 | 
| +  void disallow_licm() { licm_allowed_ = false; }
 | 
| +
 | 
|   private:
 | 
|    friend class IfConverter;
 | 
|    friend class BranchSimplifier;
 | 
| @@ -205,6 +222,7 @@ class FlowGraph : public ZoneAllocated {
 | 
|    ConstantInstr* constant_null_;
 | 
|  
 | 
|    BlockEffects* block_effects_;
 | 
| +  bool licm_allowed_;
 | 
|  };
 | 
|  
 | 
|  
 | 
| 
 |