Index: src/hydrogen.h |
diff --git a/src/hydrogen.h b/src/hydrogen.h |
index 797b444078d5e838157c77e207a956a4b3d056db..ed1eaf1a21e95a9cc25a9a3f72c2d00491cc46f9 100644 |
--- a/src/hydrogen.h |
+++ b/src/hydrogen.h |
@@ -137,17 +137,15 @@ class HBasicBlock: public ZoneObject { |
} |
int PredecessorIndexOf(HBasicBlock* predecessor) const; |
- void AddSimulate(BailoutId ast_id, |
- RemovableSimulate removable = FIXED_SIMULATE) { |
- AddInstruction(CreateSimulate(ast_id, removable)); |
+ HSimulate* AddSimulate(BailoutId ast_id, |
+ RemovableSimulate removable = FIXED_SIMULATE) { |
+ HSimulate* instr = CreateSimulate(ast_id, removable); |
+ AddInstruction(instr); |
+ return instr; |
} |
void AssignCommonDominator(HBasicBlock* other); |
void AssignLoopSuccessorDominators(); |
- void FinishExitWithDeoptimization(HDeoptimize::UseEnvironment has_uses) { |
- FinishExit(CreateDeoptimize(has_uses)); |
- } |
- |
// Add the inlined function exit sequence, adding an HLeaveInlined |
// instruction and updating the bailout environment. |
void AddLeaveInlined(HValue* return_value, FunctionState* state); |
@@ -182,11 +180,12 @@ class HBasicBlock: public ZoneObject { |
#endif |
private: |
+ friend class HGraphBuilder; |
+ |
void RegisterPredecessor(HBasicBlock* pred); |
void AddDominatedBlock(HBasicBlock* block); |
HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); |
- HDeoptimize* CreateDeoptimize(HDeoptimize::UseEnvironment has_uses); |
int block_id_; |
HGraph* graph_; |
@@ -1023,11 +1022,6 @@ class HGraphBuilder { |
new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8))); |
} |
- void AddSimulate(BailoutId id, |
- RemovableSimulate removable = FIXED_SIMULATE); |
- |
- HReturn* AddReturn(HValue* value); |
- |
void IncrementInNoSideEffectsScope() { |
no_side_effects_scope_count_++; |
} |
@@ -1118,12 +1112,7 @@ class HGraphBuilder { |
HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context); |
- enum SoftDeoptimizeMode { |
- MUST_EMIT_SOFT_DEOPT, |
- CAN_OMIT_SOFT_DEOPT |
- }; |
- |
- void AddSoftDeoptimize(SoftDeoptimizeMode mode = CAN_OMIT_SOFT_DEOPT); |
+ void FinishExitWithHardDeoptimization(HBasicBlock* continuation); |
class IfBuilder { |
public: |
@@ -1228,7 +1217,6 @@ class HGraphBuilder { |
void ElseDeopt() { |
Else(); |
Deopt(); |
- End(); |
} |
void Return(HValue* value); |
@@ -1241,6 +1229,8 @@ class HGraphBuilder { |
HGraphBuilder* builder_; |
int position_; |
bool finished_ : 1; |
+ bool deopt_then_ : 1; |
+ bool deopt_else_ : 1; |
bool did_then_ : 1; |
bool did_else_ : 1; |
bool did_and_ : 1; |
@@ -1422,12 +1412,68 @@ class HGraphBuilder { |
private: |
HGraphBuilder(); |
+ |
+ void PadEnvironmentForContinuation(HBasicBlock* from, |
+ HBasicBlock* continuation); |
+ |
CompilationInfo* info_; |
HGraph* graph_; |
HBasicBlock* current_block_; |
int no_side_effects_scope_count_; |
}; |
+ |
+template<> |
+inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) { |
+ if (type == Deoptimizer::SOFT) { |
+ isolate()->counters()->soft_deopts_requested()->Increment(); |
+ if (FLAG_always_opt) return NULL; |
+ } |
+ if (current_block()->IsDeoptimizing()) return NULL; |
+ HDeoptimize* instr = new(zone()) HDeoptimize(type); |
+ AddInstruction(instr); |
+ if (type == Deoptimizer::SOFT) { |
+ isolate()->counters()->soft_deopts_inserted()->Increment(); |
+ graph()->set_has_soft_deoptimize(true); |
+ } |
+ current_block()->MarkAsDeoptimizing(); |
+ return instr; |
+} |
+ |
+ |
+template<> |
+inline HSimulate* HGraphBuilder::Add(BailoutId id, |
+ RemovableSimulate removable) { |
+ HSimulate* instr = current_block()->CreateSimulate(id, removable); |
+ AddInstruction(instr); |
+ return instr; |
+} |
+ |
+ |
+template<> |
+inline HSimulate* HGraphBuilder::Add(BailoutId id) { |
+ return Add<HSimulate>(id, FIXED_SIMULATE); |
+} |
+ |
+ |
+template<> |
+inline HReturn* HGraphBuilder::Add(HValue* value) { |
+ HValue* context = environment()->LookupContext(); |
+ int num_parameters = graph()->info()->num_parameters(); |
+ HValue* params = Add<HConstant>(num_parameters); |
+ HReturn* return_instruction = new(graph()->zone()) |
+ HReturn(value, context, params); |
+ current_block()->FinishExit(return_instruction); |
+ return return_instruction; |
+} |
+ |
+ |
+template<> |
+inline HReturn* HGraphBuilder::Add(HConstant* p1) { |
+ return Add<HReturn>(static_cast<HValue*>(p1)); |
+} |
+ |
+ |
class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor { |
public: |
// A class encapsulating (lazily-allocated) break and continue blocks for |