Chromium Code Reviews| Index: src/hydrogen-representation-changes.cc |
| diff --git a/src/hydrogen-representation-changes.cc b/src/hydrogen-representation-changes.cc |
| index b916d9b302fa443d438510ebcfc99e32fd37f5d5..eb9c3ea6282f648a38cc2a47b6bf95cff80824b2 100644 |
| --- a/src/hydrogen-representation-changes.cc |
| +++ b/src/hydrogen-representation-changes.cc |
| @@ -51,6 +51,18 @@ void HRepresentationChangesPhase::InsertRepresentationChangeForUse( |
| } |
| +static bool HChangeCanDeoptForUse(HChange* change, HValue* use, int use_index) { |
|
Jakob Kummerow
2014/06/12 10:16:49
I don't like that this function's name doesn't mat
|
| + Representation change_rep = change->RequiredInputRepresentation(0); |
|
Jakob Kummerow
2014/06/12 10:16:49
It's cleaner to use change->from()...
|
| + Representation use_rep = use->RequiredInputRepresentation(use_index); |
|
Jakob Kummerow
2014/06/12 10:16:49
...and change->to().
|
| + if (change_rep.IsSmiOrInteger32() && use_rep.IsSmiOrInteger32() && |
| + (change->CheckFlag(HValue::kUint32) == use->CheckFlag(HValue::kUint32)) && |
|
Jakob Kummerow
2014/06/12 10:16:49
Representation changes are inserted before the uin
|
| + SmiValuesAre32Bits()) { |
| + return false; |
| + } |
| + return true; |
| +} |
| + |
| + |
| void HRepresentationChangesPhase::InsertRepresentationChangesForValue( |
| HValue* value) { |
| Representation r = value->representation(); |
| @@ -65,17 +77,32 @@ void HRepresentationChangesPhase::InsertRepresentationChangesForValue( |
| int use_index = it.index(); |
| Representation req = use_value->RequiredInputRepresentation(use_index); |
| if (req.IsNone() || req.Equals(r)) continue; |
| + |
| + // If this is an HForceRepresentation instruction, and an HChange has been |
| + // inserted above it, examine the input representation of the HChange to see |
| + // if it satisfies any of the HForceRepresentation's uses. If so, and the |
| + // HChange can't deopt, set the input of the use to the input of the |
| + // HChange. |
| + if (value->IsForceRepresentation()) { |
| + HValue* parent = HForceRepresentation::cast(value)->value(); |
|
Jakob Kummerow
2014/06/12 10:16:49
nit: we don't use "parent" for instructions (they
|
| + if (parent->IsChange() && |
| + parent->RequiredInputRepresentation(0).Equals(req) && |
|
Jakob Kummerow
2014/06/12 10:16:49
again, s/parent->RequiredInputRepresentation(0)/HC
|
| + !HChangeCanDeoptForUse(HChange::cast(parent), value, 0)) { |
| + use_value->SetOperandAt(use_index, HChange::cast(parent)->value()); |
| + continue; |
| + } |
| + } |
| InsertRepresentationChangeForUse(value, use_value, use_index, req); |
| } |
| if (value->HasNoUses()) { |
| - ASSERT(value->IsConstant()); |
| + ASSERT(value->IsConstant() || value->IsForceRepresentation()); |
| value->DeleteAndReplaceWith(NULL); |
| - } |
| - |
| - // The only purpose of a HForceRepresentation is to represent the value |
| - // after the (possible) HChange instruction. We make it disappear. |
| - if (value->IsForceRepresentation()) { |
| - value->DeleteAndReplaceWith(HForceRepresentation::cast(value)->value()); |
| + } else { |
| + // The only purpose of a HForceRepresentation is to represent the value |
| + // after the (possible) HChange instruction. We make it disappear. |
| + if (value->IsForceRepresentation()) { |
| + value->DeleteAndReplaceWith(HForceRepresentation::cast(value)->value()); |
| + } |
| } |
| } |