Index: src/compiler/js-typed-lowering.cc |
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc |
index 2338866d6d2274830dff5b132128ca3f9216659b..5b9e3dbb98fa05335f8c7e88f590e7888e745de3 100644 |
--- a/src/compiler/js-typed-lowering.cc |
+++ b/src/compiler/js-typed-lowering.cc |
@@ -927,14 +927,21 @@ Reduction JSTypedLowering::ReduceJSStoreContext(Node* node) { |
Reduction JSTypedLowering::Reduce(Node* node) { |
// Check if the output type is a singleton. In that case we already know the |
- // result value and can simply replace the node unless there are effects. |
+ // result value and can simply replace the node if it's eliminatable. |
Jarin
2015/01/05 09:41:21
eliminatable -> eliminable?
Benedikt Meurer
2015/01/05 12:37:12
Done.
|
if (NodeProperties::IsTyped(node) && |
- NodeProperties::GetBounds(node).upper->IsConstant() && |
!IrOpcode::IsLeafOpcode(node->opcode()) && |
- node->op()->EffectOutputCount() == 0) { |
- return ReplaceEagerly(node, jsgraph()->Constant( |
- NodeProperties::GetBounds(node).upper->AsConstant()->Value())); |
- // TODO(neis): Extend this to Range(x,x), NaN, MinusZero, ...? |
+ node->op()->HasProperty(Operator::kEliminatable)) { |
+ Type* upper = NodeProperties::GetBounds(node).upper; |
+ if (upper->IsConstant()) { |
+ Node* replacement = jsgraph()->Constant(upper->AsConstant()->Value()); |
+ NodeProperties::ReplaceWithValue(node, replacement); |
+ return Changed(replacement); |
+ } else if (upper->Is(Type::Number()) && |
+ base::bit_equal_to<double>()(upper->Min(), upper->Max())) { |
+ Node* replacement = jsgraph()->Constant(upper->Min()); |
+ NodeProperties::ReplaceWithValue(node, replacement); |
+ return Changed(replacement); |
+ } |
} |
switch (node->opcode()) { |
case IrOpcode::kJSEqual: |