Chromium Code Reviews| Index: src/compiler/simplified-lowering.cc |
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
| index b86837d244c0e880e667a9574b885bbae095d52a..fa044593b7904e2e37cd00ce3656cc432a3e5289 100644 |
| --- a/src/compiler/simplified-lowering.cc |
| +++ b/src/compiler/simplified-lowering.cc |
| @@ -273,62 +273,62 @@ class RepresentationSelector { |
| // Helper for handling phis. |
| void VisitPhi(Node* node, MachineTypeUnion use, |
| SimplifiedLowering* lowering) { |
| - // First, propagate the usage information to inputs of the phi. |
| - if (!lower()) { |
| - int values = OperatorProperties::GetValueInputCount(node->op()); |
| - // Propagate {use} of the phi to value inputs, and 0 to control. |
| - Node::Inputs inputs = node->inputs(); |
| - for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); |
| - ++iter, --values) { |
| - // TODO(titzer): it'd be nice to have distinguished edge kinds here. |
| - ProcessInput(node, iter.index(), values > 0 ? use : 0); |
| - } |
| - } |
| - // Phis adapt to whatever output representation their uses demand, |
| - // pushing representation changes to their inputs. |
| - MachineTypeUnion use_rep = GetUseInfo(node) & kRepMask; |
| + // Phis adapt to the output representation their uses demand, pushing |
| + // representation changes to their inputs. |
| Type* upper = NodeProperties::GetBounds(node).upper; |
| - MachineTypeUnion phi_type = changer_->TypeFromUpperBound(upper); |
| - MachineTypeUnion rep = 0; |
| - if (use_rep & kRepTagged) { |
| - rep = kRepTagged; // Tagged overrides everything. |
| - } else if (use_rep & kRepFloat32) { |
| - rep = kRepFloat32; |
| - } else if (use_rep & kRepFloat64) { |
| - rep = kRepFloat64; |
| - } else if (use_rep & kRepWord64) { |
| - rep = kRepWord64; |
| - } else if (use_rep & kRepWord32) { |
| - if (phi_type & kTypeNumber) { |
| - rep = kRepFloat64; |
| + MachineType output = kMachNone; |
| + MachineType prop = kMachNone; |
|
Jarin
2014/10/08 15:12:03
How about expanding to {propagate}?
titzer
2014/10/15 11:51:49
Done.
|
| + |
| + if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) { |
| + // legal = kRepTagged | kRepFloat64 | kRepWord32; |
| + if ((use & kRepMask) == kRepTagged) { |
| + // only tagged uses. |
| + output = kRepTagged; |
| + prop = kRepTagged; |
| + } else if ((use & kRepMask) == kRepFloat64) { |
| + // only float64 uses. |
| + output = kRepFloat64; |
| + prop = kRepFloat64; |
| } else { |
| - rep = kRepWord32; |
| + // multiple uses. |
| + output = kRepWord32; |
| + prop = kRepWord32; |
| } |
| - } else if (use_rep & kRepBit) { |
| - rep = kRepBit; |
| - } else { |
| - // There was no representation associated with any of the uses. |
| - if (phi_type & kTypeAny) { |
| - rep = kRepTagged; |
| - } else if (phi_type & kTypeNumber) { |
| - rep = kRepFloat64; |
| - } else if (phi_type & kTypeInt64 || phi_type & kTypeUint64) { |
| - rep = kRepWord64; |
| - } else if (phi_type & kTypeInt32 || phi_type & kTypeUint32) { |
| - rep = kRepWord32; |
| - } else if (phi_type & kTypeBool) { |
| - rep = kRepBit; |
| + } else if (upper->Is(Type::Boolean())) { |
| + // legal = kRepTagged | kRepBit; |
| + if ((use & kRepMask) == kRepTagged) { |
| + // only tagged uses. |
| + output = kRepTagged; |
| + prop = kRepTagged; |
| } else { |
| - UNREACHABLE(); // should have at least a usage type! |
| + // multiple uses. |
| + output = kRepBit; |
| + prop = kRepBit; |
| } |
| + } else if (upper->Is(Type::Number())) { |
| + // legal = kRepTagged | kRepFloat64; |
| + if ((use & kRepMask) == kRepTagged) { |
| + // only tagged uses. |
| + output = kRepTagged; |
| + prop = kRepTagged; |
| + } else { |
| + // multiple uses. |
| + output = kRepFloat64; |
| + prop = kRepFloat64; |
| + } |
| + } else { |
| + // legal = kRepTagged; |
| + output = kRepTagged; |
| + prop = kRepTagged; |
| } |
| - // Preserve the usage type, but set the representation. |
| - MachineTypeUnion output_type = rep | phi_type; |
| + |
| + MachineType output_type = |
| + static_cast<MachineType>(changer_->TypeFromUpperBound(upper) | output); |
| SetOutput(node, output_type); |
| - if (lower()) { |
| - int values = OperatorProperties::GetValueInputCount(node->op()); |
| + int values = OperatorProperties::GetValueInputCount(node->op()); |
| + if (lower()) { |
| // Update the phi operator. |
| MachineType type = static_cast<MachineType>(output_type); |
| if (type != OpParameter<MachineType>(node)) { |
| @@ -342,6 +342,15 @@ class RepresentationSelector { |
| // TODO(titzer): it'd be nice to have distinguished edge kinds here. |
| ProcessInput(node, iter.index(), values > 0 ? output_type : 0); |
| } |
| + } else { |
| + // Propagate {use} of the phi to value inputs, and 0 to control. |
| + Node::Inputs inputs = node->inputs(); |
| + MachineType use_type = static_cast<MachineType>((use & kTypeMask) | prop); |
| + for (Node::Inputs::iterator iter(inputs.begin()); iter != inputs.end(); |
| + ++iter, --values) { |
| + // TODO(titzer): it'd be nice to have distinguished edge kinds here. |
| + ProcessInput(node, iter.index(), values > 0 ? use_type : 0); |
| + } |
| } |
| } |