| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index 7d33141a4f61c150320d02aaceb2c74218506b66..9dc4dc72da4e5d1f214437c8d1b5c48e8ea18cd8 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -1303,6 +1303,8 @@ class HDeoptimize V8_FINAL : public HTemplateInstruction<0> {
|
| // Inserts an int3/stop break instruction for debugging purposes.
|
| class HDebugBreak V8_FINAL : public HTemplateInstruction<0> {
|
| public:
|
| + DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak)
|
| +
|
| virtual Representation RequiredInputRepresentation(int index) V8_OVERRIDE {
|
| return Representation::None();
|
| }
|
| @@ -3879,16 +3881,21 @@ class HBitwiseBinaryOperation : public HBinaryOperation {
|
| SetFlag(kTruncatingToInt32);
|
| SetFlag(kAllowUndefinedAsNaN);
|
| SetAllSideEffects();
|
| + if (left->IsForceRepresentation()) {
|
| + left->SetFlag(kTruncatingToInt32);
|
| + }
|
| + if (right->IsForceRepresentation()) {
|
| + right->SetFlag(kTruncatingToInt32);
|
| + }
|
| }
|
|
|
| virtual void RepresentationChanged(Representation to) V8_OVERRIDE {
|
| - if (!to.IsTagged()) {
|
| - ASSERT(to.IsSmiOrInteger32());
|
| - ClearAllSideEffects();
|
| - SetFlag(kUseGVN);
|
| - } else {
|
| + if (to.IsTagged()) {
|
| SetAllSideEffects();
|
| ClearFlag(kUseGVN);
|
| + } else {
|
| + ClearAllSideEffects();
|
| + SetFlag(kUseGVN);
|
| }
|
| }
|
|
|
| @@ -4522,10 +4529,12 @@ class HMul V8_FINAL : public HArithmeticBinaryOperation {
|
| HValue* right);
|
|
|
| static HInstruction* NewImul(Zone* zone,
|
| - HValue* context,
|
| - HValue* left,
|
| - HValue* right) {
|
| - HMul* mul = new(zone) HMul(context, left, right);
|
| + HValue* context,
|
| + HValue* left,
|
| + HValue* right) {
|
| + HInstruction* instr = HMul::New(zone, context, left, right);
|
| + if (!instr->IsMul()) return instr;
|
| + HMul* mul = HMul::cast(instr);
|
| // TODO(mstarzinger): Prevent bailout on minus zero for imul.
|
| mul->AssumeRepresentation(Representation::Integer32());
|
| mul->ClearFlag(HValue::kCanOverflow);
|
| @@ -6492,14 +6501,20 @@ class HStringAdd V8_FINAL : public HBinaryOperation {
|
| HStringAdd(HValue* context, HValue* left, HValue* right, StringAddFlags flags)
|
| : HBinaryOperation(context, left, right, HType::String()), flags_(flags) {
|
| set_representation(Representation::Tagged());
|
| - SetFlag(kUseGVN);
|
| - SetGVNFlag(kDependsOnMaps);
|
| - SetGVNFlag(kChangesNewSpacePromotion);
|
| + if (flags_ == STRING_ADD_CHECK_NONE) {
|
| + SetFlag(kUseGVN);
|
| + SetGVNFlag(kDependsOnMaps);
|
| + SetGVNFlag(kChangesNewSpacePromotion);
|
| + } else {
|
| + SetAllSideEffects();
|
| + }
|
| }
|
|
|
| // No side-effects except possible allocation.
|
| // NOTE: this instruction _does not_ call ToString() on its inputs.
|
| - virtual bool IsDeletable() const V8_OVERRIDE { return true; }
|
| + virtual bool IsDeletable() const V8_OVERRIDE {
|
| + return flags_ == STRING_ADD_CHECK_NONE;
|
| + }
|
|
|
| const StringAddFlags flags_;
|
| };
|
|
|