Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 0e33c82cb482bc2b357b6fe1e9772dd28e98ab18..8f7d602d2e5794d49796a056912a0a86b9691749 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -109,7 +109,6 @@ class LChunkBuilder; |
V(Deoptimize) \ |
V(Div) \ |
V(DummyUse) \ |
- V(ElementsKind) \ |
V(EnterInlined) \ |
V(EnvironmentMarker) \ |
V(ForceRepresentation) \ |
@@ -172,7 +171,6 @@ class LChunkBuilder; |
V(StringCompareAndBranch) \ |
V(Sub) \ |
V(ThisFunction) \ |
- V(Throw) \ |
V(ToFastProperties) \ |
V(TransitionElementsKind) \ |
V(TrapAllocationMemento) \ |
@@ -181,7 +179,6 @@ class LChunkBuilder; |
V(UnaryMathOperation) \ |
V(UnknownOSRValue) \ |
V(UseConst) \ |
- V(ValueOf) \ |
V(WrapReceiver) |
#define GVN_TRACKED_FLAG_LIST(V) \ |
@@ -1642,28 +1639,6 @@ class HUnaryOperation : public HTemplateInstruction<1> { |
}; |
-class HThrow V8_FINAL : public HTemplateInstruction<2> { |
- public: |
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HThrow, HValue*); |
- |
- virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
- return Representation::Tagged(); |
- } |
- |
- HValue* context() { return OperandAt(0); } |
- HValue* value() { return OperandAt(1); } |
- |
- DECLARE_CONCRETE_INSTRUCTION(Throw) |
- |
- private: |
- HThrow(HValue* context, HValue* value) { |
- SetOperandAt(0, context); |
- SetOperandAt(1, value); |
- SetAllSideEffects(); |
- } |
-}; |
- |
- |
class HUseConst V8_FINAL : public HUnaryOperation { |
public: |
DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); |
@@ -1980,8 +1955,7 @@ class HStackCheck V8_FINAL : public HTemplateInstruction<1> { |
enum InliningKind { |
- NORMAL_RETURN, // Normal function/method call and return. |
- DROP_EXTRA_ON_RETURN, // Drop an extra value from the environment on return. |
+ NORMAL_RETURN, // Drop the function from the environment on return. |
CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. |
GETTER_CALL_RETURN, // Returning from a getter, need to restore context. |
SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. |
@@ -2398,39 +2372,28 @@ class HInvokeFunction V8_FINAL : public HBinaryCall { |
}; |
-enum CallMode { |
- NORMAL_CALL, |
- TAIL_CALL, |
- NORMAL_CONTEXTUAL_CALL |
-}; |
- |
- |
class HCallFunction V8_FINAL : public HBinaryCall { |
public: |
DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallFunction, HValue*, int); |
DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3( |
- HCallFunction, HValue*, int, CallMode); |
+ HCallFunction, HValue*, int, CallFunctionFlags); |
- bool IsTailCall() const { return call_mode_ == TAIL_CALL; } |
- bool IsContextualCall() const { return call_mode_ == NORMAL_CONTEXTUAL_CALL; } |
HValue* context() { return first(); } |
HValue* function() { return second(); } |
+ CallFunctionFlags function_flags() const { return function_flags_; } |
DECLARE_CONCRETE_INSTRUCTION(CallFunction) |
- virtual int argument_delta() const V8_OVERRIDE { |
- if (IsTailCall()) return 0; |
- return -argument_count(); |
- } |
+ virtual int argument_delta() const V8_OVERRIDE { return -argument_count(); } |
private: |
HCallFunction(HValue* context, |
HValue* function, |
int argument_count, |
- CallMode mode = NORMAL_CALL) |
- : HBinaryCall(context, function, argument_count), call_mode_(mode) { |
+ CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS) |
+ : HBinaryCall(context, function, argument_count), function_flags_(flags) { |
} |
- CallMode call_mode_; |
+ CallFunctionFlags function_flags_; |
}; |
@@ -2539,28 +2502,6 @@ class HMapEnumLength V8_FINAL : public HUnaryOperation { |
}; |
-class HElementsKind V8_FINAL : public HUnaryOperation { |
- public: |
- explicit HElementsKind(HValue* value) : HUnaryOperation(value) { |
- set_representation(Representation::Integer32()); |
- SetFlag(kUseGVN); |
- SetGVNFlag(kDependsOnElementsKind); |
- } |
- |
- virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
- return Representation::Tagged(); |
- } |
- |
- DECLARE_CONCRETE_INSTRUCTION(ElementsKind) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
- |
- private: |
- virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
-}; |
- |
- |
class HUnaryMathOperation V8_FINAL : public HTemplateInstruction<2> { |
public: |
static HInstruction* New(Zone* zone, |
@@ -3437,33 +3378,7 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
return is_not_in_new_space_; |
} |
- bool ImmortalImmovable() const { |
- if (has_int32_value_) { |
- return false; |
- } |
- if (has_double_value_) { |
- if (IsSpecialDouble()) { |
- return true; |
- } |
- return false; |
- } |
- if (has_external_reference_value_) { |
- return false; |
- } |
- |
- ASSERT(!object_.handle().is_null()); |
- Heap* heap = isolate()->heap(); |
- ASSERT(!object_.IsKnownGlobal(heap->minus_zero_value())); |
- ASSERT(!object_.IsKnownGlobal(heap->nan_value())); |
- return |
- object_.IsKnownGlobal(heap->undefined_value()) || |
- object_.IsKnownGlobal(heap->null_value()) || |
- object_.IsKnownGlobal(heap->true_value()) || |
- object_.IsKnownGlobal(heap->false_value()) || |
- object_.IsKnownGlobal(heap->the_hole_value()) || |
- object_.IsKnownGlobal(heap->empty_string()) || |
- object_.IsKnownGlobal(heap->empty_fixed_array()); |
- } |
+ bool ImmortalImmovable() const; |
bool IsCell() const { |
return is_cell_; |
@@ -3738,6 +3653,8 @@ class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { |
public: |
DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); |
+ virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
+ |
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
return Representation::Tagged(); |
} |
@@ -3748,15 +3665,21 @@ class HWrapReceiver V8_FINAL : public HTemplateInstruction<2> { |
virtual HValue* Canonicalize() V8_OVERRIDE; |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
+ bool known_function() const { return known_function_; } |
DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) |
private: |
HWrapReceiver(HValue* receiver, HValue* function) { |
+ known_function_ = function->IsConstant() && |
+ HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); |
set_representation(Representation::Tagged()); |
SetOperandAt(0, receiver); |
SetOperandAt(1, function); |
+ SetFlag(kUseGVN); |
} |
+ |
+ bool known_function_; |
}; |
@@ -4316,6 +4239,9 @@ class HIsStringAndBranch V8_FINAL : public HUnaryControlInstruction { |
DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) |
+ protected: |
+ virtual int RedefinedOperandIndex() { return 0; } |
+ |
private: |
HIsStringAndBranch(HValue* value, |
HBasicBlock* true_target = NULL, |
@@ -4338,6 +4264,7 @@ class HIsSmiAndBranch V8_FINAL : public HUnaryControlInstruction { |
protected: |
virtual bool DataEquals(HValue* other) V8_OVERRIDE { return true; } |
+ virtual int RedefinedOperandIndex() { return 0; } |
private: |
HIsSmiAndBranch(HValue* value, |
@@ -7205,25 +7132,6 @@ class HToFastProperties V8_FINAL : public HUnaryOperation { |
}; |
-class HValueOf V8_FINAL : public HUnaryOperation { |
- public: |
- DECLARE_INSTRUCTION_FACTORY_P1(HValueOf, HValue*); |
- |
- virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
- return Representation::Tagged(); |
- } |
- |
- DECLARE_CONCRETE_INSTRUCTION(ValueOf) |
- |
- private: |
- explicit HValueOf(HValue* value) : HUnaryOperation(value) { |
- set_representation(Representation::Tagged()); |
- } |
- |
- virtual bool IsDeletable() const V8_OVERRIDE { return true; } |
-}; |
- |
- |
class HDateField V8_FINAL : public HUnaryOperation { |
public: |
DECLARE_INSTRUCTION_FACTORY_P2(HDateField, HValue*, Smi*); |