Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index d1f6c8743bbe466d850ca74493daaa6f8b09f425..57563dc17854cad18e27fde43f6fbd9a55a561bc 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -51,7 +51,10 @@ enum Phase { |
// the next phase can begin. |
PROPAGATE, |
- // 2.) LOWER: perform lowering for all {Simplified} nodes by replacing some |
+ // 2.) RETYPE: Propagate types from type feedback forwards. |
+ RETYPE, |
+ |
+ // 3.) LOWER: perform lowering for all {Simplified} nodes by replacing some |
// operators for some nodes, expanding some nodes to multiple nodes, or |
// removing some (redundant) nodes. |
// During this phase, use the {RepresentationChanger} to insert |
@@ -60,7 +63,6 @@ enum Phase { |
LOWER |
}; |
- |
namespace { |
@@ -246,8 +248,12 @@ class RepresentationSelector { |
// Forward propagation of types from type feedback. |
void RunTypePropagationPhase() { |
- DCHECK(typing_stack_.empty()); |
+ // Run type propagation. |
+ TRACE("--{Type propagation phase}--\n"); |
+ phase_ = RETYPE; |
+ ResetNodeInfoState(); |
+ DCHECK(typing_stack_.empty()); |
typing_stack_.push({graph()->end(), 0}); |
GetInfo(graph()->end())->set_pushed(); |
while (!typing_stack_.empty()) { |
@@ -274,6 +280,8 @@ class RepresentationSelector { |
NodeInfo* info = GetInfo(node); |
info->set_visited(); |
bool updated = UpdateFeedbackType(node); |
+ TRACE(" visit #%d: %s\n", node->id(), node->op()->mnemonic()); |
+ VisitNode(node, info->truncation(), nullptr); |
if (updated) { |
for (Node* const user : node->uses()) { |
if (GetInfo(user)->visited()) { |
@@ -291,6 +299,8 @@ class RepresentationSelector { |
NodeInfo* info = GetInfo(node); |
info->set_visited(); |
bool updated = UpdateFeedbackType(node); |
+ TRACE(" visit #%d: %s\n", node->id(), node->op()->mnemonic()); |
+ VisitNode(node, info->truncation(), nullptr); |
if (updated) { |
for (Node* const user : node->uses()) { |
if (GetInfo(user)->visited()) { |
@@ -376,7 +386,7 @@ class RepresentationSelector { |
// computes a more precise type. |
Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1))); |
- Type* static_type = op_typer_.NumericAdd(lhs, rhs); |
+ Type* static_type = op_typer_.NumberAdd(lhs, rhs); |
if (info->type_check() == TypeCheckKind::kNone) { |
new_type = static_type; |
} else { |
@@ -393,7 +403,7 @@ class RepresentationSelector { |
// computes a more precise type. |
Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1))); |
- Type* static_type = op_typer_.NumericSubtract(lhs, rhs); |
+ Type* static_type = op_typer_.NumberSubtract(lhs, rhs); |
if (info->type_check() == TypeCheckKind::kNone) { |
new_type = static_type; |
} else { |
@@ -410,7 +420,7 @@ class RepresentationSelector { |
// computes a more precise type. |
Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1))); |
- Type* static_type = op_typer_.NumericMultiply(lhs, rhs); |
+ Type* static_type = op_typer_.NumberMultiply(lhs, rhs); |
if (info->type_check() == TypeCheckKind::kNone) { |
new_type = static_type; |
} else { |
@@ -427,7 +437,7 @@ class RepresentationSelector { |
// computes a more precise type. |
Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1))); |
- Type* static_type = op_typer_.NumericDivide(lhs, rhs); |
+ Type* static_type = op_typer_.NumberDivide(lhs, rhs); |
if (info->type_check() == TypeCheckKind::kNone) { |
new_type = static_type; |
} else { |
@@ -444,7 +454,7 @@ class RepresentationSelector { |
// computes a more precise type. |
Type* lhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); |
Type* rhs = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(1))); |
- Type* static_type = op_typer_.NumericModulus(lhs, rhs); |
+ Type* static_type = op_typer_.NumberModulus(lhs, rhs); |
if (info->type_check() == TypeCheckKind::kNone) { |
new_type = static_type; |
} else { |
@@ -454,24 +464,21 @@ class RepresentationSelector { |
break; |
} |
+ case IrOpcode::kNumberAbs: { |
+ new_type = op_typer_.NumberAbs(FeedbackTypeOf(node->InputAt(0))); |
+ break; |
+ } |
+ |
case IrOpcode::kPhi: { |
new_type = TypePhi(node); |
if (type != nullptr) { |
new_type = Weaken(node, type, new_type); |
} |
- // Recompute the phi representation based on the new type. |
- MachineRepresentation output = |
- GetOutputInfoForPhi(node, GetInfo(node)->truncation(), new_type); |
- ResetOutput(node, output); |
break; |
} |
case IrOpcode::kSelect: { |
new_type = TypeSelect(node); |
- // Recompute representation based on the new type. |
- MachineRepresentation output = |
- GetOutputInfoForPhi(node, GetInfo(node)->truncation(), new_type); |
- ResetOutput(node, output); |
break; |
} |
@@ -569,8 +576,6 @@ class RepresentationSelector { |
void Run(SimplifiedLowering* lowering) { |
RunTruncationPropagationPhase(); |
- // Run type propagation. |
- ResetNodeInfoState(); |
RunTypePropagationPhase(); |
// Run lowering and change insertion phase. |
@@ -647,14 +652,26 @@ class RepresentationSelector { |
} |
} |
- bool lower() { return phase_ == LOWER; } |
- bool propagate() { return phase_ == PROPAGATE; } |
+ bool lower() const { return phase_ == LOWER; } |
+ bool retype() const { return phase_ == RETYPE; } |
+ bool propagate() const { return phase_ == PROPAGATE; } |
void SetOutput(Node* node, MachineRepresentation representation, |
TypeCheckKind type_check = TypeCheckKind::kNone) { |
- DCHECK(MachineRepresentationIsSubtype(GetInfo(node)->representation(), |
- representation)); |
- ResetOutput(node, representation, type_check); |
+ NodeInfo* const info = GetInfo(node); |
+ switch (phase_) { |
+ case PROPAGATE: |
+ info->set_type_check(type_check); |
+ break; |
+ case RETYPE: |
+ DCHECK_EQ(info->type_check(), type_check); |
+ info->set_output(representation); |
+ break; |
+ case LOWER: |
+ DCHECK_EQ(info->type_check(), type_check); |
+ DCHECK_EQ(info->representation(), representation); |
+ break; |
+ } |
} |
void ResetOutput(Node* node, MachineRepresentation representation, |
@@ -715,10 +732,15 @@ class RepresentationSelector { |
} |
void ProcessInput(Node* node, int index, UseInfo use) { |
- if (phase_ == PROPAGATE) { |
- EnqueueInput(node, index, use); |
- } else { |
- ConvertInput(node, index, use); |
+ switch (phase_) { |
+ case PROPAGATE: |
+ EnqueueInput(node, index, use); |
+ break; |
+ case RETYPE: |
+ break; |
+ case LOWER: |
+ ConvertInput(node, index, use); |
+ break; |
} |
} |
@@ -827,12 +849,9 @@ class RepresentationSelector { |
} |
// Infer representation for phi-like nodes. |
- MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use, |
- Type* type = nullptr) { |
+ MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use) { |
// Compute the representation. |
- if (type == nullptr) { |
- type = TypeOf(node); |
- } |
+ Type* type = TypeOf(node); |
if (type->Is(Type::None())) { |
return MachineRepresentation::kNone; |
} else if (type->Is(Type::Signed32()) || type->Is(Type::Unsigned32())) { |
@@ -949,11 +968,11 @@ class RepresentationSelector { |
} |
void VisitStateValues(Node* node) { |
- if (phase_ == PROPAGATE) { |
+ if (propagate()) { |
for (int i = 0; i < node->InputCount(); i++) { |
EnqueueInput(node, i, UseInfo::Any()); |
} |
- } else { |
+ } else if (lower()) { |
Zone* zone = jsgraph_->zone(); |
ZoneVector<MachineType>* types = |
new (zone->New(sizeof(ZoneVector<MachineType>))) |
@@ -1596,16 +1615,16 @@ class RepresentationSelector { |
return; |
} |
case IrOpcode::kNumberAbs: { |
- if (InputIs(node, Type::Unsigned32())) { |
+ if (TypeOf(node->InputAt(0))->Is(Type::Unsigned32())) { |
VisitUnop(node, UseInfo::TruncatingWord32(), |
MachineRepresentation::kWord32); |
if (lower()) DeferReplacement(node, node->InputAt(0)); |
- } else if (InputIs(node, Type::Signed32())) { |
+ } else if (TypeOf(node->InputAt(0))->Is(Type::Signed32())) { |
VisitUnop(node, UseInfo::TruncatingWord32(), |
MachineRepresentation::kWord32); |
if (lower()) DeferReplacement(node, lowering->Int32Abs(node)); |
- } else if (InputIs(node, |
- type_cache_.kPositiveIntegerOrMinusZeroOrNaN)) { |
+ } else if (TypeOf(node->InputAt(0)) |
+ ->Is(type_cache_.kPositiveIntegerOrMinusZeroOrNaN)) { |
VisitUnop(node, UseInfo::TruncatingFloat64(), |
MachineRepresentation::kFloat64); |
if (lower()) DeferReplacement(node, node->InputAt(0)); |