Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index a715915f1f6d374715e902a1b9723b232ef8b06a..cef6b10901c3952180c21c157d68a65a31bd3aa8 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -721,6 +721,8 @@ class HValue : public ZoneObject { |
return index == kNoRedefinedOperand ? NULL : OperandAt(index); |
} |
+ bool CanReplaceWithDummyUses(); |
+ |
// A purely informative definition is an idef that will not emit code and |
// should therefore be removed from the graph in the RestoreActualValues |
// phase (so that live ranges will be shorter). |
@@ -1183,6 +1185,11 @@ class HControlInstruction : public HInstruction { |
virtual void PrintDataTo(StringStream* stream) V8_OVERRIDE; |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { |
+ *block = NULL; |
+ return false; |
+ } |
+ |
HBasicBlock* FirstSuccessor() { |
return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; |
} |
@@ -1272,29 +1279,6 @@ class HDummyUse V8_FINAL : public HTemplateInstruction<1> { |
}; |
-class HDeoptimize V8_FINAL : public HTemplateInstruction<0> { |
- public: |
- DECLARE_INSTRUCTION_FACTORY_P2(HDeoptimize, const char*, |
- Deoptimizer::BailoutType); |
- |
- virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
- return Representation::None(); |
- } |
- |
- const char* reason() const { return reason_; } |
- Deoptimizer::BailoutType type() { return type_; } |
- |
- DECLARE_CONCRETE_INSTRUCTION(Deoptimize) |
- |
- private: |
- explicit HDeoptimize(const char* reason, Deoptimizer::BailoutType type) |
- : reason_(reason), type_(type) {} |
- |
- const char* reason_; |
- Deoptimizer::BailoutType type_; |
-}; |
- |
- |
// Inserts an int3/stop break instruction for debugging purposes. |
class HDebugBreak V8_FINAL : public HTemplateInstruction<0> { |
public: |
@@ -1314,6 +1298,11 @@ class HGoto V8_FINAL : public HTemplateControlInstruction<1, 0> { |
SetSuccessorAt(0, target); |
} |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE { |
+ *block = FirstSuccessor(); |
+ return true; |
+ } |
+ |
virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
return Representation::None(); |
} |
@@ -1324,6 +1313,43 @@ class HGoto V8_FINAL : public HTemplateControlInstruction<1, 0> { |
}; |
+class HDeoptimize V8_FINAL : public HTemplateControlInstruction<1, 0> { |
+ public: |
+ static HInstruction* New(Zone* zone, |
+ HValue* context, |
+ const char* reason, |
+ Deoptimizer::BailoutType type, |
+ HBasicBlock* unreachable_continuation) { |
+ return new(zone) HDeoptimize(reason, type, unreachable_continuation); |
+ } |
+ |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) { |
+ *block = NULL; |
+ return true; |
+ } |
+ |
+ virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE { |
+ return Representation::None(); |
+ } |
+ |
+ const char* reason() const { return reason_; } |
+ Deoptimizer::BailoutType type() { return type_; } |
+ |
+ DECLARE_CONCRETE_INSTRUCTION(Deoptimize) |
+ |
+ private: |
+ explicit HDeoptimize(const char* reason, |
+ Deoptimizer::BailoutType type, |
+ HBasicBlock* unreachable_continuation) |
+ : reason_(reason), type_(type) { |
+ SetSuccessorAt(0, unreachable_continuation); |
+ } |
+ |
+ const char* reason_; |
+ Deoptimizer::BailoutType type_; |
+}; |
+ |
+ |
class HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { |
public: |
HUnaryControlInstruction(HValue* value, |
@@ -1354,6 +1380,8 @@ class HBranch V8_FINAL : public HUnaryControlInstruction { |
} |
virtual Representation observed_input_representation(int index) V8_OVERRIDE; |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
ToBooleanStub::Types expected_input_types() const { |
return expected_input_types_; |
} |
@@ -3488,6 +3516,11 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { |
external_reference_value_ == |
other_constant->external_reference_value_; |
} else { |
+ if (other_constant->has_int32_value_ || |
+ other_constant->has_double_value_ || |
+ other_constant->has_external_reference_value_) { |
+ return false; |
+ } |
ASSERT(!object_.handle().is_null()); |
return other_constant->object_ == object_; |
} |
@@ -4091,10 +4124,30 @@ class HCompareHoleAndBranch V8_FINAL : public HUnaryControlInstruction { |
class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { |
public: |
+ HCompareObjectEqAndBranch(HValue* left, |
+ HValue* right, |
+ HBasicBlock* true_target = NULL, |
+ HBasicBlock* false_target = NULL) { |
+ // TODO(danno): make this private when the IfBuilder properly constructs |
+ // control flow instructions. |
+ ASSERT(!left->IsConstant() || |
+ (!HConstant::cast(left)->HasInteger32Value() || |
+ HConstant::cast(left)->HasSmiValue())); |
+ ASSERT(!right->IsConstant() || |
+ (!HConstant::cast(right)->HasInteger32Value() || |
+ HConstant::cast(right)->HasSmiValue())); |
+ SetOperandAt(0, left); |
+ SetOperandAt(1, right); |
+ SetSuccessorAt(0, true_target); |
+ SetSuccessorAt(1, false_target); |
+ } |
+ |
DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); |
DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*, |
HBasicBlock*, HBasicBlock*); |
+ virtual bool KnownSuccessorBlock(HBasicBlock** block) V8_OVERRIDE; |
+ |
HValue* left() { return OperandAt(0); } |
HValue* right() { return OperandAt(1); } |
@@ -4109,17 +4162,6 @@ class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { |
} |
DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) |
- |
- private: |
- HCompareObjectEqAndBranch(HValue* left, |
- HValue* right, |
- HBasicBlock* true_target = NULL, |
- HBasicBlock* false_target = NULL) { |
- SetOperandAt(0, left); |
- SetOperandAt(1, right); |
- SetSuccessorAt(0, true_target); |
- SetSuccessorAt(1, false_target); |
- } |
}; |