Index: src/compiler/simplified-lowering.cc |
diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc |
index 093b09ecc0f711bd466af097dc88750097a1431f..b65e29242c45d56a38c8abc44d28afb63b34759d 100644 |
--- a/src/compiler/simplified-lowering.cc |
+++ b/src/compiler/simplified-lowering.cc |
@@ -424,6 +424,12 @@ class RepresentationSelector { |
break; |
} |
+ case IrOpcode::kSigma: { |
+ new_type = |
+ op_typer_.TypeSigma(node->op(), FeedbackTypeOf(node->InputAt(0))); |
+ break; |
+ } |
+ |
case IrOpcode::kSelect: { |
new_type = TypeSelect(node); |
break; |
@@ -811,9 +817,12 @@ class RepresentationSelector { |
} |
// Infer representation for phi-like nodes. |
- MachineRepresentation GetOutputInfoForPhi(Node* node, Truncation use) { |
+ // The {node} parameter is only used to decide on the int64 representation. |
+ // Once the type system supports an external pointer type, the {node} |
+ // parameter can be removed. |
+ MachineRepresentation GetOutputInfoForPhi(Node* node, Type* type, |
+ Truncation use) { |
// Compute the representation. |
- Type* type = TypeOf(node); |
if (type->Is(Type::None())) { |
return MachineRepresentation::kNone; |
} else if (type->Is(Type::Signed32()) || type->Is(Type::Unsigned32())) { |
@@ -860,7 +869,8 @@ class RepresentationSelector { |
SimplifiedLowering* lowering) { |
ProcessInput(node, 0, UseInfo::Bool()); |
- MachineRepresentation output = GetOutputInfoForPhi(node, truncation); |
+ MachineRepresentation output = |
+ GetOutputInfoForPhi(node, TypeOf(node), truncation); |
SetOutput(node, output); |
if (lower()) { |
@@ -881,7 +891,8 @@ class RepresentationSelector { |
// Helper for handling phis. |
void VisitPhi(Node* node, Truncation truncation, |
SimplifiedLowering* lowering) { |
- MachineRepresentation output = GetOutputInfoForPhi(node, truncation); |
+ MachineRepresentation output = |
+ GetOutputInfoForPhi(node, TypeOf(node), truncation); |
// Only set the output representation if not running with type |
// feedback. (Feedback typing will set the representation.) |
SetOutput(node, output); |
@@ -895,7 +906,7 @@ class RepresentationSelector { |
} |
// Convert inputs to the output representation of this phi, pass the |
- // truncation truncation along. |
+ // truncation along. |
UseInfo input_use(output, truncation); |
for (int i = 0; i < node->InputCount(); i++) { |
ProcessInput(node, i, i < values ? input_use : UseInfo::None()); |
@@ -2444,6 +2455,20 @@ class RepresentationSelector { |
return VisitLeaf(node, MachineType::PointerRepresentation()); |
case IrOpcode::kStateValues: |
return VisitStateValues(node); |
+ case IrOpcode::kSigma: { |
+ // We just get rid of the sigma here. In principle, it should be |
+ // possible to refine the truncation and representation based on |
+ // the sigma's type. |
+ MachineRepresentation output = |
+ GetOutputInfoForPhi(node, TypeOf(node->InputAt(0)), truncation); |
+ |
+ ProcessInput(node, 0, UseInfo(output, truncation)); |
+ ProcessInput(node, 1, UseInfo::None()); |
Benedikt Meurer
2016/08/05 12:54:20
Nit: You could use VisitUnop here.
|
+ |
+ SetOutput(node, output); |
+ if (lower()) DeferReplacement(node, node->InputAt(0)); |
+ return; |
+ } |
// The following opcodes are not produced before representation |
// inference runs, so we do not have any real test coverage. |
@@ -2486,8 +2511,6 @@ class RepresentationSelector { |
Node* control = NodeProperties::GetControlInput(node); |
Node* effect = NodeProperties::GetEffectInput(node); |
ReplaceEffectControlUses(node, effect, control); |
- } else { |
- DCHECK_EQ(0, node->op()->ControlInputCount()); |
} |
replacements_.push_back(node); |