Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index de25f3c301a3016a07d341af0132adcdc9fc734c..d0f952a9ec6c4ac5e4939f1bd746d9df4019a767 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -468,6 +468,18 @@ class RepresentationSelector { |
new_type = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
break; |
+ case IrOpcode::kCheckFloat64Hole: |
+ new_type = Type::Intersect( |
+ op_typer_.CheckFloat64Hole(FeedbackTypeOf(node->InputAt(0))), |
+ info->restriction_type(), graph_zone()); |
+ break; |
+ |
+ case IrOpcode::kCheckNumber: |
+ new_type = Type::Intersect( |
+ op_typer_.CheckNumber(FeedbackTypeOf(node->InputAt(0))), |
+ info->restriction_type(), graph_zone()); |
+ break; |
+ |
case IrOpcode::kPhi: { |
new_type = TypePhi(node); |
if (type != nullptr) { |
@@ -819,6 +831,15 @@ class RepresentationSelector { |
if (lower()) Kill(node); |
} |
+ // Helper for no-op node. |
+ void VisitNoop(Node* node, Truncation truncation) { |
+ if (truncation.IsUnused()) return VisitUnused(node); |
+ MachineRepresentation representation = |
+ GetOutputInfoForPhi(node, TypeOf(node), truncation); |
+ VisitUnop(node, UseInfo(representation, truncation), representation); |
+ if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ } |
+ |
// Helper for binops of the R x L -> O variety. |
void VisitBinop(Node* node, UseInfo left_use, UseInfo right_use, |
MachineRepresentation output, |
@@ -2356,19 +2377,9 @@ class RepresentationSelector { |
return; |
} |
case IrOpcode::kCheckNumber: { |
- if (InputIs(node, Type::Number())) { |
- if (truncation.IsUsedAsWord32()) { |
- VisitUnop(node, UseInfo::TruncatingWord32(), |
- MachineRepresentation::kWord32); |
- } else { |
- // TODO(jarin,bmeurer): We need to go to Tagged here, because |
- // otherwise we cannot distinguish the hole NaN (which might need to |
- // be treated as undefined). We should have a dedicated Type for |
- // that at some point, and maybe even a dedicated truncation. |
- VisitUnop(node, UseInfo::AnyTagged(), |
- MachineRepresentation::kTagged); |
- } |
- if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ Type* const input_type = TypeOf(node->InputAt(0)); |
+ if (input_type->Is(Type::Number())) { |
+ VisitNoop(node, truncation); |
} else { |
VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); |
} |
@@ -2681,13 +2692,36 @@ class RepresentationSelector { |
return; |
} |
case IrOpcode::kCheckFloat64Hole: { |
- CheckFloat64HoleMode mode = CheckFloat64HoleModeOf(node->op()); |
- ProcessInput(node, 0, UseInfo::TruncatingFloat64()); |
- ProcessRemainingInputs(node, 1); |
- SetOutput(node, MachineRepresentation::kFloat64); |
- if (truncation.IsUsedAsFloat64() && |
- mode == CheckFloat64HoleMode::kAllowReturnHole) { |
- if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ Type* const input_type = TypeOf(node->InputAt(0)); |
+ if (input_type->Is(Type::Number())) { |
+ VisitNoop(node, truncation); |
+ } else { |
+ CheckFloat64HoleMode mode = CheckFloat64HoleModeOf(node->op()); |
+ switch (mode) { |
+ case CheckFloat64HoleMode::kAllowReturnHole: |
+ if (truncation.IsUnused()) return VisitUnused(node); |
+ if (truncation.IsUsedAsWord32()) { |
Michael Achenbach
2017/04/12 10:23:01
FYI: According to (64 bit) coverage bot, this cond
Benedikt Meurer
2017/04/12 10:24:18
Not necessarily.
|
+ VisitUnop(node, UseInfo::TruncatingWord32(), |
+ MachineRepresentation::kWord32); |
+ if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ } else if (truncation.IsUsedAsFloat64()) { |
+ VisitUnop(node, UseInfo::TruncatingFloat64(), |
+ MachineRepresentation::kFloat64); |
+ if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ } else { |
+ VisitUnop( |
+ node, |
+ UseInfo(MachineRepresentation::kFloat64, Truncation::Any()), |
+ MachineRepresentation::kFloat64, Type::Number()); |
+ } |
+ break; |
+ case CheckFloat64HoleMode::kNeverReturnHole: |
+ VisitUnop( |
+ node, |
+ UseInfo(MachineRepresentation::kFloat64, Truncation::Any()), |
+ MachineRepresentation::kFloat64, Type::Number()); |
+ break; |
+ } |
} |
return; |
} |