Chromium Code Reviews| Index: src/compiler/simplified-lowering.cc |
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
| index 1a4ca96b072f6a1881ed2ba458fbe847ee19f1e6..f2e679abd77a7815d5b38680459a596a072d9b9e 100644 |
| --- a/src/compiler/simplified-lowering.cc |
| +++ b/src/compiler/simplified-lowering.cc |
| @@ -308,43 +308,38 @@ class RepresentationSelector { |
| MachineType output = kMachNone; |
| MachineType propagate = kMachNone; |
| - if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) { |
| - // legal = kRepTagged | kRepFloat64 | kRepWord32; |
| - if ((use & kRepMask) == kRepTagged) { |
| - // only tagged uses. |
| - output = kRepTagged; |
| - propagate = kRepTagged; |
| - } else if ((use & kRepMask) == kRepFloat64) { |
| + if ((use & kRepMask) == kRepTagged) { |
| + // only tagged uses. |
| + output = kRepTagged; |
| + propagate = kRepTagged; |
| + } else if (IsSafeIntAdditiveOperand(node)) { |
| + // Integer within [-2^52, 2^52] range. |
| + if ((use & kRepMask) == kRepFloat64) { |
| // only float64 uses. |
| output = kRepFloat64; |
| propagate = kRepFloat64; |
| - } else { |
| - // multiple uses. |
| + } else if (upper->Is(Type::Signed32()) || upper->Is(Type::Unsigned32())) { |
| + // multiple uses, but we are within 32 bits range => pick kRepWord32. |
| + output = kRepWord32; |
| + propagate = kRepWord32; |
| + } else if ((use & kRepMask) == kRepWord32 || |
| + (use & kTypeMask) == kTypeInt32 || |
| + (use & kTypeMask) == kTypeUint32) { |
| + // The type is a safe integer, but we only use 32 bits. |
| output = kRepWord32; |
| propagate = kRepWord32; |
| - } |
| - } else if (upper->Is(Type::Boolean())) { |
| - // legal = kRepTagged | kRepBit; |
| - if ((use & kRepMask) == kRepTagged) { |
| - // only tagged uses. |
| - output = kRepTagged; |
| - propagate = kRepTagged; |
| - } else { |
| - // multiple uses. |
| - output = kRepBit; |
| - propagate = kRepBit; |
| - } |
| - } else if (upper->Is(Type::Number())) { |
| - // legal = kRepTagged | kRepFloat64; |
| - if ((use & kRepMask) == kRepTagged) { |
| - // only tagged uses. |
| - output = kRepTagged; |
| - propagate = kRepTagged; |
| } else { |
| - // multiple uses. |
| output = kRepFloat64; |
| propagate = kRepFloat64; |
| } |
| + } else if (upper->Is(Type::Boolean())) { |
| + // multiple uses => pick kRepBit. |
| + output = kRepBit; |
| + propagate = kRepBit; |
| + } else if (upper->Is(Type::Number())) { |
| + // multiple uses => pick kRepFloat64. |
| + output = kRepFloat64; |
| + propagate = kRepFloat64; |
| } else { |
| // legal = kRepTagged; |
| output = kRepTagged; |
| @@ -648,13 +643,15 @@ class RepresentationSelector { |
| case IrOpcode::kNumberToInt32: { |
| MachineTypeUnion use_rep = use & kRepMask; |
| Node* input = node->InputAt(0); |
| + Type* in_upper = NodeProperties::GetBounds(input).upper; |
| MachineTypeUnion in = GetInfo(input)->output; |
| - if (NodeProperties::GetBounds(input).upper->Is(Type::Signed32())) { |
| + if (in_upper->Is(Type::Signed32())) { |
| // If the input has type int32, pass through representation. |
| VisitUnop(node, kTypeInt32 | use_rep, kTypeInt32 | use_rep); |
| if (lower()) DeferReplacement(node, node->InputAt(0)); |
| } else if ((in & kTypeMask) == kTypeUint32 || |
| (in & kTypeMask) == kTypeInt32 || |
| + in_upper->Is(Type::Unsigned32()) || |
|
titzer
2014/10/28 15:10:42
Something feels a little fishy here. What about ma
|
| (in & kRepMask) == kRepWord32) { |
| // Just change representation if necessary. |
| VisitUnop(node, kTypeInt32 | kRepWord32, kTypeInt32 | kRepWord32); |
| @@ -671,13 +668,15 @@ class RepresentationSelector { |
| case IrOpcode::kNumberToUint32: { |
| MachineTypeUnion use_rep = use & kRepMask; |
| Node* input = node->InputAt(0); |
| + Type* in_upper = NodeProperties::GetBounds(input).upper; |
| MachineTypeUnion in = GetInfo(input)->output; |
| - if (NodeProperties::GetBounds(input).upper->Is(Type::Unsigned32())) { |
| + if (in_upper->Is(Type::Unsigned32())) { |
| // If the input has type uint32, pass through representation. |
| VisitUnop(node, kTypeUint32 | use_rep, kTypeUint32 | use_rep); |
| if (lower()) DeferReplacement(node, node->InputAt(0)); |
| } else if ((in & kTypeMask) == kTypeUint32 || |
| (in & kTypeMask) == kTypeInt32 || |
| + in_upper->Is(Type::Signed32()) || |
| (in & kRepMask) == kRepWord32) { |
| // Just change representation if necessary. |
| VisitUnop(node, kTypeUint32 | kRepWord32, kTypeUint32 | kRepWord32); |