Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/src/crankshaft/hydrogen-instructions.h b/src/crankshaft/hydrogen-instructions.h
index fdb1fd6..9a757c8 100644
--- a/src/crankshaft/hydrogen-instructions.h
+++ b/src/crankshaft/hydrogen-instructions.h
@@ -77,7 +77,6 @@
V(CompareObjectEqAndBranch) \
V(CompareMap) \
V(Constant) \
- V(ConstructDouble) \
V(Context) \
V(DebugBreak) \
V(DeclareGlobals) \
@@ -1691,34 +1690,6 @@
};
-class HConstructDouble final : public HTemplateInstruction<2> {
- public:
- DECLARE_INSTRUCTION_FACTORY_P2(HConstructDouble, HValue*, HValue*);
-
- Representation RequiredInputRepresentation(int index) override {
- return Representation::Integer32();
- }
-
- DECLARE_CONCRETE_INSTRUCTION(ConstructDouble)
-
- HValue* hi() { return OperandAt(0); }
- HValue* lo() { return OperandAt(1); }
-
- protected:
- bool DataEquals(HValue* other) override { return true; }
-
- private:
- explicit HConstructDouble(HValue* hi, HValue* lo) {
- set_representation(Representation::Double());
- SetFlag(kUseGVN);
- SetOperandAt(0, hi);
- SetOperandAt(1, lo);
- }
-
- bool IsDeletable() const override { return true; }
-};
-
-
enum RemovableSimulate {
REMOVABLE_SIMULATE,
FIXED_SIMULATE
@@ -2161,8 +2132,6 @@
this->SetAllSideEffects();
}
- HType CalculateInferredType() final { return HType::Tagged(); }
-
virtual int argument_count() const {
return argument_count_;
}
@@ -2240,8 +2209,6 @@
DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor)
- HType CalculateInferredType() final { return HType::Tagged(); }
-
// Defines whether this instruction corresponds to a JS call at tail position.
TailCallMode syntactic_tail_call_mode() const {
return SyntacticTailCallModeField::decode(bit_field_);
@@ -2457,9 +2424,11 @@
return Representation::Tagged();
} else {
switch (op_) {
+ case kMathCos:
case kMathFloor:
case kMathRound:
case kMathFround:
+ case kMathSin:
case kMathSqrt:
case kMathPowHalf:
case kMathLog:
@@ -2528,9 +2497,11 @@
// is tagged, and not when it is an unboxed double or unboxed integer.
SetChangesFlag(kNewSpacePromotion);
break;
+ case kMathCos:
case kMathFround:
case kMathLog:
case kMathExp:
+ case kMathSin:
case kMathSqrt:
case kMathPowHalf:
set_representation(Representation::Double());
@@ -2790,6 +2761,7 @@
enum Check {
IS_JS_RECEIVER,
IS_JS_ARRAY,
+ IS_JS_FUNCTION,
IS_JS_DATE,
IS_STRING,
IS_INTERNALIZED_STRING,
@@ -2808,6 +2780,8 @@
switch (check_) {
case IS_JS_RECEIVER: return HType::JSReceiver();
case IS_JS_ARRAY: return HType::JSArray();
+ case IS_JS_FUNCTION:
+ return HType::JSObject();
case IS_JS_DATE: return HType::JSObject();
case IS_STRING: return HType::String();
case IS_INTERNALIZED_STRING: return HType::String();
@@ -3766,6 +3740,7 @@
: HBinaryOperation(context, left, right, type) {
SetFlag(kFlexibleRepresentation);
SetFlag(kTruncatingToInt32);
+ SetFlag(kAllowUndefinedAsNaN);
SetAllSideEffects();
}
@@ -4374,6 +4349,11 @@
SetChangesFlag(kNewSpacePromotion);
ClearFlag(kAllowUndefinedAsNaN);
}
+ if (!right()->type().IsTaggedNumber() &&
+ !right()->representation().IsDouble() &&
+ !right()->representation().IsSmiOrInteger32()) {
+ ClearFlag(kAllowUndefinedAsNaN);
+ }
}
Representation RepresentationFromInputs() override;
@@ -4872,26 +4852,20 @@
HPhi* incoming_value_;
};
-
-class HLoadGlobalGeneric final : public HTemplateInstruction<2> {
+class HLoadGlobalGeneric final : public HTemplateInstruction<1> {
public:
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*,
- Handle<String>, TypeofMode);
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HLoadGlobalGeneric,
+ Handle<String>, TypeofMode,
+ Handle<TypeFeedbackVector>,
+ FeedbackVectorSlot);
HValue* context() { return OperandAt(0); }
- HValue* global_object() { return OperandAt(1); }
Handle<String> name() const { return name_; }
TypeofMode typeof_mode() const { return typeof_mode_; }
FeedbackVectorSlot slot() const { return slot_; }
Handle<TypeFeedbackVector> feedback_vector() const {
return feedback_vector_;
}
- bool HasVectorAndSlot() const { return true; }
- void SetVectorAndSlot(Handle<TypeFeedbackVector> vector,
- FeedbackVectorSlot slot) {
- feedback_vector_ = vector;
- slot_ = slot;
- }
std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
@@ -4902,11 +4876,14 @@
DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric)
private:
- HLoadGlobalGeneric(HValue* context, HValue* global_object,
- Handle<String> name, TypeofMode typeof_mode)
- : name_(name), typeof_mode_(typeof_mode) {
+ HLoadGlobalGeneric(HValue* context, Handle<String> name,
+ TypeofMode typeof_mode, Handle<TypeFeedbackVector> vector,
+ FeedbackVectorSlot slot)
+ : name_(name),
+ typeof_mode_(typeof_mode),
+ feedback_vector_(vector),
+ slot_(slot) {
SetOperandAt(0, context);
- SetOperandAt(1, global_object);
set_representation(Representation::Tagged());
SetAllSideEffects();
}
@@ -5148,8 +5125,11 @@
HAllocate* allocate = HAllocate::cast(object);
if (allocate->IsAllocationFolded()) {
HValue* dominator = allocate->allocation_folding_dominator();
- DCHECK(HAllocate::cast(dominator)->IsAllocationFoldingDominator());
- object = dominator;
+ // There is no guarantee that all allocations are folded together because
+ // GVN performs a fixpoint.
+ if (HAllocate::cast(dominator)->IsAllocationFoldingDominator()) {
+ object = dominator;
+ }
}
}
@@ -5566,6 +5546,19 @@
Handle<Name>::null(), false, false);
}
+ static HObjectAccess ForBoundTargetFunction() {
+ return HObjectAccess(kInobject,
+ JSBoundFunction::kBoundTargetFunctionOffset);
+ }
+
+ static HObjectAccess ForBoundThis() {
+ return HObjectAccess(kInobject, JSBoundFunction::kBoundThisOffset);
+ }
+
+ static HObjectAccess ForBoundArguments() {
+ return HObjectAccess(kInobject, JSBoundFunction::kBoundArgumentsOffset);
+ }
+
// Create an access to an offset in a fixed array header.
static HObjectAccess ForFixedArrayHeader(int offset);
@@ -5887,26 +5880,19 @@
class HLoadNamedGeneric final : public HTemplateInstruction<2> {
public:
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadNamedGeneric, HValue*,
- Handle<Name>, InlineCacheState);
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HLoadNamedGeneric, HValue*,
+ Handle<Name>,
+ Handle<TypeFeedbackVector>,
+ FeedbackVectorSlot);
HValue* context() const { return OperandAt(0); }
HValue* object() const { return OperandAt(1); }
Handle<Name> name() const { return name_; }
- InlineCacheState initialization_state() const {
- return initialization_state_;
- }
FeedbackVectorSlot slot() const { return slot_; }
Handle<TypeFeedbackVector> feedback_vector() const {
return feedback_vector_;
}
- bool HasVectorAndSlot() const { return true; }
- void SetVectorAndSlot(Handle<TypeFeedbackVector> vector,
- FeedbackVectorSlot slot) {
- feedback_vector_ = vector;
- slot_ = slot;
- }
Representation RequiredInputRepresentation(int index) override {
return Representation::Tagged();
@@ -5918,9 +5904,8 @@
private:
HLoadNamedGeneric(HValue* context, HValue* object, Handle<Name> name,
- InlineCacheState initialization_state)
- : name_(name),
- initialization_state_(initialization_state) {
+ Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
+ : name_(name), feedback_vector_(vector), slot_(slot) {
SetOperandAt(0, context);
SetOperandAt(1, object);
set_representation(Representation::Tagged());
@@ -5930,7 +5915,6 @@
Handle<Name> name_;
Handle<TypeFeedbackVector> feedback_vector_;
FeedbackVectorSlot slot_;
- InlineCacheState initialization_state_;
};
@@ -6172,27 +6156,17 @@
class HLoadKeyedGeneric final : public HTemplateInstruction<3> {
public:
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadKeyedGeneric, HValue*,
- HValue*, InlineCacheState);
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HLoadKeyedGeneric, HValue*,
+ HValue*,
+ Handle<TypeFeedbackVector>,
+ FeedbackVectorSlot);
HValue* object() const { return OperandAt(0); }
HValue* key() const { return OperandAt(1); }
HValue* context() const { return OperandAt(2); }
- InlineCacheState initialization_state() const {
- return initialization_state_;
- }
FeedbackVectorSlot slot() const { return slot_; }
Handle<TypeFeedbackVector> feedback_vector() const {
return feedback_vector_;
}
- bool HasVectorAndSlot() const {
- DCHECK(initialization_state_ == MEGAMORPHIC || !feedback_vector_.is_null());
- return !feedback_vector_.is_null();
- }
- void SetVectorAndSlot(Handle<TypeFeedbackVector> vector,
- FeedbackVectorSlot slot) {
- feedback_vector_ = vector;
- slot_ = slot;
- }
std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
@@ -6207,8 +6181,8 @@
private:
HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key,
- InlineCacheState initialization_state)
- : initialization_state_(initialization_state) {
+ Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
+ : feedback_vector_(vector), slot_(slot) {
set_representation(Representation::Tagged());
SetOperandAt(0, obj);
SetOperandAt(1, key);
@@ -6218,7 +6192,6 @@
Handle<TypeFeedbackVector> feedback_vector_;
FeedbackVectorSlot slot_;
- InlineCacheState initialization_state_;
};
@@ -6380,20 +6353,18 @@
uint32_t bit_field_;
};
-
class HStoreNamedGeneric final : public HTemplateInstruction<3> {
public:
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(HStoreNamedGeneric, HValue*,
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(HStoreNamedGeneric, HValue*,
Handle<Name>, HValue*,
- LanguageMode, InlineCacheState);
+ LanguageMode,
+ Handle<TypeFeedbackVector>,
+ FeedbackVectorSlot);
HValue* object() const { return OperandAt(0); }
HValue* value() const { return OperandAt(1); }
HValue* context() const { return OperandAt(2); }
Handle<Name> name() const { return name_; }
LanguageMode language_mode() const { return language_mode_; }
- InlineCacheState initialization_state() const {
- return initialization_state_;
- }
std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
@@ -6405,22 +6376,17 @@
Handle<TypeFeedbackVector> feedback_vector() const {
return feedback_vector_;
}
- bool HasVectorAndSlot() const { return true; }
- void SetVectorAndSlot(Handle<TypeFeedbackVector> vector,
- FeedbackVectorSlot slot) {
- feedback_vector_ = vector;
- slot_ = slot;
- }
DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric)
private:
HStoreNamedGeneric(HValue* context, HValue* object, Handle<Name> name,
HValue* value, LanguageMode language_mode,
- InlineCacheState initialization_state)
+ Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
: name_(name),
- language_mode_(language_mode),
- initialization_state_(initialization_state) {
+ feedback_vector_(vector),
+ slot_(slot),
+ language_mode_(language_mode) {
SetOperandAt(0, object);
SetOperandAt(1, value);
SetOperandAt(2, context);
@@ -6431,10 +6397,8 @@
Handle<TypeFeedbackVector> feedback_vector_;
FeedbackVectorSlot slot_;
LanguageMode language_mode_;
- InlineCacheState initialization_state_;
};
-
class HStoreKeyed final : public HTemplateInstruction<4>,
public ArrayInstructionInterface {
public:
@@ -6617,21 +6581,18 @@
HValue* dominator_;
};
-
class HStoreKeyedGeneric final : public HTemplateInstruction<4> {
public:
- DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(HStoreKeyedGeneric, HValue*,
+ DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P6(HStoreKeyedGeneric, HValue*,
HValue*, HValue*, LanguageMode,
- InlineCacheState);
+ Handle<TypeFeedbackVector>,
+ FeedbackVectorSlot);
HValue* object() const { return OperandAt(0); }
HValue* key() const { return OperandAt(1); }
HValue* value() const { return OperandAt(2); }
HValue* context() const { return OperandAt(3); }
LanguageMode language_mode() const { return language_mode_; }
- InlineCacheState initialization_state() const {
- return initialization_state_;
- }
Representation RequiredInputRepresentation(int index) override {
// tagged[tagged] = tagged
@@ -6642,14 +6603,6 @@
Handle<TypeFeedbackVector> feedback_vector() const {
return feedback_vector_;
}
- bool HasVectorAndSlot() const {
- return !feedback_vector_.is_null();
- }
- void SetVectorAndSlot(Handle<TypeFeedbackVector> vector,
- FeedbackVectorSlot slot) {
- feedback_vector_ = vector;
- slot_ = slot;
- }
std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT
@@ -6658,9 +6611,8 @@
private:
HStoreKeyedGeneric(HValue* context, HValue* object, HValue* key,
HValue* value, LanguageMode language_mode,
- InlineCacheState initialization_state)
- : language_mode_(language_mode),
- initialization_state_(initialization_state) {
+ Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
+ : feedback_vector_(vector), slot_(slot), language_mode_(language_mode) {
SetOperandAt(0, object);
SetOperandAt(1, key);
SetOperandAt(2, value);
@@ -6671,10 +6623,8 @@
Handle<TypeFeedbackVector> feedback_vector_;
FeedbackVectorSlot slot_;
LanguageMode language_mode_;
- InlineCacheState initialization_state_;
};
-
class HTransitionElementsKind final : public HTemplateInstruction<2> {
public:
inline static HTransitionElementsKind* New(Isolate* isolate, Zone* zone,