From 6e1507331e7811b838a1737b0c6b1f079ddc5662 Mon Sep 17 00:00:00 2001 From: "yangguo@chromium.org" Date: Tue, 11 Mar 2014 13:34:01 +0000 Subject: [PATCH] Fix bug in constant folding object comparisons. R=jkummerow@chromium.org Review URL: https://codereview.chromium.org/195063002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19798 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-instructions.cc | 2 +- src/hydrogen-instructions.h | 53 +++++++++++++------------- test/mjsunit/regress/regress-346587.js | 18 +++++++++ 3 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 test/mjsunit/regress/regress-346587.js diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index 79c7964d15..ba8d03b6f6 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -3056,7 +3056,7 @@ void HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) { bool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) { if (FLAG_fold_constants && left()->IsConstant() && right()->IsConstant()) { - *block = HConstant::cast(left())->Equals(HConstant::cast(right())) + *block = HConstant::cast(left())->DataEquals(HConstant::cast(right())) ? FirstSuccessor() : SecondSuccessor(); return true; } diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index c618fdfb54..76d8dfb906 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -3584,15 +3584,6 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { return object_.IsInitialized() && object_ == other; } -#ifdef DEBUG - virtual void Verify() V8_OVERRIDE { } -#endif - - DECLARE_CONCRETE_INSTRUCTION(Constant) - - protected: - virtual Range* InferRange(Zone* zone) V8_OVERRIDE; - virtual bool DataEquals(HValue* other) V8_OVERRIDE { HConstant* other_constant = HConstant::cast(other); if (has_int32_value_) { @@ -3617,6 +3608,15 @@ class HConstant V8_FINAL : public HTemplateInstruction<0> { } } +#ifdef DEBUG + virtual void Verify() V8_OVERRIDE { } +#endif + + DECLARE_CONCRETE_INSTRUCTION(Constant) + + protected: + virtual Range* InferRange(Zone* zone) V8_OVERRIDE; + private: friend class HGraph; HConstant(Handle handle, Representation r = Representation::None()); @@ -4280,24 +4280,6 @@ class HCompareMinusZeroAndBranch 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*); @@ -4318,6 +4300,23 @@ class HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { } DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) + + private: + HCompareObjectEqAndBranch(HValue* left, + HValue* right, + HBasicBlock* true_target = NULL, + HBasicBlock* false_target = NULL) { + 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); + } }; diff --git a/test/mjsunit/regress/regress-346587.js b/test/mjsunit/regress/regress-346587.js new file mode 100644 index 0000000000..40e3ac116c --- /dev/null +++ b/test/mjsunit/regress/regress-346587.js @@ -0,0 +1,18 @@ +// Copyright 2014 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --fold-constants --allow-natives-syntax + +function bar(obj) { + assertTrue(obj.x === 'baz'); +} + +function foo() { + bar({ x : 'baz' }); +} + +foo(); +foo(); +%OptimizeFunctionOnNextCall(foo); +foo();