| Index: src/hydrogen-instructions.cc
|
| diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
|
| index 09f20b93f0b375597d52acb1fcc22f78c07210ba..7dd604b5f805e1adef0d5b1599632b58234f0e05 100644
|
| --- a/src/hydrogen-instructions.cc
|
| +++ b/src/hydrogen-instructions.cc
|
| @@ -74,33 +74,26 @@ void HValue::InferRepresentation(HInferRepresentationPhase* h_infer) {
|
|
|
| Representation HValue::RepresentationFromUses() {
|
| if (HasNoUses()) return Representation::None();
|
| -
|
| - // Array of use counts for each representation.
|
| - int use_count[Representation::kNumRepresentations] = { 0 };
|
| + Representation result = Representation::None();
|
|
|
| for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
|
| HValue* use = it.value();
|
| Representation rep = use->observed_input_representation(it.index());
|
| - if (rep.IsNone()) continue;
|
| + result = result.generalize(rep);
|
| +
|
| if (FLAG_trace_representation) {
|
| PrintF("#%d %s is used by #%d %s as %s%s\n",
|
| id(), Mnemonic(), use->id(), use->Mnemonic(), rep.Mnemonic(),
|
| (use->CheckFlag(kTruncatingToInt32) ? "-trunc" : ""));
|
| }
|
| - use_count[rep.kind()] += 1;
|
| }
|
| - if (IsPhi()) HPhi::cast(this)->AddIndirectUsesTo(&use_count[0]);
|
| - int tagged_count = use_count[Representation::kTagged];
|
| - int double_count = use_count[Representation::kDouble];
|
| - int int32_count = use_count[Representation::kInteger32];
|
| - int smi_count = use_count[Representation::kSmi];
|
| -
|
| - if (tagged_count > 0) return Representation::Tagged();
|
| - if (double_count > 0) return Representation::Double();
|
| - if (int32_count > 0) return Representation::Integer32();
|
| - if (smi_count > 0) return Representation::Smi();
|
| + if (IsPhi()) {
|
| + result = result.generalize(
|
| + HPhi::cast(this)->representation_from_indirect_uses());
|
| + }
|
|
|
| - return Representation::None();
|
| + // External representations are dealt with separately.
|
| + return result.IsExternal() ? Representation::None() : result;
|
| }
|
|
|
|
|
| @@ -2484,11 +2477,8 @@ std::ostream& HPhi::PrintTo(std::ostream& os) const { // NOLINT
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| os << " " << NameOf(OperandAt(i)) << " ";
|
| }
|
| - return os << " uses:" << UseCount() << "_"
|
| - << smi_non_phi_uses() + smi_indirect_uses() << "s_"
|
| - << int32_non_phi_uses() + int32_indirect_uses() << "i_"
|
| - << double_non_phi_uses() + double_indirect_uses() << "d_"
|
| - << tagged_non_phi_uses() + tagged_indirect_uses() << "t"
|
| + return os << " uses" << UseCount()
|
| + << representation_from_indirect_uses().Mnemonic() << " "
|
| << TypeOf(this) << "]";
|
| }
|
|
|
| @@ -2547,7 +2537,12 @@ void HPhi::InitRealUses(int phi_id) {
|
| HValue* value = it.value();
|
| if (!value->IsPhi()) {
|
| Representation rep = value->observed_input_representation(it.index());
|
| - non_phi_uses_[rep.kind()] += 1;
|
| + representation_from_non_phi_uses_ =
|
| + representation_from_non_phi_uses().generalize(rep);
|
| + if (rep.IsSmi() || rep.IsInteger32() || rep.IsDouble()) {
|
| + has_type_feedback_from_uses_ = true;
|
| + }
|
| +
|
| if (FLAG_trace_representation) {
|
| PrintF("#%d Phi is used by real #%d %s as %s\n",
|
| id(), value->id(), value->Mnemonic(), rep.Mnemonic());
|
| @@ -2567,24 +2562,16 @@ void HPhi::InitRealUses(int phi_id) {
|
|
|
| void HPhi::AddNonPhiUsesFrom(HPhi* other) {
|
| if (FLAG_trace_representation) {
|
| - PrintF("adding to #%d Phi uses of #%d Phi: s%d i%d d%d t%d\n",
|
| - id(), other->id(),
|
| - other->non_phi_uses_[Representation::kSmi],
|
| - other->non_phi_uses_[Representation::kInteger32],
|
| - other->non_phi_uses_[Representation::kDouble],
|
| - other->non_phi_uses_[Representation::kTagged]);
|
| + PrintF(
|
| + "generalizing use representation '%s' of #%d Phi "
|
| + "with uses of #%d Phi '%s'\n",
|
| + representation_from_indirect_uses().Mnemonic(), id(), other->id(),
|
| + other->representation_from_non_phi_uses().Mnemonic());
|
| }
|
|
|
| - for (int i = 0; i < Representation::kNumRepresentations; i++) {
|
| - indirect_uses_[i] += other->non_phi_uses_[i];
|
| - }
|
| -}
|
| -
|
| -
|
| -void HPhi::AddIndirectUsesTo(int* dest) {
|
| - for (int i = 0; i < Representation::kNumRepresentations; i++) {
|
| - dest[i] += indirect_uses_[i];
|
| - }
|
| + representation_from_indirect_uses_ =
|
| + representation_from_indirect_uses().generalize(
|
| + other->representation_from_non_phi_uses());
|
| }
|
|
|
|
|
| @@ -4422,13 +4409,13 @@ void HPhi::InferRepresentation(HInferRepresentationPhase* h_infer) {
|
|
|
|
|
| Representation HPhi::RepresentationFromInputs() {
|
| - bool has_type_feedback =
|
| - smi_non_phi_uses() + int32_non_phi_uses() + double_non_phi_uses() > 0;
|
| Representation r = representation();
|
| for (int i = 0; i < OperandCount(); ++i) {
|
| // Ignore conservative Tagged assumption of parameters if we have
|
| // reason to believe that it's too conservative.
|
| - if (has_type_feedback && OperandAt(i)->IsParameter()) continue;
|
| + if (has_type_feedback_from_uses() && OperandAt(i)->IsParameter()) {
|
| + continue;
|
| + }
|
|
|
| r = r.generalize(OperandAt(i)->KnownOptimalRepresentation());
|
| }
|
|
|