| Index: src/compiler/effect-control-linearizer.cc
|
| diff --git a/src/compiler/effect-control-linearizer.cc b/src/compiler/effect-control-linearizer.cc
|
| index 53505d7590cde3003142b84a61df49991d1e8894..959712f075fc3f34e7c51426f6a0efa7b04ff98b 100644
|
| --- a/src/compiler/effect-control-linearizer.cc
|
| +++ b/src/compiler/effect-control-linearizer.cc
|
| @@ -265,6 +265,7 @@
|
| Node* phi_false = graph->NewNode(phi->op(), input_count + 1, inputs);
|
| if (phi->UseCount() == 0) {
|
| DCHECK_EQ(phi->opcode(), IrOpcode::kEffectPhi);
|
| + DCHECK_EQ(input_count, block->SuccessorCount());
|
| } else {
|
| for (Edge edge : phi->use_edges()) {
|
| Node* control = NodeProperties::GetControlInput(edge.from());
|
| @@ -615,9 +616,6 @@
|
| case IrOpcode::kChangeTaggedToFloat64:
|
| state = LowerChangeTaggedToFloat64(node, *effect, *control);
|
| break;
|
| - case IrOpcode::kTruncateTaggedToBit:
|
| - state = LowerTruncateTaggedToBit(node, *effect, *control);
|
| - break;
|
| case IrOpcode::kTruncateTaggedToFloat64:
|
| state = LowerTruncateTaggedToFloat64(node, *effect, *control);
|
| break;
|
| @@ -892,157 +890,6 @@
|
| Node* value = node->InputAt(0);
|
| value = graph()->NewNode(machine()->WordEqual(), value,
|
| jsgraph()->TrueConstant());
|
| - return ValueEffectControl(value, effect, control);
|
| -}
|
| -
|
| -EffectControlLinearizer::ValueEffectControl
|
| -EffectControlLinearizer::LowerTruncateTaggedToBit(Node* node, Node* effect,
|
| - Node* control) {
|
| - Node* value = node->InputAt(0);
|
| - Node* one = jsgraph()->Int32Constant(1);
|
| - Node* zero = jsgraph()->Int32Constant(0);
|
| - Node* fzero = jsgraph()->Float64Constant(0.0);
|
| -
|
| - // Collect effect/control/value triples.
|
| - int count = 0;
|
| - Node* values[7];
|
| - Node* effects[7];
|
| - Node* controls[6];
|
| -
|
| - // Check if {value} is a Smi.
|
| - Node* check_smi = ObjectIsSmi(value);
|
| - Node* branch_smi = graph()->NewNode(common()->Branch(BranchHint::kFalse),
|
| - check_smi, control);
|
| -
|
| - // If {value} is a Smi, then we only need to check that it's not zero.
|
| - Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_smi);
|
| - Node* esmi = effect;
|
| - {
|
| - controls[count] = if_smi;
|
| - effects[count] = esmi;
|
| - values[count] =
|
| - graph()->NewNode(machine()->Word32Equal(),
|
| - graph()->NewNode(machine()->WordEqual(), value,
|
| - jsgraph()->ZeroConstant()),
|
| - zero);
|
| - count++;
|
| - }
|
| - control = graph()->NewNode(common()->IfFalse(), branch_smi);
|
| -
|
| - // Load the map instance type of {value}.
|
| - Node* value_map = effect = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForMap()), value, effect, control);
|
| - Node* value_instance_type = effect = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForMapInstanceType()), value_map,
|
| - effect, control);
|
| -
|
| - // Check if {value} is an Oddball.
|
| - Node* check_oddball =
|
| - graph()->NewNode(machine()->Word32Equal(), value_instance_type,
|
| - jsgraph()->Int32Constant(ODDBALL_TYPE));
|
| - Node* branch_oddball = graph()->NewNode(common()->Branch(BranchHint::kTrue),
|
| - check_oddball, control);
|
| -
|
| - // The only Oddball {value} that is trueish is true itself.
|
| - Node* if_oddball = graph()->NewNode(common()->IfTrue(), branch_oddball);
|
| - Node* eoddball = effect;
|
| - {
|
| - controls[count] = if_oddball;
|
| - effects[count] = eoddball;
|
| - values[count] = graph()->NewNode(machine()->WordEqual(), value,
|
| - jsgraph()->TrueConstant());
|
| - count++;
|
| - }
|
| - control = graph()->NewNode(common()->IfFalse(), branch_oddball);
|
| -
|
| - // Check if {value} is a String.
|
| - Node* check_string =
|
| - graph()->NewNode(machine()->Int32LessThan(), value_instance_type,
|
| - jsgraph()->Int32Constant(FIRST_NONSTRING_TYPE));
|
| - Node* branch_string =
|
| - graph()->NewNode(common()->Branch(), check_string, control);
|
| -
|
| - // For String {value}, we need to check that the length is not zero.
|
| - Node* if_string = graph()->NewNode(common()->IfTrue(), branch_string);
|
| - Node* estring = effect;
|
| - {
|
| - // Load the {value} length.
|
| - Node* value_length = estring = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForStringLength()), value,
|
| - estring, if_string);
|
| -
|
| - controls[count] = if_string;
|
| - effects[count] = estring;
|
| - values[count] =
|
| - graph()->NewNode(machine()->Word32Equal(),
|
| - graph()->NewNode(machine()->WordEqual(), value_length,
|
| - jsgraph()->ZeroConstant()),
|
| - zero);
|
| - count++;
|
| - }
|
| - control = graph()->NewNode(common()->IfFalse(), branch_string);
|
| -
|
| - // Check if {value} is a HeapNumber.
|
| - Node* check_heapnumber =
|
| - graph()->NewNode(machine()->Word32Equal(), value_instance_type,
|
| - jsgraph()->Int32Constant(HEAP_NUMBER_TYPE));
|
| - Node* branch_heapnumber =
|
| - graph()->NewNode(common()->Branch(), check_heapnumber, control);
|
| -
|
| - // For HeapNumber {value}, just check that its value is not 0.0, -0.0 or NaN.
|
| - Node* if_heapnumber = graph()->NewNode(common()->IfTrue(), branch_heapnumber);
|
| - Node* eheapnumber = effect;
|
| - {
|
| - // Load the raw value of {value}.
|
| - Node* value_value = eheapnumber = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForHeapNumberValue()), value,
|
| - eheapnumber, if_heapnumber);
|
| -
|
| - // Check if {value} is either less than 0.0 or greater than 0.0.
|
| - Node* check =
|
| - graph()->NewNode(machine()->Float64LessThan(), fzero, value_value);
|
| - Node* branch = graph()->NewNode(common()->Branch(), check, if_heapnumber);
|
| -
|
| - controls[count] = graph()->NewNode(common()->IfTrue(), branch);
|
| - effects[count] = eheapnumber;
|
| - values[count] = one;
|
| - count++;
|
| -
|
| - controls[count] = graph()->NewNode(common()->IfFalse(), branch);
|
| - effects[count] = eheapnumber;
|
| - values[count] =
|
| - graph()->NewNode(machine()->Float64LessThan(), value_value, fzero);
|
| - count++;
|
| - }
|
| - control = graph()->NewNode(common()->IfFalse(), branch_heapnumber);
|
| -
|
| - // The {value} is either a JSReceiver, a Symbol or some Simd128Value. In
|
| - // those cases we can just the undetectable bit on the map, which will only
|
| - // be set for certain JSReceivers, i.e. document.all.
|
| - {
|
| - // Load the {value} map bit field.
|
| - Node* value_map_bitfield = effect = graph()->NewNode(
|
| - simplified()->LoadField(AccessBuilder::ForMapBitField()), value_map,
|
| - effect, control);
|
| -
|
| - controls[count] = control;
|
| - effects[count] = effect;
|
| - values[count] = graph()->NewNode(
|
| - machine()->Word32Equal(),
|
| - graph()->NewNode(machine()->Word32And(), value_map_bitfield,
|
| - jsgraph()->Int32Constant(1 << Map::kIsUndetectable)),
|
| - zero);
|
| - count++;
|
| - }
|
| -
|
| - // Merge the different controls.
|
| - control = graph()->NewNode(common()->Merge(count), count, controls);
|
| - effects[count] = control;
|
| - effect = graph()->NewNode(common()->EffectPhi(count), count + 1, effects);
|
| - values[count] = control;
|
| - value = graph()->NewNode(common()->Phi(MachineRepresentation::kBit, count),
|
| - count + 1, values);
|
| -
|
| return ValueEffectControl(value, effect, control);
|
| }
|
|
|
|
|