| Index: src/hydrogen.h
|
| diff --git a/src/hydrogen.h b/src/hydrogen.h
|
| index 895b9849c97d36c16bb6ecdbd6c93f1eb951eb2c..4462d55462bda1f2cca4ec972f51aa1653fe0a70 100644
|
| --- a/src/hydrogen.h
|
| +++ b/src/hydrogen.h
|
| @@ -316,7 +316,6 @@ class HGraph: public ZoneObject {
|
| HEnvironment* start_environment() const { return start_environment_; }
|
|
|
| void FinalizeUniqueValueIds();
|
| - void MarkDeoptimizeOnUndefined();
|
| bool ProcessArgumentsObject();
|
| void OrderBlocks();
|
| void AssignDominators();
|
| @@ -368,7 +367,7 @@ class HGraph: public ZoneObject {
|
| return NULL;
|
| }
|
|
|
| - bool Optimize(SmartArrayPointer<char>* bailout_reason);
|
| + bool Optimize(BailoutReason* bailout_reason);
|
|
|
| #ifdef DEBUG
|
| void Verify(bool do_full_verify) const;
|
| @@ -464,7 +463,6 @@ class HGraph: public ZoneObject {
|
| phase.Run();
|
| }
|
|
|
| - void RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi);
|
| void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor);
|
| void SetupInformativeDefinitionsInBlock(HBasicBlock* block);
|
| void SetupInformativeDefinitionsRecursively(HBasicBlock* block);
|
| @@ -585,7 +583,7 @@ class HEnvironment: public ZoneObject {
|
| return result;
|
| }
|
|
|
| - HValue* LookupContext() const {
|
| + HValue* context() const {
|
| // Return first special.
|
| return Lookup(parameter_count());
|
| }
|
| @@ -992,57 +990,205 @@ class HGraphBuilder {
|
| void Push(HValue* value) { environment()->Push(value); }
|
| HValue* Pop() { return environment()->Pop(); }
|
|
|
| + virtual HValue* context() = 0;
|
| +
|
| // Adding instructions.
|
| HInstruction* AddInstruction(HInstruction* instr);
|
|
|
| template<class I>
|
| - I* Add() { return static_cast<I*>(AddInstruction(new(zone()) I())); }
|
| + HInstruction* NewUncasted() { return I::New(zone(), context()); }
|
| +
|
| + template<class I>
|
| + I* New() { return I::cast(NewUncasted<I>()); }
|
| +
|
| + template<class I>
|
| + HInstruction* AddUncasted() { return AddInstruction(NewUncasted<I>());}
|
| +
|
| + template<class I>
|
| + I* Add() { return I::cast(AddUncasted<I>());}
|
| +
|
| + template<class I, class P1>
|
| + HInstruction* NewUncasted(P1 p1) {
|
| + return I::New(zone(), context(), p1);
|
| + }
|
| +
|
| + template<class I, class P1>
|
| + I* New(P1 p1) { return I::cast(NewUncasted<I>(p1)); }
|
| +
|
| + template<class I, class P1>
|
| + HInstruction* AddUncasted(P1 p1) {
|
| + HInstruction* result = AddInstruction(NewUncasted<I>(p1));
|
| + // Specializations must have their parameters properly casted
|
| + // to avoid landing here.
|
| + ASSERT(!result->IsReturn() && !result->IsSimulate() &&
|
| + !result->IsDeoptimize());
|
| + return result;
|
| + }
|
|
|
| template<class I, class P1>
|
| I* Add(P1 p1) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1)));
|
| + return I::cast(AddUncasted<I>(p1));
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2) {
|
| + return I::New(zone(), context(), p1, p2);
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + I* New(P1 p1, P2 p2) {
|
| + return I::cast(NewUncasted<I>(p1, p2));
|
| + }
|
| +
|
| + template<class I, class P1, class P2>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2) {
|
| + HInstruction* result = AddInstruction(NewUncasted<I>(p1, p2));
|
| + // Specializations must have their parameters properly casted
|
| + // to avoid landing here.
|
| + ASSERT(!result->IsSimulate());
|
| + return result;
|
| }
|
|
|
| template<class I, class P1, class P2>
|
| I* Add(P1 p1, P2 p2) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2)));
|
| + return static_cast<I*>(AddUncasted<I>(p1, p2));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3) {
|
| + return I::New(zone(), context(), p1, p2, p3);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + I* New(P1 p1, P2 p2, P3 p3) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3>
|
| I* Add(P1 p1, P2 p2, P3 p3) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3, p4));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) {
|
| - return static_cast<I*>(AddInstruction(new(zone()) I(p1, p2, p3, p4, p5)));
|
| + return I::cast(AddUncasted<I>(p1, p2, p3, p4, p5));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4, class P5, class P6>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6)));
|
| + return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6)));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3,
|
| + class P4, class P5, class P6, class P7>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3,
|
| class P4, class P5, class P6, class P7>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6, p7)));
|
| + return I::cast(AddInstruction(NewUncasted<I>(p1, p2, p3, p4,
|
| + p5, p6, p7)));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + HInstruction* NewUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
|
| + P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return I::New(zone(), context(), p1, p2, p3, p4, p5, p6, p7, p8);
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + I* New(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return I::cast(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8));
|
| + }
|
| +
|
| + template<class I, class P1, class P2, class P3, class P4,
|
| + class P5, class P6, class P7, class P8>
|
| + HInstruction* AddUncasted(P1 p1, P2 p2, P3 p3, P4 p4,
|
| + P5 p5, P6 p6, P7 p7, P8 p8) {
|
| + return AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8));
|
| }
|
|
|
| template<class I, class P1, class P2, class P3, class P4,
|
| class P5, class P6, class P7, class P8>
|
| I* Add(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5, P6 p6, P7 p7, P8 p8) {
|
| - return static_cast<I*>(AddInstruction(
|
| - new(zone()) I(p1, p2, p3, p4, p5, p6, p7, p8)));
|
| + return I::cast(
|
| + AddInstruction(NewUncasted<I>(p1, p2, p3, p4, p5, p6, p7, p8)));
|
| }
|
|
|
| + void AddSimulate(BailoutId id,
|
| + RemovableSimulate removable = FIXED_SIMULATE);
|
| +
|
| void IncrementInNoSideEffectsScope() {
|
| no_side_effects_scope_count_++;
|
| }
|
| @@ -1091,16 +1237,6 @@ class HGraphBuilder {
|
| LoadKeyedHoleMode load_mode,
|
| KeyedAccessStoreMode store_mode);
|
|
|
| - HLoadNamedField* AddLoad(
|
| - HValue *object,
|
| - HObjectAccess access,
|
| - HValue *typecheck = NULL);
|
| -
|
| - HLoadNamedField* BuildLoadNamedField(
|
| - HValue* object,
|
| - HObjectAccess access,
|
| - Representation representation);
|
| -
|
| HInstruction* AddExternalArrayElementAccess(
|
| HValue* external_elements,
|
| HValue* checked_key,
|
| @@ -1119,13 +1255,16 @@ class HGraphBuilder {
|
| LoadKeyedHoleMode load_mode,
|
| KeyedAccessStoreMode store_mode);
|
|
|
| - HLoadNamedField* BuildLoadNamedField(HValue* object, HObjectAccess access);
|
| - HStoreNamedField* AddStore(HValue *object, HObjectAccess access, HValue *val);
|
| + HLoadNamedField* BuildLoadNamedField(
|
| + HValue* object,
|
| + HObjectAccess access,
|
| + HValue* typecheck = NULL);
|
| + HInstruction* BuildLoadStringLength(HValue* object, HValue* typecheck = NULL);
|
| HStoreNamedField* AddStoreMapConstant(HValue *object, Handle<Map>);
|
| HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL);
|
| HLoadNamedField* AddLoadFixedArrayLength(HValue *object);
|
|
|
| - HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin, HValue* context);
|
| + HValue* AddLoadJSBuiltin(Builtins::JavaScript builtin);
|
|
|
| HValue* TruncateToNumber(HValue* value, Handle<Type>* expected);
|
|
|
| @@ -1133,6 +1272,9 @@ class HGraphBuilder {
|
|
|
| void FinishExitWithHardDeoptimization(HBasicBlock* continuation);
|
|
|
| + void AddIncrementCounter(StatsCounter* counter,
|
| + HValue* context);
|
| +
|
| class IfBuilder {
|
| public:
|
| explicit IfBuilder(HGraphBuilder* builder,
|
| @@ -1313,8 +1455,7 @@ class HGraphBuilder {
|
| HGraphBuilder* builder_;
|
| };
|
|
|
| - HValue* BuildNewElementsCapacity(HValue* context,
|
| - HValue* old_capacity);
|
| + HValue* BuildNewElementsCapacity(HValue* old_capacity);
|
|
|
| void BuildNewSpaceArrayCheck(HValue* length,
|
| ElementsKind kind);
|
| @@ -1348,7 +1489,7 @@ class HGraphBuilder {
|
| return JSArray::kPreallocatedArrayElements;
|
| }
|
|
|
| - HValue* EmitMapCode(HValue* context);
|
| + HValue* EmitMapCode();
|
| HValue* EmitInternalMapCode();
|
| HValue* EstablishEmptyArrayAllocationSize();
|
| HValue* EstablishAllocationSize(HValue* length_node);
|
| @@ -1363,16 +1504,14 @@ class HGraphBuilder {
|
| HInnerAllocatedObject* elements_location_;
|
| };
|
|
|
| - HValue* BuildAllocateElements(HValue* context,
|
| - ElementsKind kind,
|
| + HValue* BuildAllocateElements(ElementsKind kind,
|
| HValue* capacity);
|
|
|
| void BuildInitializeElementsHeader(HValue* elements,
|
| ElementsKind kind,
|
| HValue* capacity);
|
|
|
| - HValue* BuildAllocateElementsAndInitializeElementsHeader(HValue* context,
|
| - ElementsKind kind,
|
| + HValue* BuildAllocateElementsAndInitializeElementsHeader(ElementsKind kind,
|
| HValue* capacity);
|
|
|
| // array must have been allocated with enough room for
|
| @@ -1393,22 +1532,19 @@ class HGraphBuilder {
|
| HValue* length,
|
| HValue* new_capacity);
|
|
|
| - void BuildFillElementsWithHole(HValue* context,
|
| - HValue* elements,
|
| + void BuildFillElementsWithHole(HValue* elements,
|
| ElementsKind elements_kind,
|
| HValue* from,
|
| HValue* to);
|
|
|
| - void BuildCopyElements(HValue* context,
|
| - HValue* from_elements,
|
| + void BuildCopyElements(HValue* from_elements,
|
| ElementsKind from_elements_kind,
|
| HValue* to_elements,
|
| ElementsKind to_elements_kind,
|
| HValue* length,
|
| HValue* capacity);
|
|
|
| - HValue* BuildCloneShallowArray(HContext* context,
|
| - HValue* boilerplate,
|
| + HValue* BuildCloneShallowArray(HValue* boilerplate,
|
| HValue* allocation_site,
|
| AllocationSiteMode mode,
|
| ElementsKind kind,
|
| @@ -1427,8 +1563,8 @@ class HGraphBuilder {
|
| int previous_object_size,
|
| HValue* payload);
|
|
|
| - HInstruction* BuildGetNativeContext(HValue* context);
|
| - HInstruction* BuildGetArrayFunction(HValue* context);
|
| + HInstruction* BuildGetNativeContext();
|
| + HInstruction* BuildGetArrayFunction();
|
|
|
| private:
|
| HGraphBuilder();
|
| @@ -1444,13 +1580,14 @@ class HGraphBuilder {
|
|
|
|
|
| template<>
|
| -inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) {
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
| + 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);
|
| + HDeoptimize* instr = New<HDeoptimize>(type);
|
| AddInstruction(instr);
|
| if (type == Deoptimizer::SOFT) {
|
| isolate()->counters()->soft_deopts_inserted()->Increment();
|
| @@ -1462,8 +1599,16 @@ inline HDeoptimize* HGraphBuilder::Add(Deoptimizer::BailoutType type) {
|
|
|
|
|
| template<>
|
| -inline HSimulate* HGraphBuilder::Add(BailoutId id,
|
| - RemovableSimulate removable) {
|
| +inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>(
|
| + Deoptimizer::BailoutType type) {
|
| + return static_cast<HDeoptimize*>(AddUncasted<HDeoptimize>(type));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(
|
| + BailoutId id,
|
| + RemovableSimulate removable) {
|
| HSimulate* instr = current_block()->CreateSimulate(id, removable);
|
| AddInstruction(instr);
|
| return instr;
|
| @@ -1471,26 +1616,46 @@ inline HSimulate* HGraphBuilder::Add(BailoutId id,
|
|
|
|
|
| template<>
|
| -inline HSimulate* HGraphBuilder::Add(BailoutId id) {
|
| - return Add<HSimulate>(id, FIXED_SIMULATE);
|
| +inline HInstruction* HGraphBuilder::NewUncasted<HLoadNamedField>(
|
| + HValue* object, HObjectAccess access) {
|
| + return NewUncasted<HLoadNamedField>(object, access,
|
| + static_cast<HValue*>(NULL));
|
| }
|
|
|
|
|
| template<>
|
| -inline HReturn* HGraphBuilder::Add(HValue* value) {
|
| - HValue* context = environment()->LookupContext();
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HLoadNamedField>(
|
| + HValue* object, HObjectAccess access) {
|
| + return AddUncasted<HLoadNamedField>(object, access,
|
| + static_cast<HValue*>(NULL));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HSimulate>(BailoutId id) {
|
| + return AddUncasted<HSimulate>(id, FIXED_SIMULATE);
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
| int num_parameters = graph()->info()->num_parameters();
|
| - HValue* params = Add<HConstant>(num_parameters);
|
| - HReturn* return_instruction = new(graph()->zone())
|
| - HReturn(value, context, params);
|
| + HValue* params = AddUncasted<HConstant>(num_parameters);
|
| + HReturn* return_instruction = New<HReturn>(value, params);
|
| current_block()->FinishExit(return_instruction);
|
| return return_instruction;
|
| }
|
|
|
|
|
| template<>
|
| -inline HReturn* HGraphBuilder::Add(HConstant* p1) {
|
| - return Add<HReturn>(static_cast<HValue*>(p1));
|
| +inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HConstant* value) {
|
| + return AddUncasted<HReturn>(static_cast<HValue*>(value));
|
| +}
|
| +
|
| +
|
| +template<>
|
| +inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
|
| + return HContext::New(zone());
|
| }
|
|
|
|
|
| @@ -1559,7 +1724,9 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
|
|
|
| bool inline_bailout() { return inline_bailout_; }
|
|
|
| - void Bailout(const char* reason);
|
| + HValue* context() { return environment()->context(); }
|
| +
|
| + void Bailout(BailoutReason reason);
|
|
|
| HBasicBlock* CreateJoin(HBasicBlock* first,
|
| HBasicBlock* second,
|
| @@ -1834,8 +2001,7 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
|
| Expression* sub_expr,
|
| NilValue nil);
|
|
|
| - HInstruction* BuildStringCharCodeAt(HValue* context,
|
| - HValue* string,
|
| + HInstruction* BuildStringCharCodeAt(HValue* string,
|
| HValue* index);
|
| HInstruction* BuildBinaryOperation(BinaryOperation* expr,
|
| HValue* left,
|
| @@ -1891,9 +2057,6 @@ class HOptimizedGraphBuilder: public HGraphBuilder, public AstVisitor {
|
|
|
| void AddCheckMap(HValue* object, Handle<Map> map);
|
|
|
| - void AddCheckMapsWithTransitions(HValue* object,
|
| - Handle<Map> map);
|
| -
|
| void BuildStoreNamed(Expression* expression,
|
| BailoutId id,
|
| int position,
|
|
|