Index: src/hydrogen-instructions.h |
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h |
index 9f52569ccf60fa1a03a7a6aafc178f991a22b6d6..e529fb5823fbd4b4a961177982f5a083850d646e 100644 |
--- a/src/hydrogen-instructions.h |
+++ b/src/hydrogen-instructions.h |
@@ -885,7 +885,17 @@ class HValue: public ZoneObject { |
} |
virtual void AssumeRepresentation(Representation r); |
- virtual bool IsConvertibleToInteger() const { return true; } |
+ virtual Representation KnownOptimalRepresentation() { |
+ Representation r = representation(); |
+ if (r.IsTagged()) { |
+ HType t = type(); |
+ if (t.IsSmi()) return Representation::Smi(); |
+ if (t.IsHeapNumber()) return Representation::Double(); |
+ if (t.IsHeapObject()) return r; |
+ return Representation::None(); |
+ } |
+ return r; |
+ } |
HType type() const { return type_; } |
void set_type(HType new_type) { |
@@ -2449,7 +2459,7 @@ class HMapEnumLength: public HUnaryOperation { |
public: |
explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { |
set_type(HType::Smi()); |
- set_representation(Representation::Tagged()); |
+ set_representation(Representation::Smi()); |
SetFlag(kUseGVN); |
SetGVNFlag(kDependsOnMaps); |
} |
@@ -2940,8 +2950,7 @@ class HPhi: public HValue { |
HPhi(int merged_index, Zone* zone) |
: inputs_(2, zone), |
merged_index_(merged_index), |
- phi_id_(-1), |
- is_convertible_to_integer_(true) { |
+ phi_id_(-1) { |
for (int i = 0; i < Representation::kNumRepresentations; i++) { |
non_phi_uses_[i] = 0; |
indirect_uses_[i] = 0; |
@@ -2959,6 +2968,9 @@ class HPhi: public HValue { |
virtual Representation RequiredInputRepresentation(int index) { |
return representation(); |
} |
+ virtual Representation KnownOptimalRepresentation() { |
+ return representation(); |
+ } |
virtual HType CalculateInferredType(); |
virtual int OperandCount() { return inputs_.length(); } |
virtual HValue* OperandAt(int index) const { return inputs_[index]; } |
@@ -3014,28 +3026,6 @@ class HPhi: public HValue { |
} |
virtual Opcode opcode() const { return HValue::kPhi; } |
- virtual bool IsConvertibleToInteger() const { |
- return is_convertible_to_integer_; |
- } |
- |
- void set_is_convertible_to_integer(bool b) { |
- is_convertible_to_integer_ = b; |
- } |
- |
- bool AllOperandsConvertibleToInteger() { |
- for (int i = 0; i < OperandCount(); ++i) { |
- if (!OperandAt(i)->IsConvertibleToInteger()) { |
- if (FLAG_trace_representation) { |
- HValue* input = OperandAt(i); |
- PrintF("#%d %s: Input #%d %s at %d is NCTI\n", |
- id(), Mnemonic(), input->id(), input->Mnemonic(), i); |
- } |
- return false; |
- } |
- } |
- return true; |
- } |
- |
void SimplifyConstantInputs(); |
// TODO(titzer): we can't eliminate the receiver for generating backtraces |
@@ -3059,7 +3049,6 @@ class HPhi: public HValue { |
int non_phi_uses_[Representation::kNumRepresentations]; |
int indirect_uses_[Representation::kNumRepresentations]; |
int phi_id_; |
- bool is_convertible_to_integer_; |
}; |
@@ -3196,8 +3185,11 @@ class HConstant: public HTemplateInstruction<0> { |
return Representation::None(); |
} |
- virtual bool IsConvertibleToInteger() const { |
- return has_int32_value_; |
+ virtual Representation KnownOptimalRepresentation() { |
+ if (HasSmiValue()) return Representation::Smi(); |
+ if (HasInteger32Value()) return Representation::Integer32(); |
+ if (HasNumberValue()) return Representation::Double(); |
+ return Representation::Tagged(); |
} |
virtual bool EmitAtUses() { return !representation().IsDouble(); } |
@@ -3211,9 +3203,7 @@ class HConstant: public HTemplateInstruction<0> { |
ASSERT(HasInteger32Value()); |
return int32_value_; |
} |
- bool HasSmiValue() const { |
- return has_smi_value_; |
- } |
+ bool HasSmiValue() const { return has_smi_value_; } |
bool HasDoubleValue() const { return has_double_value_; } |
double DoubleValue() const { |
ASSERT(HasDoubleValue()); |
@@ -4716,6 +4706,11 @@ class HUnknownOSRValue: public HTemplateInstruction<0> { |
return incoming_value_; |
} |
+ virtual Representation KnownOptimalRepresentation() { |
+ if (incoming_value_ == NULL) return Representation::None(); |
+ return incoming_value_->KnownOptimalRepresentation(); |
+ } |
+ |
DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) |
private: |