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); |
} |