Index: src/hydrogen-instructions.h |
=================================================================== |
--- src/hydrogen-instructions.h (revision 8460) |
+++ src/hydrogen-instructions.h (working copy) |
@@ -72,6 +72,7 @@ |
V(BitXor) \ |
V(BlockEntry) \ |
V(BoundsCheck) \ |
+ V(Branch) \ |
V(CallConstantFunction) \ |
V(CallFunction) \ |
V(CallGlobal) \ |
@@ -89,11 +90,12 @@ |
V(CheckPrototypeMaps) \ |
V(CheckSmi) \ |
V(ClampToUint8) \ |
- V(ClassOfTest) \ |
- V(Compare) \ |
- V(CompareObjectEq) \ |
+ V(ClassOfTestAndBranch) \ |
+ V(CompareIDAndBranch) \ |
+ V(CompareGeneric) \ |
+ V(CompareObjectEqAndBranch) \ |
V(CompareMap) \ |
- V(CompareConstantEq) \ |
+ V(CompareConstantEqAndBranch) \ |
V(Constant) \ |
V(Context) \ |
V(DeleteProperty) \ |
@@ -109,17 +111,17 @@ |
V(GlobalObject) \ |
V(GlobalReceiver) \ |
V(Goto) \ |
- V(HasCachedArrayIndex) \ |
- V(HasInstanceType) \ |
+ V(HasCachedArrayIndexAndBranch) \ |
+ V(HasInstanceTypeAndBranch) \ |
V(In) \ |
V(InstanceOf) \ |
V(InstanceOfKnownGlobal) \ |
V(InvokeFunction) \ |
- V(IsConstructCall) \ |
- V(IsNull) \ |
- V(IsObject) \ |
- V(IsSmi) \ |
- V(IsUndetectable) \ |
+ V(IsConstructCallAndBranch) \ |
+ V(IsNullAndBranch) \ |
+ V(IsObjectAndBranch) \ |
+ V(IsSmiAndBranch) \ |
+ V(IsUndetectableAndBranch) \ |
V(JSArrayLength) \ |
V(LeaveInlined) \ |
V(LoadContextSlot) \ |
@@ -163,13 +165,12 @@ |
V(StringCharFromCode) \ |
V(StringLength) \ |
V(Sub) \ |
- V(Test) \ |
V(ThisFunction) \ |
V(Throw) \ |
V(ToFastProperties) \ |
V(ToInt32) \ |
V(Typeof) \ |
- V(TypeofIs) \ |
+ V(TypeofIsAndBranch) \ |
V(UnaryMathOperation) \ |
V(UnknownOSRValue) \ |
V(UseConst) \ |
@@ -781,6 +782,7 @@ |
public: |
virtual HBasicBlock* SuccessorAt(int i) = 0; |
virtual int SuccessorCount() = 0; |
+ virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; |
virtual void PrintDataTo(StringStream* stream); |
@@ -815,12 +817,13 @@ |
public: |
int SuccessorCount() { return S; } |
HBasicBlock* SuccessorAt(int i) { return successors_[i]; } |
+ void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; } |
int OperandCount() { return V; } |
HValue* OperandAt(int i) { return inputs_[i]; } |
+ |
protected: |
- void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; } |
void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } |
private: |
@@ -869,6 +872,9 @@ |
UNREACHABLE(); |
return NULL; |
} |
+ virtual void SetSuccessorAt(int i, HBasicBlock* block) { |
+ UNREACHABLE(); |
+ } |
void AddEnvironmentValue(HValue* value) { |
values_.Add(NULL); |
@@ -922,18 +928,21 @@ |
}; |
-class HTest: public HUnaryControlInstruction { |
+class HBranch: public HUnaryControlInstruction { |
public: |
- HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target) |
+ HBranch(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target) |
: HUnaryControlInstruction(value, true_target, false_target) { |
ASSERT(true_target != NULL && false_target != NULL); |
} |
+ explicit HBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { } |
+ |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::None(); |
} |
- DECLARE_CONCRETE_INSTRUCTION(Test) |
+ DECLARE_CONCRETE_INSTRUCTION(Branch) |
}; |
@@ -2520,245 +2529,211 @@ |
}; |
-class HCompare: public HBinaryOperation { |
+class HCompareGeneric: public HBinaryOperation { |
public: |
- HCompare(HValue* left, HValue* right, Token::Value token) |
+ HCompareGeneric(HValue* left, HValue* right, Token::Value token) |
: HBinaryOperation(left, right), token_(token) { |
ASSERT(Token::IsCompareOp(token)); |
set_representation(Representation::Tagged()); |
SetAllSideEffects(); |
} |
- void SetInputRepresentation(Representation r); |
- |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
- return input_representation_; |
+ return Representation::Tagged(); |
} |
Representation GetInputRepresentation() const { |
- return input_representation_; |
+ return Representation::Tagged(); |
} |
+ |
Token::Value token() const { return token_; } |
virtual void PrintDataTo(StringStream* stream); |
virtual HType CalculateInferredType(); |
- virtual intptr_t Hashcode() { |
- return HValue::Hashcode() * 7 + token_; |
+ DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) |
+ |
+ private: |
+ Token::Value token_; |
+}; |
+ |
+ |
+class HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> { |
+ public: |
+ HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token) |
+ : token_(token) { |
+ ASSERT(Token::IsCompareOp(token)); |
+ SetOperandAt(0, left); |
+ SetOperandAt(1, right); |
} |
- DECLARE_CONCRETE_INSTRUCTION(Compare) |
+ HValue* left() { return OperandAt(0); } |
+ HValue* right() { return OperandAt(1); } |
+ Token::Value token() const { return token_; } |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HCompare* comp = HCompare::cast(other); |
- return token_ == comp->token(); |
+ void SetInputRepresentation(Representation r); |
+ Representation GetInputRepresentation() const { |
+ return input_representation_; |
} |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return input_representation_; |
+ } |
+ virtual void PrintDataTo(StringStream* stream); |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch) |
+ |
private: |
Representation input_representation_; |
Token::Value token_; |
}; |
-class HCompareObjectEq: public HBinaryOperation { |
+class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> { |
public: |
- HCompareObjectEq(HValue* left, HValue* right) |
- : HBinaryOperation(left, right) { |
- set_representation(Representation::Tagged()); |
- SetFlag(kUseGVN); |
- SetFlag(kDependsOnMaps); |
+ HCompareObjectEqAndBranch(HValue* left, HValue* right) { |
+ SetOperandAt(0, left); |
+ SetOperandAt(1, right); |
} |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
+ HValue* left() { return OperandAt(0); } |
+ HValue* right() { return OperandAt(1); } |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Tagged(); |
} |
- virtual HType CalculateInferredType(); |
- DECLARE_CONCRETE_INSTRUCTION(CompareObjectEq) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) |
}; |
-class HCompareConstantEq: public HUnaryOperation { |
+class HCompareConstantEqAndBranch: public HUnaryControlInstruction { |
public: |
- HCompareConstantEq(HValue* left, int right, Token::Value op) |
- : HUnaryOperation(left), op_(op), right_(right) { |
+ HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op) |
+ : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) { |
ASSERT(op == Token::EQ_STRICT); |
- set_representation(Representation::Tagged()); |
- SetFlag(kUseGVN); |
} |
Token::Value op() const { return op_; } |
int right() const { return right_; } |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Integer32(); |
} |
- virtual HType CalculateInferredType() { return HType::Boolean(); } |
+ DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch); |
- DECLARE_CONCRETE_INSTRUCTION(CompareConstantEq); |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HCompareConstantEq* other_instr = HCompareConstantEq::cast(other); |
- return (op_ == other_instr->op_ && |
- right_ == other_instr->right_); |
- } |
- |
private: |
const Token::Value op_; |
const int right_; |
}; |
-class HUnaryPredicate: public HUnaryOperation { |
+class HIsNullAndBranch: public HUnaryControlInstruction { |
public: |
- explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) { |
- set_representation(Representation::Tagged()); |
- SetFlag(kUseGVN); |
- } |
+ HIsNullAndBranch(HValue* value, bool is_strict) |
+ : HUnaryControlInstruction(value, NULL, NULL), is_strict_(is_strict) { } |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
+ bool is_strict() const { return is_strict_; } |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::Tagged(); |
} |
- virtual HType CalculateInferredType(); |
-}; |
+ DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch) |
-class HIsNull: public HUnaryPredicate { |
- public: |
- HIsNull(HValue* value, bool is_strict) |
- : HUnaryPredicate(value), is_strict_(is_strict) { } |
- |
- bool is_strict() const { return is_strict_; } |
- |
- DECLARE_CONCRETE_INSTRUCTION(IsNull) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HIsNull* b = HIsNull::cast(other); |
- return is_strict_ == b->is_strict(); |
- } |
- |
private: |
bool is_strict_; |
}; |
-class HIsObject: public HUnaryPredicate { |
+class HIsObjectAndBranch: public HUnaryControlInstruction { |
public: |
- explicit HIsObject(HValue* value) : HUnaryPredicate(value) { } |
+ explicit HIsObjectAndBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { } |
- DECLARE_CONCRETE_INSTRUCTION(IsObject) |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) |
}; |
-class HIsSmi: public HUnaryPredicate { |
+class HIsSmiAndBranch: public HUnaryControlInstruction { |
public: |
- explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { } |
+ explicit HIsSmiAndBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { } |
- DECLARE_CONCRETE_INSTRUCTION(IsSmi) |
+ DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
protected: |
virtual bool DataEquals(HValue* other) { return true; } |
}; |
-class HIsUndetectable: public HUnaryPredicate { |
+class HIsUndetectableAndBranch: public HUnaryControlInstruction { |
public: |
- explicit HIsUndetectable(HValue* value) : HUnaryPredicate(value) { } |
+ explicit HIsUndetectableAndBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { } |
- DECLARE_CONCRETE_INSTRUCTION(IsUndetectable) |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) |
}; |
-class HIsConstructCall: public HTemplateInstruction<0> { |
+class HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> { |
public: |
- HIsConstructCall() { |
- set_representation(Representation::Tagged()); |
- SetFlag(kUseGVN); |
- } |
- |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
- |
virtual Representation RequiredInputRepresentation(int index) const { |
return Representation::None(); |
} |
- DECLARE_CONCRETE_INSTRUCTION(IsConstructCall) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) |
}; |
-class HHasInstanceType: public HUnaryPredicate { |
+class HHasInstanceTypeAndBranch: public HUnaryControlInstruction { |
public: |
- HHasInstanceType(HValue* value, InstanceType type) |
- : HUnaryPredicate(value), from_(type), to_(type) { } |
- HHasInstanceType(HValue* value, InstanceType from, InstanceType to) |
- : HUnaryPredicate(value), from_(from), to_(to) { |
+ HHasInstanceTypeAndBranch(HValue* value, InstanceType type) |
+ : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } |
+ HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) |
+ : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { |
ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. |
} |
InstanceType from() { return from_; } |
InstanceType to() { return to_; } |
- virtual bool EmitAtUses() { |
- return !HasSideEffects() && !HasMultipleUses(); |
- } |
- |
virtual void PrintDataTo(StringStream* stream); |
- DECLARE_CONCRETE_INSTRUCTION(HasInstanceType) |
- |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HHasInstanceType* b = HHasInstanceType::cast(other); |
- return (from_ == b->from()) && (to_ == b->to()); |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
+ DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) |
+ |
private: |
InstanceType from_; |
InstanceType to_; // Inclusive range, not all combinations work. |
}; |
-class HHasCachedArrayIndex: public HUnaryPredicate { |
+class HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction { |
public: |
- explicit HHasCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { } |
+ explicit HHasCachedArrayIndexAndBranch(HValue* value) |
+ : HUnaryControlInstruction(value, NULL, NULL) { } |
- DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex) |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
- protected: |
- virtual bool DataEquals(HValue* other) { return true; } |
+ DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) |
}; |
@@ -2780,42 +2755,40 @@ |
}; |
-class HClassOfTest: public HUnaryPredicate { |
+class HClassOfTestAndBranch: public HUnaryControlInstruction { |
public: |
- HClassOfTest(HValue* value, Handle<String> class_name) |
- : HUnaryPredicate(value), class_name_(class_name) { } |
+ HClassOfTestAndBranch(HValue* value, Handle<String> class_name) |
+ : HUnaryControlInstruction(value, NULL, NULL), |
+ class_name_(class_name) { } |
- DECLARE_CONCRETE_INSTRUCTION(ClassOfTest) |
+ DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
+ } |
+ |
virtual void PrintDataTo(StringStream* stream); |
Handle<String> class_name() const { return class_name_; } |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HClassOfTest* b = HClassOfTest::cast(other); |
- return class_name_.is_identical_to(b->class_name_); |
- } |
- |
private: |
Handle<String> class_name_; |
}; |
-class HTypeofIs: public HUnaryPredicate { |
+class HTypeofIsAndBranch: public HUnaryControlInstruction { |
public: |
- HTypeofIs(HValue* value, Handle<String> type_literal) |
- : HUnaryPredicate(value), type_literal_(type_literal) { } |
+ HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) |
+ : HUnaryControlInstruction(value, NULL, NULL), |
+ type_literal_(type_literal) { } |
Handle<String> type_literal() { return type_literal_; } |
virtual void PrintDataTo(StringStream* stream); |
- DECLARE_CONCRETE_INSTRUCTION(TypeofIs) |
+ DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) |
- protected: |
- virtual bool DataEquals(HValue* other) { |
- HTypeofIs* b = HTypeofIs::cast(other); |
- return type_literal_.is_identical_to(b->type_literal_); |
+ virtual Representation RequiredInputRepresentation(int index) const { |
+ return Representation::Tagged(); |
} |
private: |