Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 733347b5b5fc87a07f0f0630be20d30df21418ab..1a0fdb6ae36ae9533d9c5d44186f6ec6b62cc72e 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -3947,11 +3947,12 @@ class HBitwiseBinaryOperation : public HBinaryOperation { |
} |
virtual void RepresentationChanged(Representation to) V8_OVERRIDE { |
- if (to.IsTagged()) { |
+ if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); |
+ if (to.IsTagged() && |
+ (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { |
SetAllSideEffects(); |
ClearFlag(kUseGVN); |
} else { |
- ASSERT(to.IsSmiOrInteger32()); |
ClearAllSideEffects(); |
SetFlag(kUseGVN); |
} |
@@ -4023,7 +4024,9 @@ class HArithmeticBinaryOperation : public HBinaryOperation { |
} |
virtual void RepresentationChanged(Representation to) V8_OVERRIDE { |
- if (to.IsTagged()) { |
+ if (to.IsTagged()) SetGVNFlag(kChangesNewSpacePromotion); |
+ if (to.IsTagged() && |
+ (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { |
SetAllSideEffects(); |
ClearFlag(kUseGVN); |
} else { |
@@ -4562,8 +4565,19 @@ class HAdd V8_FINAL : public HArithmeticBinaryOperation { |
} |
virtual void RepresentationChanged(Representation to) V8_OVERRIDE { |
- if (to.IsTagged()) ClearFlag(kAllowUndefinedAsNaN); |
- HArithmeticBinaryOperation::RepresentationChanged(to); |
+ if (to.IsTagged()) { |
+ SetGVNFlag(kChangesNewSpacePromotion); |
+ ClearFlag(kAllowUndefinedAsNaN); |
+ } |
+ if (to.IsTagged() && |
+ (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved() || |
+ left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved())) { |
+ SetAllSideEffects(); |
+ ClearFlag(kUseGVN); |
+ } else { |
+ ClearAllSideEffects(); |
+ SetFlag(kUseGVN); |
+ } |
} |
DECLARE_CONCRETE_INSTRUCTION(Add) |
@@ -6632,20 +6646,25 @@ 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()); |
- if (flags_ == STRING_ADD_CHECK_NONE) { |
+ if (MightHaveSideEffects()) { |
+ SetAllSideEffects(); |
+ } else { |
SetFlag(kUseGVN); |
SetGVNFlag(kDependsOnMaps); |
SetGVNFlag(kChangesNewSpacePromotion); |
- } else { |
- SetAllSideEffects(); |
} |
} |
+ bool MightHaveSideEffects() const { |
+ return flags_ != STRING_ADD_CHECK_NONE && |
+ (left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved()); |
+ } |
+ |
// No side-effects except possible allocation: |
// NOTE: this instruction does not call ToString() on its inputs, when flags_ |
// is set to STRING_ADD_CHECK_NONE. |
virtual bool IsDeletable() const V8_OVERRIDE { |
- return flags_ == STRING_ADD_CHECK_NONE; |
+ return !MightHaveSideEffects(); |
} |
const StringAddFlags flags_; |