| Index: src/compiler/simplified-lowering.cc
|
| diff --git a/src/compiler/simplified-lowering.cc b/src/compiler/simplified-lowering.cc
|
| index 367a1cca7ccdda588297e3f0b353429e12e312b0..09f0b7f2d4d2cd61fd42a1a86a1662bb012a9443 100644
|
| --- a/src/compiler/simplified-lowering.cc
|
| +++ b/src/compiler/simplified-lowering.cc
|
| @@ -730,7 +730,11 @@ class RepresentationSelector {
|
| !GetUpperBound(node->InputAt(1))->Maybe(type);
|
| }
|
|
|
| - void ConvertInput(Node* node, int index, UseInfo use) {
|
| + // Converts input {index} of {node} according to given UseInfo {use},
|
| + // assuming the type of the input is {input_type}. If {input_type} is null,
|
| + // it takes the input from the input node {TypeOf(node->InputAt(index))}.
|
| + void ConvertInput(Node* node, int index, UseInfo use,
|
| + Type* input_type = nullptr) {
|
| Node* input = node->InputAt(index);
|
| // In the change phase, insert a change before the use if necessary.
|
| if (use.representation() == MachineRepresentation::kNone)
|
| @@ -748,8 +752,11 @@ class RepresentationSelector {
|
| TRACE(" to ");
|
| PrintUseInfo(use);
|
| TRACE("\n");
|
| + if (input_type == nullptr) {
|
| + input_type = TypeOf(input);
|
| + }
|
| Node* n = changer_->GetRepresentationFor(
|
| - input, input_info->representation(), TypeOf(input), node, use);
|
| + input, input_info->representation(), input_type, node, use);
|
| node->ReplaceInput(index, n);
|
| }
|
| }
|
| @@ -2817,18 +2824,22 @@ class RepresentationSelector {
|
| case IrOpcode::kObjectState:
|
| return VisitObjectState(node);
|
| case IrOpcode::kTypeGuard: {
|
| - // 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.
|
| + // We just get rid of the sigma here, choosing the best representation
|
| + // for the sigma's type.
|
| + Type* type = TypeOf(node);
|
| MachineRepresentation representation =
|
| - GetOutputInfoForPhi(node, TypeOf(node->InputAt(0)), truncation);
|
| -
|
| - // For now, we just handle specially the impossible case.
|
| - MachineRepresentation output = TypeOf(node)->IsInhabited()
|
| - ? representation
|
| - : MachineRepresentation::kNone;
|
| + GetOutputInfoForPhi(node, type, truncation);
|
|
|
| - VisitUnop(node, UseInfo(representation, truncation), output);
|
| + // Here we pretend that the input has the sigma's type for the
|
| + // conversion.
|
| + UseInfo use(representation, truncation);
|
| + if (propagate()) {
|
| + EnqueueInput(node, 0, use);
|
| + } else if (lower()) {
|
| + ConvertInput(node, 0, use, type);
|
| + }
|
| + ProcessRemainingInputs(node, 1);
|
| + SetOutput(node, representation);
|
| if (lower()) DeferReplacement(node, node->InputAt(0));
|
| return;
|
| }
|
|
|