Merge V8 5.2.361.47 DO NOT MERGE
https://chromium.googlesource.com/v8/v8/+/5.2.361.47
FPIIM-449
Change-Id: Ibec421b85a9b88cb3a432ada642e469fe7e78346
(cherry picked from commit bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8)
diff --git a/src/compiler/verifier.cc b/src/compiler/verifier.cc
index a69ace9..0e34285 100644
--- a/src/compiler/verifier.cc
+++ b/src/compiler/verifier.cc
@@ -42,12 +42,14 @@
class Verifier::Visitor {
public:
- Visitor(Zone* z, Typing typed) : zone(z), typing(typed) {}
+ Visitor(Zone* z, Typing typed, CheckInputs check_inputs)
+ : zone(z), typing(typed), check_inputs(check_inputs) {}
void Check(Node* node);
Zone* zone;
Typing typing;
+ CheckInputs check_inputs;
private:
void CheckNotTyped(Node* node) {
@@ -114,8 +116,10 @@
int control_count = node->op()->ControlInputCount();
// Verify number of inputs matches up.
- int input_count = value_count + context_count + frame_state_count +
- effect_count + control_count;
+ int input_count = value_count + context_count + frame_state_count;
+ if (check_inputs == kAll) {
+ input_count += effect_count + control_count;
+ }
CHECK_EQ(input_count, node->InputCount());
// Verify that frame state has been inserted for the nodes that need it.
@@ -150,20 +154,23 @@
CHECK(IsUseDefChainLinkPresent(context, node));
}
- // Verify all effect inputs actually have an effect.
- for (int i = 0; i < effect_count; ++i) {
- Node* effect = NodeProperties::GetEffectInput(node);
- CheckOutput(effect, node, effect->op()->EffectOutputCount(), "effect");
- CHECK(IsDefUseChainLinkPresent(effect, node));
- CHECK(IsUseDefChainLinkPresent(effect, node));
- }
+ if (check_inputs == kAll) {
+ // Verify all effect inputs actually have an effect.
+ for (int i = 0; i < effect_count; ++i) {
+ Node* effect = NodeProperties::GetEffectInput(node);
+ CheckOutput(effect, node, effect->op()->EffectOutputCount(), "effect");
+ CHECK(IsDefUseChainLinkPresent(effect, node));
+ CHECK(IsUseDefChainLinkPresent(effect, node));
+ }
- // Verify all control inputs are control nodes.
- for (int i = 0; i < control_count; ++i) {
- Node* control = NodeProperties::GetControlInput(node, i);
- CheckOutput(control, node, control->op()->ControlOutputCount(), "control");
- CHECK(IsDefUseChainLinkPresent(control, node));
- CHECK(IsUseDefChainLinkPresent(control, node));
+ // Verify all control inputs are control nodes.
+ for (int i = 0; i < control_count; ++i) {
+ Node* control = NodeProperties::GetControlInput(node, i);
+ CheckOutput(control, node, control->op()->ControlOutputCount(),
+ "control");
+ CHECK(IsDefUseChainLinkPresent(control, node));
+ CHECK(IsUseDefChainLinkPresent(control, node));
+ }
}
switch (node->opcode()) {
@@ -345,6 +352,10 @@
// Type is a number.
CheckUpperIs(node, Type::Number());
break;
+ case IrOpcode::kRelocatableInt32Constant:
+ case IrOpcode::kRelocatableInt64Constant:
+ CHECK_EQ(0, input_count);
+ break;
case IrOpcode::kHeapConstant:
// Constants have no inputs.
CHECK_EQ(0, input_count);
@@ -406,15 +417,13 @@
CHECK_EQ(input_count, 1 + effect_count);
break;
}
- case IrOpcode::kEffectSet: {
- CHECK_EQ(0, value_count);
- CHECK_EQ(0, control_count);
- CHECK_LT(1, effect_count);
- break;
- }
- case IrOpcode::kGuard:
+ case IrOpcode::kTypeGuard:
// TODO(bmeurer): what are the constraints on these?
break;
+ case IrOpcode::kCheckPoint:
+ // Type is empty.
+ CheckNotTyped(node);
+ break;
case IrOpcode::kBeginRegion:
// TODO(rossberg): what are the constraints on these?
break;
@@ -596,7 +605,6 @@
break;
case IrOpcode::kJSCallFunction:
case IrOpcode::kJSCallRuntime:
- case IrOpcode::kJSYield:
// Type can be anything.
CheckUpperIs(node, Type::Any());
break;
@@ -646,17 +654,27 @@
CheckUpperIs(node, Type::Number());
break;
case IrOpcode::kNumberEqual:
+ // (NumberOrUndefined, NumberOrUndefined) -> Boolean
+ CheckValueInputIs(node, 0, Type::NumberOrUndefined());
+ CheckValueInputIs(node, 1, Type::NumberOrUndefined());
+ CheckUpperIs(node, Type::Boolean());
+ break;
case IrOpcode::kNumberLessThan:
case IrOpcode::kNumberLessThanOrEqual:
// (Number, Number) -> Boolean
- CheckValueInputIs(node, 0, Type::Number());
- CheckValueInputIs(node, 1, Type::Number());
+ CheckValueInputIs(node, 0, Type::NumberOrUndefined());
+ CheckValueInputIs(node, 1, Type::NumberOrUndefined());
CheckUpperIs(node, Type::Boolean());
break;
case IrOpcode::kNumberAdd:
case IrOpcode::kNumberSubtract:
case IrOpcode::kNumberMultiply:
case IrOpcode::kNumberDivide:
+ // (Number, Number) -> Number
+ CheckValueInputIs(node, 0, Type::NumberOrUndefined());
+ CheckValueInputIs(node, 1, Type::NumberOrUndefined());
+ // CheckUpperIs(node, Type::Number());
+ break;
case IrOpcode::kNumberModulus:
// (Number, Number) -> Number
CheckValueInputIs(node, 0, Type::Number());
@@ -706,12 +724,12 @@
break;
case IrOpcode::kNumberToInt32:
// Number -> Signed32
- CheckValueInputIs(node, 0, Type::Number());
+ CheckValueInputIs(node, 0, Type::NumberOrUndefined());
CheckUpperIs(node, Type::Signed32());
break;
case IrOpcode::kNumberToUint32:
// Number -> Unsigned32
- CheckValueInputIs(node, 0, Type::Number());
+ CheckValueInputIs(node, 0, Type::NumberOrUndefined());
CheckUpperIs(node, Type::Unsigned32());
break;
case IrOpcode::kNumberIsHoleNaN:
@@ -719,11 +737,6 @@
CheckValueInputIs(node, 0, Type::Number());
CheckUpperIs(node, Type::Boolean());
break;
- case IrOpcode::kPlainPrimitiveToNumber:
- // PlainPrimitive -> Number
- CheckValueInputIs(node, 0, Type::PlainPrimitive());
- CheckUpperIs(node, Type::Number());
- break;
case IrOpcode::kStringEqual:
case IrOpcode::kStringLessThan:
case IrOpcode::kStringLessThanOrEqual:
@@ -743,9 +756,11 @@
CheckUpperIs(node, Type::Boolean());
break;
}
+ case IrOpcode::kObjectIsCallable:
case IrOpcode::kObjectIsNumber:
case IrOpcode::kObjectIsReceiver:
case IrOpcode::kObjectIsSmi:
+ case IrOpcode::kObjectIsString:
case IrOpcode::kObjectIsUndetectable:
CheckValueInputIs(node, 0, Type::Any());
CheckUpperIs(node, Type::Boolean());
@@ -755,6 +770,15 @@
CheckUpperIs(node, Type::TaggedPointer());
break;
+ case IrOpcode::kChangeTaggedSignedToInt32: {
+ // Signed32 /\ Tagged -> Signed32 /\ UntaggedInt32
+ // TODO(neis): Activate once ChangeRepresentation works in typer.
+ // Type* from = Type::Intersect(Type::Signed32(), Type::Tagged());
+ // Type* to = Type::Intersect(Type::Signed32(), Type::UntaggedInt32());
+ // CheckValueInputIs(node, 0, from));
+ // CheckUpperIs(node, to));
+ break;
+ }
case IrOpcode::kChangeTaggedToInt32: {
// Signed32 /\ Tagged -> Signed32 /\ UntaggedInt32
// TODO(neis): Activate once ChangeRepresentation works in typer.
@@ -782,6 +806,15 @@
// CheckUpperIs(node, to));
break;
}
+ case IrOpcode::kChangeInt31ToTaggedSigned: {
+ // Signed31 /\ UntaggedInt32 -> Signed31 /\ Tagged
+ // TODO(neis): Activate once ChangeRepresentation works in typer.
+ // Type* from =Type::Intersect(Type::Signed31(), Type::UntaggedInt32());
+ // Type* to = Type::Intersect(Type::Signed31(), Type::Tagged());
+ // CheckValueInputIs(node, 0, from));
+ // CheckUpperIs(node, to));
+ break;
+ }
case IrOpcode::kChangeInt32ToTagged: {
// Signed32 /\ UntaggedInt32 -> Signed32 /\ Tagged
// TODO(neis): Activate once ChangeRepresentation works in typer.
@@ -809,7 +842,7 @@
// CheckUpperIs(node, to));
break;
}
- case IrOpcode::kChangeBoolToBit: {
+ case IrOpcode::kChangeTaggedToBit: {
// Boolean /\ TaggedPtr -> Boolean /\ UntaggedInt1
// TODO(neis): Activate once ChangeRepresentation works in typer.
// Type* from = Type::Intersect(Type::Boolean(), Type::TaggedPtr());
@@ -818,7 +851,7 @@
// CheckUpperIs(node, to));
break;
}
- case IrOpcode::kChangeBitToBool: {
+ case IrOpcode::kChangeBitToTagged: {
// Boolean /\ UntaggedInt1 -> Boolean /\ TaggedPtr
// TODO(neis): Activate once ChangeRepresentation works in typer.
// Type* from = Type::Intersect(Type::Boolean(), Type::UntaggedInt1());
@@ -827,6 +860,15 @@
// CheckUpperIs(node, to));
break;
}
+ case IrOpcode::kTruncateTaggedToWord32: {
+ // Number /\ Tagged -> Signed32 /\ UntaggedInt32
+ // TODO(neis): Activate once ChangeRepresentation works in typer.
+ // Type* from = Type::Intersect(Type::Number(), Type::Tagged());
+ // Type* to = Type::Intersect(Type::Number(), Type::UntaggedInt32());
+ // CheckValueInputIs(node, 0, from));
+ // CheckUpperIs(node, to));
+ break;
+ }
case IrOpcode::kLoadField:
// Object -> fieldtype
@@ -918,6 +960,7 @@
case IrOpcode::kUint64LessThanOrEqual:
case IrOpcode::kFloat32Add:
case IrOpcode::kFloat32Sub:
+ case IrOpcode::kFloat32SubPreserveNan:
case IrOpcode::kFloat32Mul:
case IrOpcode::kFloat32Div:
case IrOpcode::kFloat32Max:
@@ -929,6 +972,7 @@
case IrOpcode::kFloat32LessThanOrEqual:
case IrOpcode::kFloat64Add:
case IrOpcode::kFloat64Sub:
+ case IrOpcode::kFloat64SubPreserveNan:
case IrOpcode::kFloat64Mul:
case IrOpcode::kFloat64Div:
case IrOpcode::kFloat64Mod:
@@ -949,6 +993,7 @@
case IrOpcode::kFloat64LessThan:
case IrOpcode::kFloat64LessThanOrEqual:
case IrOpcode::kTruncateInt64ToInt32:
+ case IrOpcode::kRoundFloat64ToInt32:
case IrOpcode::kRoundInt32ToFloat32:
case IrOpcode::kRoundInt64ToFloat32:
case IrOpcode::kRoundInt64ToFloat64:
@@ -956,11 +1001,12 @@
case IrOpcode::kRoundUint64ToFloat64:
case IrOpcode::kRoundUint64ToFloat32:
case IrOpcode::kTruncateFloat64ToFloat32:
- case IrOpcode::kTruncateFloat64ToInt32:
+ case IrOpcode::kTruncateFloat64ToWord32:
case IrOpcode::kBitcastFloat32ToInt32:
case IrOpcode::kBitcastFloat64ToInt64:
case IrOpcode::kBitcastInt32ToFloat32:
case IrOpcode::kBitcastInt64ToFloat64:
+ case IrOpcode::kBitcastWordToTagged:
case IrOpcode::kChangeInt32ToInt64:
case IrOpcode::kChangeUint32ToUint64:
case IrOpcode::kChangeInt32ToFloat64:
@@ -990,17 +1036,23 @@
case IrOpcode::kLoadParentFramePointer:
case IrOpcode::kCheckedLoad:
case IrOpcode::kCheckedStore:
+ case IrOpcode::kAtomicLoad:
+ case IrOpcode::kAtomicStore:
+
+#define SIMD_MACHINE_OP_CASE(Name) case IrOpcode::k##Name:
+ MACHINE_SIMD_OP_LIST(SIMD_MACHINE_OP_CASE)
+#undef SIMD_MACHINE_OP_CASE
+
// TODO(rossberg): Check.
break;
}
} // NOLINT(readability/fn_size)
-
-void Verifier::Run(Graph* graph, Typing typing) {
+void Verifier::Run(Graph* graph, Typing typing, CheckInputs check_inputs) {
CHECK_NOT_NULL(graph->start());
CHECK_NOT_NULL(graph->end());
Zone zone(graph->zone()->allocator());
- Visitor visitor(&zone, typing);
+ Visitor visitor(&zone, typing, check_inputs);
AllNodes all(&zone, graph);
for (Node* node : all.live) visitor.Check(node);