| 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);
|
| - }
|
| };
|
|
|
|
|
|
|