5 #include "src/compiler/verifier.h" 13 #include "src/bit-vector.h" 14 #include "src/compiler/all-nodes.h" 15 #include "src/compiler/common-operator.h" 16 #include "src/compiler/graph.h" 17 #include "src/compiler/js-operator.h" 18 #include "src/compiler/node-properties.h" 19 #include "src/compiler/node.h" 20 #include "src/compiler/opcodes.h" 21 #include "src/compiler/operator-properties.h" 22 #include "src/compiler/operator.h" 23 #include "src/compiler/schedule.h" 24 #include "src/compiler/simplified-operator.h" 25 #include "src/compiler/type-cache.h" 26 #include "src/ostreams.h" 35 Visitor(
Zone* z, Typing typed, CheckInputs check_inputs, CodeType code_type)
38 check_inputs(check_inputs),
39 code_type(code_type) {}
45 CheckInputs check_inputs;
49 void CheckNotTyped(
Node* node) {
50 if (NodeProperties::IsTyped(node)) {
51 std::ostringstream str;
52 str <<
"TypeError: node #" << node->id() <<
":" << *node->op()
53 <<
" should never have a type";
54 FATAL(
"%s", str.str().c_str());
58 if (typing == TYPED && !NodeProperties::GetType(node).Is(
type)) {
59 std::ostringstream str;
60 str <<
"TypeError: node #" << node->id() <<
":" << *node->op() <<
" type " 61 << NodeProperties::GetType(node) <<
" is not " <<
type;
62 FATAL(
"%s", str.str().c_str());
66 if (typing == TYPED && !NodeProperties::GetType(node).
Maybe(
type)) {
67 std::ostringstream str;
68 str <<
"TypeError: node #" << node->id() <<
":" << *node->op() <<
" type " 69 << NodeProperties::GetType(node) <<
" must intersect " <<
type;
70 FATAL(
"%s", str.str().c_str());
74 Node* input = NodeProperties::GetValueInput(node,
i);
75 if (typing == TYPED && !NodeProperties::GetType(input).Is(
type)) {
76 std::ostringstream str;
77 str <<
"TypeError: node #" << node->id() <<
":" << *node->op()
78 <<
"(input @" <<
i <<
" = " << input->opcode() <<
":" 79 << input->op()->mnemonic() <<
") type " 80 << NodeProperties::GetType(input) <<
" is not " <<
type;
81 FATAL(
"%s", str.str().c_str());
84 void CheckOutput(
Node* node,
Node* use,
int count,
const char* kind) {
86 std::ostringstream str;
87 str <<
"GraphError: node #" << node->id() <<
":" << *node->op()
88 <<
" does not produce " << kind <<
" output used by node #" 89 << use->id() <<
":" << *use->op();
90 FATAL(
"%s", str.str().c_str());
95 void Verifier::Visitor::Check(
Node* node,
const AllNodes& all) {
96 int value_count = node->op()->ValueInputCount();
97 int context_count = OperatorProperties::GetContextInputCount(node->op());
98 int frame_state_count =
99 OperatorProperties::GetFrameStateInputCount(node->op());
100 int effect_count = node->op()->EffectInputCount();
101 int control_count = node->op()->ControlInputCount();
104 int input_count = value_count + context_count + frame_state_count;
105 if (check_inputs == kAll) {
106 input_count += effect_count + control_count;
108 CHECK_EQ(input_count, node->InputCount());
114 if (code_type != kWasm && node->op()->EffectOutputCount() > 0) {
115 int effect_edges = 0;
116 for (
Edge edge : node->use_edges()) {
117 if (all.IsLive(edge.from()) && NodeProperties::IsEffectEdge(edge)) {
121 DCHECK_GT(effect_edges, 0);
125 for (
int i = 0;
i < frame_state_count;
i++) {
126 Node* frame_state = NodeProperties::GetFrameStateInput(node);
127 CHECK(frame_state->opcode() == IrOpcode::kFrameState ||
129 (node->opcode() == IrOpcode::kFrameState &&
130 frame_state->opcode() == IrOpcode::kStart));
134 for (
int i = 0;
i < value_count; ++
i) {
135 Node* value = NodeProperties::GetValueInput(node,
i);
136 CheckOutput(value, node, value->op()->ValueOutputCount(),
"value");
139 CHECK(node->opcode() == IrOpcode::kParameter ||
140 node->opcode() == IrOpcode::kProjection ||
141 value->op()->ValueOutputCount() <= 1);
145 for (
int i = 0;
i < context_count; ++
i) {
146 Node* context = NodeProperties::GetContextInput(node);
147 CheckOutput(context, node, context->op()->ValueOutputCount(),
"context");
150 if (check_inputs == kAll) {
152 for (
int i = 0;
i < effect_count; ++
i) {
153 Node* effect = NodeProperties::GetEffectInput(node);
154 CheckOutput(effect, node, effect->op()->EffectOutputCount(),
"effect");
158 for (
int i = 0;
i < control_count; ++
i) {
159 Node* control = NodeProperties::GetControlInput(node,
i);
160 CheckOutput(control, node, control->op()->ControlOutputCount(),
166 if (!node->op()->HasProperty(Operator::kNoThrow)) {
167 Node* discovered_if_exception =
nullptr;
168 Node* discovered_if_success =
nullptr;
169 int total_number_of_control_uses = 0;
170 for (Edge edge : node->use_edges()) {
171 if (!NodeProperties::IsControlEdge(edge)) {
174 total_number_of_control_uses++;
175 Node* control_use = edge.from();
176 if (control_use->opcode() == IrOpcode::kIfSuccess) {
177 CHECK_NULL(discovered_if_success);
178 discovered_if_success = control_use;
180 if (control_use->opcode() == IrOpcode::kIfException) {
181 CHECK_NULL(discovered_if_exception);
182 discovered_if_exception = control_use;
185 if (discovered_if_success && !discovered_if_exception) {
187 "#%d:%s should be followed by IfSuccess/IfException, but is " 188 "only followed by single #%d:%s",
189 node->id(), node->op()->mnemonic(), discovered_if_success->id(),
190 discovered_if_success->op()->mnemonic());
192 if (discovered_if_exception && !discovered_if_success) {
194 "#%d:%s should be followed by IfSuccess/IfException, but is " 195 "only followed by single #%d:%s",
196 node->id(), node->op()->mnemonic(), discovered_if_exception->id(),
197 discovered_if_exception->op()->mnemonic());
199 if (discovered_if_success || discovered_if_exception) {
200 CHECK_EQ(2, total_number_of_control_uses);
205 switch (node->opcode()) {
206 case IrOpcode::kStart:
208 CHECK_EQ(0, input_count);
211 CheckTypeIs(node, Type::Internal());
215 CHECK_EQ(0, node->op()->ValueOutputCount());
216 CHECK_EQ(0, node->op()->EffectOutputCount());
217 CHECK_EQ(0, node->op()->ControlOutputCount());
219 for (
const Node* input : node->inputs()) {
220 CHECK(IrOpcode::IsGraphTerminator(input->opcode()));
225 case IrOpcode::kDead:
228 case IrOpcode::kDeadValue:
229 CheckValueInputIs(node, 0, Type::None());
230 CheckTypeIs(node, Type::None());
232 case IrOpcode::kUnreachable:
233 CheckTypeIs(node, Type::None());
234 for (Edge edge : node->use_edges()) {
235 Node* use = edge.from();
236 if (NodeProperties::IsValueEdge(edge) && all.IsLive(use)) {
239 CHECK_EQ(IrOpcode::kDeadValue, use->opcode());
243 case IrOpcode::kBranch: {
245 int count_true = 0, count_false = 0;
246 for (
const Node* use : node->uses()) {
247 CHECK(all.IsLive(use) && (use->opcode() == IrOpcode::kIfTrue ||
248 use->opcode() == IrOpcode::kIfFalse));
249 if (use->opcode() == IrOpcode::kIfTrue) ++count_true;
250 if (use->opcode() == IrOpcode::kIfFalse) ++count_false;
252 CHECK_EQ(1, count_true);
253 CHECK_EQ(1, count_false);
255 CheckValueInputIs(node, 0, Type::Boolean());
260 case IrOpcode::kIfTrue:
261 case IrOpcode::kIfFalse: {
262 Node* control = NodeProperties::GetControlInput(node, 0);
263 CHECK_EQ(IrOpcode::kBranch, control->opcode());
268 case IrOpcode::kIfSuccess: {
270 Node* input = NodeProperties::GetControlInput(node, 0);
271 CHECK(!input->op()->HasProperty(Operator::kNoThrow));
276 case IrOpcode::kIfException: {
278 Node* input = NodeProperties::GetControlInput(node, 0);
279 CHECK(!input->op()->HasProperty(Operator::kNoThrow));
281 CheckTypeIs(node, Type::Any());
284 case IrOpcode::kSwitch: {
286 int count_case = 0, count_default = 0;
287 for (
const Node* use : node->uses()) {
288 CHECK(all.IsLive(use));
289 switch (use->opcode()) {
290 case IrOpcode::kIfValue: {
291 for (
const Node* user : node->uses()) {
292 if (user != use && user->opcode() == IrOpcode::kIfValue) {
293 CHECK_NE(IfValueParametersOf(use->op()).value(),
294 IfValueParametersOf(user->op()).value());
300 case IrOpcode::kIfDefault: {
305 FATAL(
"Switch #%d illegally used by #%d:%s", node->id(), use->id(),
306 use->op()->mnemonic());
311 CHECK_EQ(1, count_default);
312 CHECK_EQ(node->op()->ControlOutputCount(), count_case + count_default);
317 case IrOpcode::kIfValue:
318 case IrOpcode::kIfDefault:
319 CHECK_EQ(IrOpcode::kSwitch,
320 NodeProperties::GetControlInput(node)->opcode());
324 case IrOpcode::kLoop: {
325 CHECK_EQ(control_count, input_count);
330 bool has_terminate =
false;
331 for (
const Node* use : node->uses()) {
332 if (all.IsLive(use) && use->opcode() == IrOpcode::kTerminate) {
333 has_terminate =
true;
337 CHECK(has_terminate);
340 case IrOpcode::kMerge:
341 CHECK_EQ(control_count, input_count);
345 case IrOpcode::kDeoptimizeIf:
346 case IrOpcode::kDeoptimizeUnless:
350 case IrOpcode::kTrapIf:
351 case IrOpcode::kTrapUnless:
355 case IrOpcode::kDeoptimize:
356 case IrOpcode::kReturn:
357 case IrOpcode::kThrow:
359 for (
const Node* use : node->uses()) {
360 if (all.IsLive(use)) {
361 CHECK_EQ(IrOpcode::kEnd, use->opcode());
367 case IrOpcode::kTerminate:
369 CHECK_EQ(1, control_count);
370 CHECK_EQ(1, effect_count);
371 CHECK_EQ(2, input_count);
372 CHECK_EQ(IrOpcode::kLoop,
373 NodeProperties::GetControlInput(node)->opcode());
375 for (
const Node* use : node->uses()) {
376 if (all.IsLive(use)) {
377 CHECK_EQ(IrOpcode::kEnd, use->opcode());
383 case IrOpcode::kOsrNormalEntry:
384 case IrOpcode::kOsrLoopEntry:
386 CHECK_EQ(1, control_count);
387 CHECK_EQ(1, effect_count);
388 CHECK_EQ(2, input_count);
395 case IrOpcode::kParameter: {
397 CHECK_EQ(1, input_count);
399 int const index = ParameterIndexOf(node->op());
400 Node*
const start = NodeProperties::GetValueInput(node, 0);
401 CHECK_EQ(IrOpcode::kStart, start->opcode());
404 CHECK_LT(index + 1, start->op()->ValueOutputCount());
406 CheckTypeIs(node, Type::Any());
409 case IrOpcode::kInt32Constant:
410 case IrOpcode::kInt64Constant:
411 case IrOpcode::kFloat32Constant:
412 case IrOpcode::kFloat64Constant:
413 case IrOpcode::kRelocatableInt32Constant:
414 case IrOpcode::kRelocatableInt64Constant:
416 CHECK_EQ(0, input_count);
420 case IrOpcode::kNumberConstant:
422 CHECK_EQ(0, input_count);
424 CheckTypeIs(node, Type::Number());
426 case IrOpcode::kHeapConstant:
428 CHECK_EQ(0, input_count);
430 CheckTypeIs(node, Type::Any());
432 case IrOpcode::kExternalConstant:
433 case IrOpcode::kPointerConstant:
435 CHECK_EQ(0, input_count);
437 CheckTypeIs(node, Type::ExternalPointer());
439 case IrOpcode::kOsrValue:
441 CHECK_EQ(1, control_count);
442 CHECK_EQ(1, input_count);
444 CheckTypeIs(node, Type::Any());
446 case IrOpcode::kProjection: {
448 int index =
static_cast<int>(ProjectionIndexOf(node->op()));
449 Node* input = NodeProperties::GetValueInput(node, 0);
450 CHECK_GT(input->op()->ValueOutputCount(), index);
454 CheckTypeIs(node, Type::Any());
457 case IrOpcode::kSelect: {
458 CHECK_EQ(0, effect_count);
459 CHECK_EQ(0, control_count);
460 CHECK_EQ(3, value_count);
462 CheckValueInputIs(node, 0, Type::Boolean());
464 CheckTypeIs(node, Type::Any());
467 case IrOpcode::kPhi: {
469 CHECK_EQ(0, effect_count);
470 CHECK_EQ(1, control_count);
471 Node* control = NodeProperties::GetControlInput(node, 0);
472 CHECK_EQ(value_count, control->op()->ControlInputCount());
473 CHECK_EQ(input_count, 1 + value_count);
483 case IrOpcode::kInductionVariablePhi: {
488 case IrOpcode::kEffectPhi: {
490 CHECK_EQ(0, value_count);
491 CHECK_EQ(1, control_count);
492 Node* control = NodeProperties::GetControlInput(node, 0);
493 CHECK_EQ(effect_count, control->op()->ControlInputCount());
494 CHECK_EQ(input_count, 1 + effect_count);
497 if (control->opcode() == IrOpcode::kMerge) {
498 bool non_phi_use_found =
false;
499 for (Node* use : control->uses()) {
500 if (all.IsLive(use) && use->opcode() != IrOpcode::kEffectPhi &&
501 use->opcode() != IrOpcode::kPhi) {
502 non_phi_use_found =
true;
505 CHECK(non_phi_use_found);
509 case IrOpcode::kLoopExit: {
510 CHECK_EQ(2, control_count);
511 Node* loop = NodeProperties::GetControlInput(node, 1);
512 CHECK_EQ(IrOpcode::kLoop, loop->opcode());
515 case IrOpcode::kLoopExitValue: {
516 CHECK_EQ(1, control_count);
517 Node* loop_exit = NodeProperties::GetControlInput(node, 0);
518 CHECK_EQ(IrOpcode::kLoopExit, loop_exit->opcode());
521 case IrOpcode::kLoopExitEffect: {
522 CHECK_EQ(1, control_count);
523 Node* loop_exit = NodeProperties::GetControlInput(node, 0);
524 CHECK_EQ(IrOpcode::kLoopExit, loop_exit->opcode());
527 case IrOpcode::kCheckpoint:
531 case IrOpcode::kBeginRegion:
534 case IrOpcode::kFinishRegion: {
537 if (typing == TYPED) {
538 Node* val = NodeProperties::GetValueInput(node, 0);
539 CHECK(NodeProperties::GetType(val).Is(NodeProperties::GetType(node)));
543 case IrOpcode::kFrameState: {
545 CHECK_EQ(5, value_count);
546 CHECK_EQ(0, control_count);
547 CHECK_EQ(0, effect_count);
548 CHECK_EQ(6, input_count);
551 for (
int i = 0;
i < 2; ++
i) {
552 CHECK(NodeProperties::GetValueInput(node,
i)->opcode() ==
553 IrOpcode::kStateValues ||
554 NodeProperties::GetValueInput(node,
i)->opcode() ==
555 IrOpcode::kTypedStateValues);
564 case IrOpcode::kObjectId:
565 CheckTypeIs(node, Type::Object());
567 case IrOpcode::kStateValues:
568 case IrOpcode::kTypedStateValues:
569 case IrOpcode::kArgumentsElementsState:
570 case IrOpcode::kArgumentsLengthState:
571 case IrOpcode::kObjectState:
572 case IrOpcode::kTypedObjectState:
575 case IrOpcode::kCall:
576 case IrOpcode::kCallWithCallerSavedRegisters:
579 case IrOpcode::kTailCall:
585 case IrOpcode::kJSEqual:
586 case IrOpcode::kJSStrictEqual:
587 case IrOpcode::kJSLessThan:
588 case IrOpcode::kJSGreaterThan:
589 case IrOpcode::kJSLessThanOrEqual:
590 case IrOpcode::kJSGreaterThanOrEqual:
592 CheckTypeIs(node, Type::Boolean());
595 case IrOpcode::kJSAdd:
596 CheckTypeIs(node, Type::NumericOrString());
598 case IrOpcode::kJSBitwiseOr:
599 case IrOpcode::kJSBitwiseXor:
600 case IrOpcode::kJSBitwiseAnd:
601 case IrOpcode::kJSShiftLeft:
602 case IrOpcode::kJSShiftRight:
603 case IrOpcode::kJSShiftRightLogical:
604 case IrOpcode::kJSSubtract:
605 case IrOpcode::kJSMultiply:
606 case IrOpcode::kJSDivide:
607 case IrOpcode::kJSModulus:
608 case IrOpcode::kJSExponentiate:
609 case IrOpcode::kJSBitwiseNot:
610 case IrOpcode::kJSDecrement:
611 case IrOpcode::kJSIncrement:
612 case IrOpcode::kJSNegate:
613 CheckTypeIs(node, Type::Numeric());
616 case IrOpcode::kToBoolean:
618 CheckTypeIs(node, Type::Boolean());
620 case IrOpcode::kJSToLength:
621 CheckTypeIs(node, Type::Range(0, kMaxSafeInteger, zone));
623 case IrOpcode::kJSToName:
625 CheckTypeIs(node, Type::Name());
627 case IrOpcode::kJSToNumber:
628 case IrOpcode::kJSToNumberConvertBigInt:
630 CheckTypeIs(node, Type::Number());
632 case IrOpcode::kJSToNumeric:
634 CheckTypeIs(node, Type::Numeric());
636 case IrOpcode::kJSToString:
638 CheckTypeIs(node, Type::String());
640 case IrOpcode::kJSToObject:
642 CheckTypeIs(node, Type::Receiver());
644 case IrOpcode::kJSParseInt:
645 CheckValueInputIs(node, 0, Type::Any());
646 CheckValueInputIs(node, 1, Type::Any());
647 CheckTypeIs(node, Type::Number());
649 case IrOpcode::kJSRegExpTest:
650 CheckValueInputIs(node, 0, Type::Any());
651 CheckValueInputIs(node, 1, Type::String());
652 CheckTypeIs(node, Type::Boolean());
654 case IrOpcode::kJSCreate:
656 CheckTypeIs(node, Type::Object());
658 case IrOpcode::kJSCreateArguments:
660 CheckTypeIs(node, Type::ArrayOrOtherObject());
662 case IrOpcode::kJSCreateArray:
664 CheckTypeIs(node, Type::Array());
666 case IrOpcode::kJSCreateArrayIterator:
668 CheckTypeIs(node, Type::OtherObject());
670 case IrOpcode::kJSCreateAsyncFunctionObject:
672 CheckTypeIs(node, Type::OtherObject());
674 case IrOpcode::kJSCreateCollectionIterator:
676 CheckTypeIs(node, Type::OtherObject());
678 case IrOpcode::kJSCreateBoundFunction:
680 CheckTypeIs(node, Type::BoundFunction());
682 case IrOpcode::kJSCreateClosure:
684 CheckTypeIs(node, Type::Function());
686 case IrOpcode::kJSCreateIterResultObject:
688 CheckTypeIs(node, Type::OtherObject());
690 case IrOpcode::kJSCreateStringIterator:
692 CheckTypeIs(node, Type::OtherObject());
694 case IrOpcode::kJSCreateKeyValueArray:
696 CheckTypeIs(node, Type::OtherObject());
698 case IrOpcode::kJSCreateObject:
700 CheckTypeIs(node, Type::OtherObject());
702 case IrOpcode::kJSCreatePromise:
704 CheckTypeIs(node, Type::OtherObject());
706 case IrOpcode::kJSCreateTypedArray:
708 CheckTypeIs(node, Type::OtherObject());
710 case IrOpcode::kJSCreateLiteralArray:
712 CheckTypeIs(node, Type::Array());
714 case IrOpcode::kJSCreateEmptyLiteralArray:
716 CheckTypeIs(node, Type::Array());
718 case IrOpcode::kJSCreateArrayFromIterable:
720 CheckTypeIs(node, Type::Array());
722 case IrOpcode::kJSCreateLiteralObject:
723 case IrOpcode::kJSCreateEmptyLiteralObject:
724 case IrOpcode::kJSCloneObject:
725 case IrOpcode::kJSCreateLiteralRegExp:
727 CheckTypeIs(node, Type::OtherObject());
729 case IrOpcode::kJSLoadProperty:
731 CheckTypeIs(node, Type::Any());
732 CHECK(PropertyAccessOf(node->op()).feedback().IsValid());
734 case IrOpcode::kJSLoadNamed:
736 CheckTypeIs(node, Type::Any());
738 case IrOpcode::kJSLoadGlobal:
740 CheckTypeIs(node, Type::Any());
741 CHECK(LoadGlobalParametersOf(node->op()).feedback().IsValid());
743 case IrOpcode::kJSStoreProperty:
746 CHECK(PropertyAccessOf(node->op()).feedback().IsValid());
748 case IrOpcode::kJSStoreNamed:
752 case IrOpcode::kJSStoreGlobal:
755 CHECK(StoreGlobalParametersOf(node->op()).feedback().IsValid());
757 case IrOpcode::kJSStoreNamedOwn:
760 CHECK(StoreNamedOwnParametersOf(node->op()).feedback().IsValid());
762 case IrOpcode::kJSStoreDataPropertyInLiteral:
763 case IrOpcode::kJSStoreInArrayLiteral:
766 CHECK(FeedbackParameterOf(node->op()).feedback().IsValid());
768 case IrOpcode::kJSDeleteProperty:
769 case IrOpcode::kJSHasProperty:
770 case IrOpcode::kJSHasInPrototypeChain:
771 case IrOpcode::kJSInstanceOf:
772 case IrOpcode::kJSOrdinaryHasInstance:
774 CheckTypeIs(node, Type::Boolean());
776 case IrOpcode::kTypeOf:
778 CheckTypeIs(node, Type::InternalizedString());
780 case IrOpcode::kJSGetSuperConstructor:
784 CheckValueInputIs(node, 0, Type::Any());
785 CheckTypeIs(node, Type::Callable());
788 case IrOpcode::kJSLoadContext:
790 CheckTypeIs(node, Type::Any());
792 case IrOpcode::kJSStoreContext:
796 case IrOpcode::kJSCreateFunctionContext:
797 case IrOpcode::kJSCreateCatchContext:
798 case IrOpcode::kJSCreateWithContext:
799 case IrOpcode::kJSCreateBlockContext: {
801 Node* context = NodeProperties::GetContextInput(node);
804 CheckTypeMaybe(context, Type::OtherInternal());
805 CheckTypeIs(node, Type::OtherInternal());
809 case IrOpcode::kJSConstructForwardVarargs:
810 case IrOpcode::kJSConstruct:
811 case IrOpcode::kJSConstructWithArrayLike:
812 case IrOpcode::kJSConstructWithSpread:
814 CheckTypeIs(node, Type::Receiver());
816 case IrOpcode::kJSCallForwardVarargs:
817 case IrOpcode::kJSCall:
818 case IrOpcode::kJSCallWithArrayLike:
819 case IrOpcode::kJSCallWithSpread:
820 case IrOpcode::kJSCallRuntime:
822 CheckTypeIs(node, Type::Any());
825 case IrOpcode::kJSForInEnumerate:
827 CheckValueInputIs(node, 0, Type::Any());
828 CheckTypeIs(node, Type::OtherInternal());
830 case IrOpcode::kJSForInPrepare:
832 CheckTypeIs(node, Type::Any());
834 case IrOpcode::kJSForInNext:
835 CheckTypeIs(node, Type::Union(Type::Name(), Type::Undefined(), zone));
838 case IrOpcode::kJSLoadMessage:
839 case IrOpcode::kJSStoreMessage:
842 case IrOpcode::kJSLoadModule:
843 CheckTypeIs(node, Type::Any());
845 case IrOpcode::kJSStoreModule:
849 case IrOpcode::kJSGeneratorStore:
853 case IrOpcode::kJSCreateGeneratorObject:
854 CheckTypeIs(node, Type::OtherObject());
857 case IrOpcode::kJSGeneratorRestoreContinuation:
858 CheckTypeIs(node, Type::SignedSmall());
861 case IrOpcode::kJSGeneratorRestoreContext:
862 CheckTypeIs(node, Type::Any());
865 case IrOpcode::kJSGeneratorRestoreRegister:
866 CheckTypeIs(node, Type::Any());
869 case IrOpcode::kJSGeneratorRestoreInputOrDebugPos:
870 CheckTypeIs(node, Type::Any());
873 case IrOpcode::kJSStackCheck:
874 case IrOpcode::kJSDebugger:
879 case IrOpcode::kJSAsyncFunctionEnter:
880 CheckValueInputIs(node, 0, Type::Any());
881 CheckValueInputIs(node, 1, Type::Any());
882 CheckTypeIs(node, Type::OtherObject());
884 case IrOpcode::kJSAsyncFunctionReject:
885 CheckValueInputIs(node, 0, Type::Any());
886 CheckValueInputIs(node, 1, Type::Any());
887 CheckValueInputIs(node, 2, Type::Boolean());
888 CheckTypeIs(node, Type::OtherObject());
890 case IrOpcode::kJSAsyncFunctionResolve:
891 CheckValueInputIs(node, 0, Type::Any());
892 CheckValueInputIs(node, 1, Type::Any());
893 CheckValueInputIs(node, 2, Type::Boolean());
894 CheckTypeIs(node, Type::OtherObject());
896 case IrOpcode::kJSFulfillPromise:
897 CheckValueInputIs(node, 0, Type::Any());
898 CheckValueInputIs(node, 1, Type::Any());
899 CheckTypeIs(node, Type::Undefined());
901 case IrOpcode::kJSPerformPromiseThen:
902 CheckValueInputIs(node, 0, Type::Any());
903 CheckValueInputIs(node, 1, Type::Any());
904 CheckValueInputIs(node, 2, Type::Any());
905 CheckValueInputIs(node, 3, Type::Any());
906 CheckTypeIs(node, Type::Receiver());
908 case IrOpcode::kJSPromiseResolve:
909 CheckValueInputIs(node, 0, Type::Any());
910 CheckValueInputIs(node, 1, Type::Any());
911 CheckTypeIs(node, Type::Receiver());
913 case IrOpcode::kJSRejectPromise:
914 CheckValueInputIs(node, 0, Type::Any());
915 CheckValueInputIs(node, 1, Type::Any());
916 CheckValueInputIs(node, 2, Type::Any());
917 CheckTypeIs(node, Type::Undefined());
919 case IrOpcode::kJSResolvePromise:
920 CheckValueInputIs(node, 0, Type::Any());
921 CheckValueInputIs(node, 1, Type::Any());
922 CheckTypeIs(node, Type::Undefined());
924 case IrOpcode::kJSObjectIsArray:
925 CheckValueInputIs(node, 0, Type::Any());
926 CheckTypeIs(node, Type::Boolean());
929 case IrOpcode::kComment:
930 case IrOpcode::kDebugAbort:
931 case IrOpcode::kDebugBreak:
932 case IrOpcode::kRetain:
933 case IrOpcode::kUnsafePointerAdd:
934 case IrOpcode::kRuntimeAbort:
940 case IrOpcode::kBooleanNot:
942 CheckValueInputIs(node, 0, Type::Boolean());
943 CheckTypeIs(node, Type::Boolean());
945 case IrOpcode::kNumberEqual:
947 CheckValueInputIs(node, 0, Type::Number());
948 CheckValueInputIs(node, 1, Type::Number());
949 CheckTypeIs(node, Type::Boolean());
951 case IrOpcode::kNumberLessThan:
952 case IrOpcode::kNumberLessThanOrEqual:
954 CheckValueInputIs(node, 0, Type::Number());
955 CheckValueInputIs(node, 1, Type::Number());
956 CheckTypeIs(node, Type::Boolean());
958 case IrOpcode::kSpeculativeSafeIntegerAdd:
959 case IrOpcode::kSpeculativeSafeIntegerSubtract:
960 case IrOpcode::kSpeculativeNumberAdd:
961 case IrOpcode::kSpeculativeNumberSubtract:
962 case IrOpcode::kSpeculativeNumberMultiply:
963 case IrOpcode::kSpeculativeNumberDivide:
964 case IrOpcode::kSpeculativeNumberModulus:
965 CheckTypeIs(node, Type::Number());
967 case IrOpcode::kSpeculativeNumberEqual:
968 case IrOpcode::kSpeculativeNumberLessThan:
969 case IrOpcode::kSpeculativeNumberLessThanOrEqual:
970 CheckTypeIs(node, Type::Boolean());
972 case IrOpcode::kNumberAdd:
973 case IrOpcode::kNumberSubtract:
974 case IrOpcode::kNumberMultiply:
975 case IrOpcode::kNumberDivide:
977 CheckValueInputIs(node, 0, Type::Number());
978 CheckValueInputIs(node, 1, Type::Number());
979 CheckTypeIs(node, Type::Number());
981 case IrOpcode::kNumberModulus:
983 CheckValueInputIs(node, 0, Type::Number());
984 CheckValueInputIs(node, 1, Type::Number());
985 CheckTypeIs(node, Type::Number());
987 case IrOpcode::kNumberBitwiseOr:
988 case IrOpcode::kNumberBitwiseXor:
989 case IrOpcode::kNumberBitwiseAnd:
991 CheckValueInputIs(node, 0, Type::Signed32());
992 CheckValueInputIs(node, 1, Type::Signed32());
993 CheckTypeIs(node, Type::Signed32());
995 case IrOpcode::kSpeculativeNumberBitwiseOr:
996 case IrOpcode::kSpeculativeNumberBitwiseXor:
997 case IrOpcode::kSpeculativeNumberBitwiseAnd:
998 CheckTypeIs(node, Type::Signed32());
1000 case IrOpcode::kNumberShiftLeft:
1001 case IrOpcode::kNumberShiftRight:
1003 CheckValueInputIs(node, 0, Type::Signed32());
1004 CheckValueInputIs(node, 1, Type::Unsigned32());
1005 CheckTypeIs(node, Type::Signed32());
1007 case IrOpcode::kSpeculativeNumberShiftLeft:
1008 case IrOpcode::kSpeculativeNumberShiftRight:
1009 CheckTypeIs(node, Type::Signed32());
1011 case IrOpcode::kNumberShiftRightLogical:
1013 CheckValueInputIs(node, 0, Type::Unsigned32());
1014 CheckValueInputIs(node, 1, Type::Unsigned32());
1015 CheckTypeIs(node, Type::Unsigned32());
1017 case IrOpcode::kSpeculativeNumberShiftRightLogical:
1018 CheckTypeIs(node, Type::Unsigned32());
1020 case IrOpcode::kNumberImul:
1022 CheckValueInputIs(node, 0, Type::Unsigned32());
1023 CheckValueInputIs(node, 1, Type::Unsigned32());
1024 CheckTypeIs(node, Type::Signed32());
1026 case IrOpcode::kNumberClz32:
1028 CheckValueInputIs(node, 0, Type::Unsigned32());
1029 CheckTypeIs(node, Type::Unsigned32());
1031 case IrOpcode::kNumberAtan2:
1032 case IrOpcode::kNumberMax:
1033 case IrOpcode::kNumberMin:
1034 case IrOpcode::kNumberPow:
1036 CheckValueInputIs(node, 0, Type::Number());
1037 CheckValueInputIs(node, 1, Type::Number());
1038 CheckTypeIs(node, Type::Number());
1040 case IrOpcode::kNumberAbs:
1041 case IrOpcode::kNumberCeil:
1042 case IrOpcode::kNumberFloor:
1043 case IrOpcode::kNumberFround:
1044 case IrOpcode::kNumberAcos:
1045 case IrOpcode::kNumberAcosh:
1046 case IrOpcode::kNumberAsin:
1047 case IrOpcode::kNumberAsinh:
1048 case IrOpcode::kNumberAtan:
1049 case IrOpcode::kNumberAtanh:
1050 case IrOpcode::kNumberCos:
1051 case IrOpcode::kNumberCosh:
1052 case IrOpcode::kNumberExp:
1053 case IrOpcode::kNumberExpm1:
1054 case IrOpcode::kNumberLog:
1055 case IrOpcode::kNumberLog1p:
1056 case IrOpcode::kNumberLog2:
1057 case IrOpcode::kNumberLog10:
1058 case IrOpcode::kNumberCbrt:
1059 case IrOpcode::kNumberRound:
1060 case IrOpcode::kNumberSign:
1061 case IrOpcode::kNumberSin:
1062 case IrOpcode::kNumberSinh:
1063 case IrOpcode::kNumberSqrt:
1064 case IrOpcode::kNumberTan:
1065 case IrOpcode::kNumberTanh:
1066 case IrOpcode::kNumberTrunc:
1068 CheckValueInputIs(node, 0, Type::Number());
1069 CheckTypeIs(node, Type::Number());
1071 case IrOpcode::kNumberToBoolean:
1073 CheckValueInputIs(node, 0, Type::Number());
1074 CheckTypeIs(node, Type::Boolean());
1076 case IrOpcode::kNumberToInt32:
1078 CheckValueInputIs(node, 0, Type::Number());
1079 CheckTypeIs(node, Type::Signed32());
1081 case IrOpcode::kNumberToString:
1083 CheckValueInputIs(node, 0, Type::Number());
1084 CheckTypeIs(node, Type::String());
1086 case IrOpcode::kNumberToUint32:
1087 case IrOpcode::kNumberToUint8Clamped:
1089 CheckValueInputIs(node, 0, Type::Number());
1090 CheckTypeIs(node, Type::Unsigned32());
1092 case IrOpcode::kSpeculativeToNumber:
1094 CheckValueInputIs(node, 0, Type::Any());
1095 CheckTypeIs(node, Type::Number());
1097 case IrOpcode::kPlainPrimitiveToNumber:
1099 CheckValueInputIs(node, 0, Type::PlainPrimitive());
1100 CheckTypeIs(node, Type::Number());
1102 case IrOpcode::kPlainPrimitiveToWord32:
1104 CheckValueInputIs(node, 0, Type::PlainPrimitive());
1105 CheckTypeIs(node, Type::Integral32());
1107 case IrOpcode::kPlainPrimitiveToFloat64:
1109 CheckValueInputIs(node, 0, Type::PlainPrimitive());
1110 CheckTypeIs(node, Type::Number());
1112 case IrOpcode::kStringConcat:
1113 CheckValueInputIs(node, 0, TypeCache::Get().kStringLengthType);
1114 CheckValueInputIs(node, 1, Type::String());
1115 CheckValueInputIs(node, 2, Type::String());
1116 CheckTypeIs(node, Type::String());
1118 case IrOpcode::kStringEqual:
1119 case IrOpcode::kStringLessThan:
1120 case IrOpcode::kStringLessThanOrEqual:
1122 CheckValueInputIs(node, 0, Type::String());
1123 CheckValueInputIs(node, 1, Type::String());
1124 CheckTypeIs(node, Type::Boolean());
1126 case IrOpcode::kStringToNumber:
1128 CheckValueInputIs(node, 0, Type::String());
1129 CheckTypeIs(node, Type::Number());
1131 case IrOpcode::kStringCharCodeAt:
1133 CheckValueInputIs(node, 0, Type::String());
1134 CheckValueInputIs(node, 1, Type::Unsigned32());
1135 CheckTypeIs(node, Type::UnsignedSmall());
1137 case IrOpcode::kStringCodePointAt:
1139 CheckValueInputIs(node, 0, Type::String());
1140 CheckValueInputIs(node, 1, Type::Unsigned32());
1141 CheckTypeIs(node, Type::UnsignedSmall());
1143 case IrOpcode::kStringFromSingleCharCode:
1145 CheckValueInputIs(node, 0, Type::Number());
1146 CheckTypeIs(node, Type::String());
1148 case IrOpcode::kStringFromSingleCodePoint:
1150 CheckValueInputIs(node, 0, Type::Number());
1151 CheckTypeIs(node, Type::String());
1153 case IrOpcode::kStringIndexOf:
1155 CheckValueInputIs(node, 0, Type::String());
1156 CheckValueInputIs(node, 1, Type::String());
1157 CheckValueInputIs(node, 2, Type::SignedSmall());
1158 CheckTypeIs(node, Type::SignedSmall());
1160 case IrOpcode::kStringLength:
1161 CheckValueInputIs(node, 0, Type::String());
1162 CheckTypeIs(node, TypeCache::Get().kStringLengthType);
1164 case IrOpcode::kStringToLowerCaseIntl:
1165 case IrOpcode::kStringToUpperCaseIntl:
1166 CheckValueInputIs(node, 0, Type::String());
1167 CheckTypeIs(node, Type::String());
1169 case IrOpcode::kStringSubstring:
1170 CheckValueInputIs(node, 0, Type::String());
1171 CheckValueInputIs(node, 1, Type::SignedSmall());
1172 CheckValueInputIs(node, 2, Type::SignedSmall());
1173 CheckTypeIs(node, Type::String());
1175 case IrOpcode::kReferenceEqual:
1178 CheckTypeIs(node, Type::Boolean());
1180 case IrOpcode::kSameValue:
1182 CheckValueInputIs(node, 0, Type::Any());
1183 CheckValueInputIs(node, 1, Type::Any());
1184 CheckTypeIs(node, Type::Boolean());
1187 case IrOpcode::kObjectIsArrayBufferView:
1188 case IrOpcode::kObjectIsBigInt:
1189 case IrOpcode::kObjectIsCallable:
1190 case IrOpcode::kObjectIsConstructor:
1191 case IrOpcode::kObjectIsDetectableCallable:
1192 case IrOpcode::kObjectIsMinusZero:
1193 case IrOpcode::kObjectIsNaN:
1194 case IrOpcode::kObjectIsNonCallable:
1195 case IrOpcode::kObjectIsNumber:
1196 case IrOpcode::kObjectIsReceiver:
1197 case IrOpcode::kObjectIsSmi:
1198 case IrOpcode::kObjectIsString:
1199 case IrOpcode::kObjectIsSymbol:
1200 case IrOpcode::kObjectIsUndetectable:
1201 CheckValueInputIs(node, 0, Type::Any());
1202 CheckTypeIs(node, Type::Boolean());
1204 case IrOpcode::kNumberIsFloat64Hole:
1205 CheckValueInputIs(node, 0, Type::NumberOrHole());
1206 CheckTypeIs(node, Type::Boolean());
1208 case IrOpcode::kNumberIsFinite:
1209 CheckValueInputIs(node, 0, Type::Number());
1210 CheckTypeIs(node, Type::Boolean());
1212 case IrOpcode::kNumberIsMinusZero:
1213 case IrOpcode::kNumberIsNaN:
1214 CheckValueInputIs(node, 0, Type::Number());
1215 CheckTypeIs(node, Type::Boolean());
1217 case IrOpcode::kObjectIsFiniteNumber:
1218 CheckValueInputIs(node, 0, Type::Any());
1219 CheckTypeIs(node, Type::Boolean());
1221 case IrOpcode::kNumberIsInteger:
1222 CheckValueInputIs(node, 0, Type::Number());
1223 CheckTypeIs(node, Type::Boolean());
1225 case IrOpcode::kObjectIsSafeInteger:
1226 CheckValueInputIs(node, 0, Type::Any());
1227 CheckTypeIs(node, Type::Boolean());
1229 case IrOpcode::kNumberIsSafeInteger:
1230 CheckValueInputIs(node, 0, Type::Number());
1231 CheckTypeIs(node, Type::Boolean());
1233 case IrOpcode::kObjectIsInteger:
1234 CheckValueInputIs(node, 0, Type::Any());
1235 CheckTypeIs(node, Type::Boolean());
1237 case IrOpcode::kFindOrderedHashMapEntry:
1238 CheckValueInputIs(node, 0, Type::Any());
1239 CheckTypeIs(node, Type::SignedSmall());
1241 case IrOpcode::kFindOrderedHashMapEntryForInt32Key:
1242 CheckValueInputIs(node, 0, Type::Any());
1243 CheckValueInputIs(node, 1, Type::Signed32());
1244 CheckTypeIs(node, Type::SignedSmall());
1246 case IrOpcode::kArgumentsLength:
1247 CheckValueInputIs(node, 0, Type::ExternalPointer());
1248 CheckTypeIs(node, TypeCache::Get().kArgumentsLengthType);
1250 case IrOpcode::kArgumentsFrame:
1251 CheckTypeIs(node, Type::ExternalPointer());
1253 case IrOpcode::kNewDoubleElements:
1254 case IrOpcode::kNewSmiOrObjectElements:
1255 CheckValueInputIs(node, 0,
1256 Type::Range(0.0, FixedArray::kMaxLength, zone));
1257 CheckTypeIs(node, Type::OtherInternal());
1259 case IrOpcode::kNewArgumentsElements:
1260 CheckValueInputIs(node, 0, Type::ExternalPointer());
1261 CheckValueInputIs(node, 1, Type::Unsigned30());
1262 CheckTypeIs(node, Type::OtherInternal());
1264 case IrOpcode::kNewConsString:
1265 CheckValueInputIs(node, 0, TypeCache::Get().kStringLengthType);
1266 CheckValueInputIs(node, 1, Type::String());
1267 CheckValueInputIs(node, 2, Type::String());
1268 CheckTypeIs(node, Type::String());
1270 case IrOpcode::kDelayedStringConstant:
1271 CheckTypeIs(node, Type::String());
1273 case IrOpcode::kAllocate:
1274 CheckValueInputIs(node, 0, Type::PlainNumber());
1276 case IrOpcode::kAllocateRaw:
1279 case IrOpcode::kEnsureWritableFastElements:
1280 CheckValueInputIs(node, 0, Type::Any());
1281 CheckValueInputIs(node, 1, Type::Internal());
1282 CheckTypeIs(node, Type::Internal());
1284 case IrOpcode::kMaybeGrowFastElements:
1285 CheckValueInputIs(node, 0, Type::Any());
1286 CheckValueInputIs(node, 1, Type::Internal());
1287 CheckValueInputIs(node, 2, Type::Unsigned31());
1288 CheckValueInputIs(node, 3, Type::Unsigned31());
1289 CheckTypeIs(node, Type::Internal());
1291 case IrOpcode::kTransitionElementsKind:
1292 CheckValueInputIs(node, 0, Type::Any());
1293 CheckNotTyped(node);
1296 case IrOpcode::kChangeTaggedSignedToInt32: {
1305 case IrOpcode::kChangeTaggedSignedToInt64:
1307 case IrOpcode::kChangeTaggedToInt32: {
1316 case IrOpcode::kChangeTaggedToInt64:
1318 case IrOpcode::kChangeTaggedToUint32: {
1327 case IrOpcode::kChangeTaggedToFloat64: {
1336 case IrOpcode::kChangeTaggedToTaggedSigned:
1338 case IrOpcode::kTruncateTaggedToFloat64: {
1348 case IrOpcode::kChangeInt31ToTaggedSigned: {
1357 case IrOpcode::kChangeInt32ToTagged: {
1366 case IrOpcode::kChangeInt64ToTagged:
1368 case IrOpcode::kChangeUint32ToTagged: {
1377 case IrOpcode::kChangeUint64ToTagged:
1379 case IrOpcode::kChangeFloat64ToTagged: {
1388 case IrOpcode::kChangeFloat64ToTaggedPointer:
1390 case IrOpcode::kChangeTaggedToBit: {
1399 case IrOpcode::kChangeBitToTagged: {
1408 case IrOpcode::kTruncateTaggedToWord32: {
1417 case IrOpcode::kTruncateTaggedToBit:
1418 case IrOpcode::kTruncateTaggedPointerToBit:
1421 case IrOpcode::kCheckBounds:
1422 CheckValueInputIs(node, 0, Type::Any());
1423 CheckValueInputIs(node, 1, TypeCache::Get().kPositiveSafeInteger);
1424 CheckTypeIs(node, TypeCache::Get().kPositiveSafeInteger);
1426 case IrOpcode::kPoisonIndex:
1427 CheckValueInputIs(node, 0, Type::Unsigned32());
1428 CheckTypeIs(node, Type::Unsigned32());
1430 case IrOpcode::kCheckHeapObject:
1431 CheckValueInputIs(node, 0, Type::Any());
1433 case IrOpcode::kCheckIf:
1434 CheckValueInputIs(node, 0, Type::Boolean());
1435 CheckNotTyped(node);
1437 case IrOpcode::kCheckInternalizedString:
1438 CheckValueInputIs(node, 0, Type::Any());
1439 CheckTypeIs(node, Type::InternalizedString());
1441 case IrOpcode::kCheckMaps:
1442 CheckValueInputIs(node, 0, Type::Any());
1443 CheckNotTyped(node);
1445 case IrOpcode::kCompareMaps:
1446 CheckValueInputIs(node, 0, Type::Any());
1447 CheckTypeIs(node, Type::Boolean());
1449 case IrOpcode::kCheckNumber:
1450 CheckValueInputIs(node, 0, Type::Any());
1451 CheckTypeIs(node, Type::Number());
1453 case IrOpcode::kCheckReceiver:
1454 CheckValueInputIs(node, 0, Type::Any());
1455 CheckTypeIs(node, Type::Receiver());
1457 case IrOpcode::kCheckReceiverOrNullOrUndefined:
1458 CheckValueInputIs(node, 0, Type::Any());
1459 CheckTypeIs(node, Type::ReceiverOrNullOrUndefined());
1461 case IrOpcode::kCheckSmi:
1462 CheckValueInputIs(node, 0, Type::Any());
1464 case IrOpcode::kCheckString:
1465 CheckValueInputIs(node, 0, Type::Any());
1466 CheckTypeIs(node, Type::String());
1468 case IrOpcode::kCheckSymbol:
1469 CheckValueInputIs(node, 0, Type::Any());
1470 CheckTypeIs(node, Type::Symbol());
1472 case IrOpcode::kConvertReceiver:
1474 CheckValueInputIs(node, 0, Type::Any());
1475 CheckValueInputIs(node, 1, Type::Any());
1476 CheckTypeIs(node, Type::Receiver());
1479 case IrOpcode::kCheckedInt32Add:
1480 case IrOpcode::kCheckedInt32Sub:
1481 case IrOpcode::kCheckedInt32Div:
1482 case IrOpcode::kCheckedInt32Mod:
1483 case IrOpcode::kCheckedUint32Div:
1484 case IrOpcode::kCheckedUint32Mod:
1485 case IrOpcode::kCheckedInt32Mul:
1486 case IrOpcode::kCheckedInt32ToTaggedSigned:
1487 case IrOpcode::kCheckedInt64ToInt32:
1488 case IrOpcode::kCheckedInt64ToTaggedSigned:
1489 case IrOpcode::kCheckedUint32Bounds:
1490 case IrOpcode::kCheckedUint32ToInt32:
1491 case IrOpcode::kCheckedUint32ToTaggedSigned:
1492 case IrOpcode::kCheckedUint64Bounds:
1493 case IrOpcode::kCheckedUint64ToInt32:
1494 case IrOpcode::kCheckedUint64ToTaggedSigned:
1495 case IrOpcode::kCheckedFloat64ToInt32:
1496 case IrOpcode::kCheckedFloat64ToInt64:
1497 case IrOpcode::kCheckedTaggedSignedToInt32:
1498 case IrOpcode::kCheckedTaggedToInt32:
1499 case IrOpcode::kCheckedTaggedToInt64:
1500 case IrOpcode::kCheckedTaggedToFloat64:
1501 case IrOpcode::kCheckedTaggedToTaggedSigned:
1502 case IrOpcode::kCheckedTaggedToTaggedPointer:
1503 case IrOpcode::kCheckedTruncateTaggedToWord32:
1506 case IrOpcode::kCheckFloat64Hole:
1507 CheckValueInputIs(node, 0, Type::NumberOrHole());
1508 CheckTypeIs(node, Type::NumberOrUndefined());
1510 case IrOpcode::kCheckNotTaggedHole:
1511 CheckValueInputIs(node, 0, Type::Any());
1512 CheckTypeIs(node, Type::NonInternal());
1514 case IrOpcode::kConvertTaggedHoleToUndefined:
1515 CheckValueInputIs(node, 0, Type::Any());
1516 CheckTypeIs(node, Type::NonInternal());
1519 case IrOpcode::kCheckEqualsInternalizedString:
1520 CheckValueInputIs(node, 0, Type::InternalizedString());
1521 CheckValueInputIs(node, 1, Type::Any());
1522 CheckNotTyped(node);
1524 case IrOpcode::kCheckEqualsSymbol:
1525 CheckValueInputIs(node, 0, Type::Symbol());
1526 CheckValueInputIs(node, 1, Type::Any());
1527 CheckNotTyped(node);
1530 case IrOpcode::kLoadFieldByIndex:
1531 CheckValueInputIs(node, 0, Type::Any());
1532 CheckValueInputIs(node, 1, Type::SignedSmall());
1533 CheckTypeIs(node, Type::NonInternal());
1535 case IrOpcode::kLoadField:
1541 case IrOpcode::kLoadElement:
1547 case IrOpcode::kLoadTypedElement:
1549 case IrOpcode::kLoadDataViewElement:
1551 case IrOpcode::kStoreField:
1556 CheckNotTyped(node);
1558 case IrOpcode::kStoreElement:
1563 CheckNotTyped(node);
1565 case IrOpcode::kTransitionAndStoreElement:
1566 CheckNotTyped(node);
1568 case IrOpcode::kTransitionAndStoreNumberElement:
1569 CheckNotTyped(node);
1571 case IrOpcode::kTransitionAndStoreNonNumberElement:
1572 CheckNotTyped(node);
1574 case IrOpcode::kStoreSignedSmallElement:
1575 CheckNotTyped(node);
1577 case IrOpcode::kStoreTypedElement:
1578 CheckNotTyped(node);
1580 case IrOpcode::kStoreDataViewElement:
1581 CheckNotTyped(node);
1583 case IrOpcode::kNumberSilenceNaN:
1584 CheckValueInputIs(node, 0, Type::Number());
1585 CheckTypeIs(node, Type::Number());
1587 case IrOpcode::kMapGuard:
1588 CheckNotTyped(node);
1590 case IrOpcode::kTypeGuard:
1591 CheckTypeIs(node, TypeGuardTypeOf(node->op()));
1593 case IrOpcode::kDateNow:
1594 CHECK_EQ(0, value_count);
1595 CheckTypeIs(node, Type::Number());
1600 case IrOpcode::kLoad:
1601 case IrOpcode::kPoisonedLoad:
1602 case IrOpcode::kProtectedLoad:
1603 case IrOpcode::kProtectedStore:
1604 case IrOpcode::kStore:
1605 case IrOpcode::kStackSlot:
1606 case IrOpcode::kWord32And:
1607 case IrOpcode::kWord32Or:
1608 case IrOpcode::kWord32Xor:
1609 case IrOpcode::kWord32Shl:
1610 case IrOpcode::kWord32Shr:
1611 case IrOpcode::kWord32Sar:
1612 case IrOpcode::kWord32Ror:
1613 case IrOpcode::kWord32Equal:
1614 case IrOpcode::kWord32Clz:
1615 case IrOpcode::kWord32Ctz:
1616 case IrOpcode::kWord32ReverseBits:
1617 case IrOpcode::kWord32ReverseBytes:
1618 case IrOpcode::kInt32AbsWithOverflow:
1619 case IrOpcode::kWord32Popcnt:
1620 case IrOpcode::kWord64And:
1621 case IrOpcode::kWord64Or:
1622 case IrOpcode::kWord64Xor:
1623 case IrOpcode::kWord64Shl:
1624 case IrOpcode::kWord64Shr:
1625 case IrOpcode::kWord64Sar:
1626 case IrOpcode::kWord64Ror:
1627 case IrOpcode::kWord64Clz:
1628 case IrOpcode::kWord64Popcnt:
1629 case IrOpcode::kWord64Ctz:
1630 case IrOpcode::kWord64ReverseBits:
1631 case IrOpcode::kWord64ReverseBytes:
1632 case IrOpcode::kInt64AbsWithOverflow:
1633 case IrOpcode::kWord64Equal:
1634 case IrOpcode::kInt32Add:
1635 case IrOpcode::kInt32AddWithOverflow:
1636 case IrOpcode::kInt32Sub:
1637 case IrOpcode::kInt32SubWithOverflow:
1638 case IrOpcode::kInt32Mul:
1639 case IrOpcode::kInt32MulWithOverflow:
1640 case IrOpcode::kInt32MulHigh:
1641 case IrOpcode::kInt32Div:
1642 case IrOpcode::kInt32Mod:
1643 case IrOpcode::kInt32LessThan:
1644 case IrOpcode::kInt32LessThanOrEqual:
1645 case IrOpcode::kUint32Div:
1646 case IrOpcode::kUint32Mod:
1647 case IrOpcode::kUint32MulHigh:
1648 case IrOpcode::kUint32LessThan:
1649 case IrOpcode::kUint32LessThanOrEqual:
1650 case IrOpcode::kInt64Add:
1651 case IrOpcode::kInt64AddWithOverflow:
1652 case IrOpcode::kInt64Sub:
1653 case IrOpcode::kInt64SubWithOverflow:
1654 case IrOpcode::kInt64Mul:
1655 case IrOpcode::kInt64Div:
1656 case IrOpcode::kInt64Mod:
1657 case IrOpcode::kInt64LessThan:
1658 case IrOpcode::kInt64LessThanOrEqual:
1659 case IrOpcode::kUint64Div:
1660 case IrOpcode::kUint64Mod:
1661 case IrOpcode::kUint64LessThan:
1662 case IrOpcode::kUint64LessThanOrEqual:
1663 case IrOpcode::kFloat32Add:
1664 case IrOpcode::kFloat32Sub:
1665 case IrOpcode::kFloat32Neg:
1666 case IrOpcode::kFloat32Mul:
1667 case IrOpcode::kFloat32Div:
1668 case IrOpcode::kFloat32Abs:
1669 case IrOpcode::kFloat32Sqrt:
1670 case IrOpcode::kFloat32Equal:
1671 case IrOpcode::kFloat32LessThan:
1672 case IrOpcode::kFloat32LessThanOrEqual:
1673 case IrOpcode::kFloat32Max:
1674 case IrOpcode::kFloat32Min:
1675 case IrOpcode::kFloat64Add:
1676 case IrOpcode::kFloat64Sub:
1677 case IrOpcode::kFloat64Neg:
1678 case IrOpcode::kFloat64Mul:
1679 case IrOpcode::kFloat64Div:
1680 case IrOpcode::kFloat64Mod:
1681 case IrOpcode::kFloat64Max:
1682 case IrOpcode::kFloat64Min:
1683 case IrOpcode::kFloat64Abs:
1684 case IrOpcode::kFloat64Acos:
1685 case IrOpcode::kFloat64Acosh:
1686 case IrOpcode::kFloat64Asin:
1687 case IrOpcode::kFloat64Asinh:
1688 case IrOpcode::kFloat64Atan:
1689 case IrOpcode::kFloat64Atan2:
1690 case IrOpcode::kFloat64Atanh:
1691 case IrOpcode::kFloat64Cbrt:
1692 case IrOpcode::kFloat64Cos:
1693 case IrOpcode::kFloat64Cosh:
1694 case IrOpcode::kFloat64Exp:
1695 case IrOpcode::kFloat64Expm1:
1696 case IrOpcode::kFloat64Log:
1697 case IrOpcode::kFloat64Log1p:
1698 case IrOpcode::kFloat64Log10:
1699 case IrOpcode::kFloat64Log2:
1700 case IrOpcode::kFloat64Pow:
1701 case IrOpcode::kFloat64Sin:
1702 case IrOpcode::kFloat64Sinh:
1703 case IrOpcode::kFloat64Sqrt:
1704 case IrOpcode::kFloat64Tan:
1705 case IrOpcode::kFloat64Tanh:
1706 case IrOpcode::kFloat32RoundDown:
1707 case IrOpcode::kFloat64RoundDown:
1708 case IrOpcode::kFloat32RoundUp:
1709 case IrOpcode::kFloat64RoundUp:
1710 case IrOpcode::kFloat32RoundTruncate:
1711 case IrOpcode::kFloat64RoundTruncate:
1712 case IrOpcode::kFloat64RoundTiesAway:
1713 case IrOpcode::kFloat32RoundTiesEven:
1714 case IrOpcode::kFloat64RoundTiesEven:
1715 case IrOpcode::kFloat64Equal:
1716 case IrOpcode::kFloat64LessThan:
1717 case IrOpcode::kFloat64LessThanOrEqual:
1718 case IrOpcode::kTruncateInt64ToInt32:
1719 case IrOpcode::kRoundFloat64ToInt32:
1720 case IrOpcode::kRoundInt32ToFloat32:
1721 case IrOpcode::kRoundInt64ToFloat32:
1722 case IrOpcode::kRoundInt64ToFloat64:
1723 case IrOpcode::kRoundUint32ToFloat32:
1724 case IrOpcode::kRoundUint64ToFloat64:
1725 case IrOpcode::kRoundUint64ToFloat32:
1726 case IrOpcode::kTruncateFloat64ToFloat32:
1727 case IrOpcode::kTruncateFloat64ToWord32:
1728 case IrOpcode::kBitcastFloat32ToInt32:
1729 case IrOpcode::kBitcastFloat64ToInt64:
1730 case IrOpcode::kBitcastInt32ToFloat32:
1731 case IrOpcode::kBitcastInt64ToFloat64:
1732 case IrOpcode::kBitcastTaggedToWord:
1733 case IrOpcode::kBitcastWordToTagged:
1734 case IrOpcode::kBitcastWordToTaggedSigned:
1735 case IrOpcode::kChangeInt32ToInt64:
1736 case IrOpcode::kChangeUint32ToUint64:
1737 case IrOpcode::kChangeInt32ToFloat64:
1738 case IrOpcode::kChangeInt64ToFloat64:
1739 case IrOpcode::kChangeUint32ToFloat64:
1740 case IrOpcode::kChangeFloat32ToFloat64:
1741 case IrOpcode::kChangeFloat64ToInt32:
1742 case IrOpcode::kChangeFloat64ToInt64:
1743 case IrOpcode::kChangeFloat64ToUint32:
1744 case IrOpcode::kChangeFloat64ToUint64:
1745 case IrOpcode::kFloat64SilenceNaN:
1746 case IrOpcode::kTruncateFloat64ToInt64:
1747 case IrOpcode::kTruncateFloat64ToUint32:
1748 case IrOpcode::kTruncateFloat32ToInt32:
1749 case IrOpcode::kTruncateFloat32ToUint32:
1750 case IrOpcode::kTryTruncateFloat32ToInt64:
1751 case IrOpcode::kTryTruncateFloat64ToInt64:
1752 case IrOpcode::kTryTruncateFloat32ToUint64:
1753 case IrOpcode::kTryTruncateFloat64ToUint64:
1754 case IrOpcode::kFloat64ExtractLowWord32:
1755 case IrOpcode::kFloat64ExtractHighWord32:
1756 case IrOpcode::kFloat64InsertLowWord32:
1757 case IrOpcode::kFloat64InsertHighWord32:
1758 case IrOpcode::kInt32PairAdd:
1759 case IrOpcode::kInt32PairSub:
1760 case IrOpcode::kInt32PairMul:
1761 case IrOpcode::kWord32PairShl:
1762 case IrOpcode::kWord32PairShr:
1763 case IrOpcode::kWord32PairSar:
1764 case IrOpcode::kTaggedPoisonOnSpeculation:
1765 case IrOpcode::kWord32PoisonOnSpeculation:
1766 case IrOpcode::kWord64PoisonOnSpeculation:
1767 case IrOpcode::kLoadStackPointer:
1768 case IrOpcode::kLoadFramePointer:
1769 case IrOpcode::kLoadParentFramePointer:
1770 case IrOpcode::kUnalignedLoad:
1771 case IrOpcode::kUnalignedStore:
1772 case IrOpcode::kWord32AtomicLoad:
1773 case IrOpcode::kWord32AtomicStore:
1774 case IrOpcode::kWord32AtomicExchange:
1775 case IrOpcode::kWord32AtomicCompareExchange:
1776 case IrOpcode::kWord32AtomicAdd:
1777 case IrOpcode::kWord32AtomicSub:
1778 case IrOpcode::kWord32AtomicAnd:
1779 case IrOpcode::kWord32AtomicOr:
1780 case IrOpcode::kWord32AtomicXor:
1781 case IrOpcode::kWord64AtomicLoad:
1782 case IrOpcode::kWord64AtomicStore:
1783 case IrOpcode::kWord64AtomicAdd:
1784 case IrOpcode::kWord64AtomicSub:
1785 case IrOpcode::kWord64AtomicAnd:
1786 case IrOpcode::kWord64AtomicOr:
1787 case IrOpcode::kWord64AtomicXor:
1788 case IrOpcode::kWord64AtomicExchange:
1789 case IrOpcode::kWord64AtomicCompareExchange:
1790 case IrOpcode::kWord32AtomicPairLoad:
1791 case IrOpcode::kWord32AtomicPairStore:
1792 case IrOpcode::kWord32AtomicPairAdd:
1793 case IrOpcode::kWord32AtomicPairSub:
1794 case IrOpcode::kWord32AtomicPairAnd:
1795 case IrOpcode::kWord32AtomicPairOr:
1796 case IrOpcode::kWord32AtomicPairXor:
1797 case IrOpcode::kWord32AtomicPairExchange:
1798 case IrOpcode::kWord32AtomicPairCompareExchange:
1799 case IrOpcode::kSpeculationFence:
1800 case IrOpcode::kSignExtendWord8ToInt32:
1801 case IrOpcode::kSignExtendWord16ToInt32:
1802 case IrOpcode::kSignExtendWord8ToInt64:
1803 case IrOpcode::kSignExtendWord16ToInt64:
1804 case IrOpcode::kSignExtendWord32ToInt64:
1806 #define SIMD_MACHINE_OP_CASE(Name) case IrOpcode::k##Name: 1807 MACHINE_SIMD_OP_LIST(SIMD_MACHINE_OP_CASE)
1808 #undef SIMD_MACHINE_OP_CASE 1815 void Verifier::Run(Graph* graph, Typing typing, CheckInputs check_inputs,
1816 CodeType code_type) {
1817 CHECK_NOT_NULL(graph->start());
1818 CHECK_NOT_NULL(graph->end());
1819 Zone zone(graph->zone()->allocator(), ZONE_NAME);
1820 Visitor visitor(&zone, typing, check_inputs, code_type);
1821 AllNodes all(&zone, graph);
1822 for (Node* node : all.reachable) visitor.Check(node, all);
1825 for (Node* proj : all.reachable) {
1826 if (proj->opcode() != IrOpcode::kProjection)
continue;
1827 Node* node = proj->InputAt(0);
1828 for (Node* other : node->uses()) {
1829 if (all.IsLive(other) && other != proj &&
1830 other->opcode() == IrOpcode::kProjection &&
1831 other->InputAt(0) == node &&
1832 ProjectionIndexOf(other->op()) == ProjectionIndexOf(proj->op())) {
1833 FATAL(
"Node #%d:%s has duplicate projections #%d and #%d", node->id(),
1834 node->op()->mnemonic(), proj->id(), other->id());
1843 static bool HasDominatingDef(Schedule* schedule, Node* node,
1844 BasicBlock* container, BasicBlock* use_block,
1846 BasicBlock* block = use_block;
1848 while (use_pos >= 0) {
1849 if (block->NodeAt(use_pos) == node)
return true;
1852 block = block->dominator();
1853 if (block ==
nullptr)
break;
1854 use_pos =
static_cast<int>(block->NodeCount()) - 1;
1855 if (node == block->control_input())
return true;
1861 static bool Dominates(Schedule* schedule, Node* dominator, Node* dominatee) {
1862 BasicBlock* dom = schedule->block(dominator);
1863 BasicBlock* sub = schedule->block(dominatee);
1864 while (sub !=
nullptr) {
1868 sub = sub->dominator();
1874 static void CheckInputsDominate(Schedule* schedule, BasicBlock* block,
1875 Node* node,
int use_pos) {
1876 for (
int j = node->op()->ValueInputCount() - 1; j >= 0; j--) {
1877 BasicBlock* use_block = block;
1878 if (node->opcode() == IrOpcode::kPhi) {
1879 use_block = use_block->PredecessorAt(j);
1880 use_pos =
static_cast<int>(use_block->NodeCount()) - 1;
1882 Node* input = node->InputAt(j);
1883 if (!HasDominatingDef(schedule, node->InputAt(j), block, use_block,
1885 FATAL(
"Node #%d:%s in B%d is not dominated by input@%d #%d:%s",
1886 node->id(), node->op()->mnemonic(), block->rpo_number(), j,
1887 input->id(), input->op()->mnemonic());
1893 if (node->op()->ControlInputCount() == 1 &&
1894 node->opcode() != IrOpcode::kEnd) {
1895 Node* ctl = NodeProperties::GetControlInput(node);
1896 if (!Dominates(schedule, ctl, node)) {
1897 FATAL(
"Node #%d:%s in B%d is not dominated by control input #%d:%s",
1898 node->id(), node->op()->mnemonic(), block->rpo_number(), ctl->id(),
1899 ctl->op()->mnemonic());
1905 void ScheduleVerifier::Run(Schedule* schedule) {
1906 const size_t count = schedule->BasicBlockCount();
1907 Zone tmp_zone(schedule->zone()->allocator(), ZONE_NAME);
1908 Zone* zone = &tmp_zone;
1909 BasicBlock* start = schedule->start();
1910 BasicBlockVector* rpo_order = schedule->rpo_order();
1913 CHECK_GE(count, rpo_order->size());
1914 for (BasicBlockVector::iterator b = rpo_order->begin(); b != rpo_order->end();
1916 CHECK_EQ((*b), schedule->GetBlockById((*b)->id()));
1918 for (BasicBlock
const* predecessor : (*b)->predecessors()) {
1919 CHECK_GE(predecessor->rpo_number(), 0);
1920 CHECK_EQ(predecessor, schedule->GetBlockById(predecessor->id()));
1922 for (BasicBlock
const* successor : (*b)->successors()) {
1923 CHECK_GE(successor->rpo_number(), 0);
1924 CHECK_EQ(successor, schedule->GetBlockById(successor->id()));
1929 CHECK_EQ(start, rpo_order->at(0));
1930 for (
size_t b = 0; b < rpo_order->size(); b++) {
1931 BasicBlock* block = rpo_order->at(b);
1932 CHECK_EQ(static_cast<int>(b), block->rpo_number());
1933 BasicBlock* dom = block->dominator();
1939 CHECK_NOT_NULL(dom);
1940 CHECK_LT(dom->rpo_number(), block->rpo_number());
1945 BoolVector marked(static_cast<int>(count),
false, zone);
1947 ZoneQueue<BasicBlock*> queue(zone);
1949 marked[start->id().ToSize()] =
true;
1950 while (!queue.empty()) {
1951 BasicBlock* block = queue.front();
1953 for (
size_t s = 0; s < block->SuccessorCount(); s++) {
1954 BasicBlock* succ = block->SuccessorAt(s);
1955 if (!marked[succ->id().ToSize()]) {
1956 marked[succ->id().ToSize()] =
true;
1963 for (
size_t i = 0;
i < count;
i++) {
1964 BasicBlock* block = schedule->GetBlockById(BasicBlock::Id::FromSize(
i));
1966 CHECK_GE(block->rpo_number(), 0);
1967 CHECK_EQ(block, rpo_order->at(block->rpo_number()));
1971 for (
size_t b = 0; b < rpo_order->size(); b++) {
1972 CHECK(marked[rpo_order->at(b)->id().ToSize()]);
1977 ZoneVector<BitVector*> dominators(zone);
1978 dominators.resize(count,
nullptr);
1982 ZoneQueue<BasicBlock*> queue(zone);
1984 dominators[start->id().ToSize()] =
1985 new (zone) BitVector(static_cast<int>(count), zone);
1986 while (!queue.empty()) {
1987 BasicBlock* block = queue.front();
1989 BitVector* block_doms = dominators[block->id().ToSize()];
1990 BasicBlock* idom = block->dominator();
1991 if (idom !=
nullptr && !block_doms->Contains(idom->id().ToInt())) {
1992 FATAL(
"Block B%d is not dominated by B%d", block->rpo_number(),
1993 idom->rpo_number());
1995 for (
size_t s = 0; s < block->SuccessorCount(); s++) {
1996 BasicBlock* succ = block->SuccessorAt(s);
1997 BitVector* succ_doms = dominators[succ->id().ToSize()];
1999 if (succ_doms ==
nullptr) {
2001 succ_doms =
new (zone) BitVector(static_cast<int>(count), zone);
2002 succ_doms->CopyFrom(*block_doms);
2003 succ_doms->Add(block->id().ToInt());
2004 dominators[succ->id().ToSize()] = succ_doms;
2008 bool had = succ_doms->Contains(block->id().ToInt());
2009 if (had) succ_doms->Remove(block->id().ToInt());
2010 if (succ_doms->IntersectIsChanged(*block_doms)) queue.push(succ);
2011 if (had) succ_doms->Add(block->id().ToInt());
2017 for (BasicBlockVector::iterator b = rpo_order->begin();
2018 b != rpo_order->end(); ++b) {
2019 BasicBlock* block = *b;
2020 BasicBlock* idom = block->dominator();
2021 if (idom ==
nullptr)
continue;
2022 BitVector* block_doms = dominators[block->id().ToSize()];
2024 for (BitVector::Iterator it(block_doms); !it.Done(); it.Advance()) {
2026 schedule->GetBlockById(BasicBlock::Id::FromInt(it.Current()));
2028 !dominators[idom->id().ToSize()]->Contains(dom->id().ToInt())) {
2029 FATAL(
"Block B%d is not immediately dominated by B%d",
2030 block->rpo_number(), idom->rpo_number());
2037 for (BasicBlockVector::iterator b = rpo_order->begin(); b != rpo_order->end();
2039 for (BasicBlock::const_iterator
i = (*b)->begin();
i != (*b)->end(); ++
i) {
2041 if (phi->opcode() != IrOpcode::kPhi)
continue;
2044 if (phi->InputCount() > phi->op()->ValueInputCount()) {
2045 Node* control = NodeProperties::GetControlInput(phi);
2046 CHECK(control->opcode() == IrOpcode::kMerge ||
2047 control->opcode() == IrOpcode::kLoop);
2048 CHECK_EQ((*b), schedule->block(control));
2054 for (BasicBlockVector::iterator b = rpo_order->begin(); b != rpo_order->end();
2056 BasicBlock* block = *b;
2059 Node* control = block->control_input();
2060 if (control !=
nullptr) {
2061 CHECK_EQ(block, schedule->block(control));
2062 CheckInputsDominate(schedule, block, control,
2063 static_cast<int>(block->NodeCount()) - 1);
2066 for (
size_t i = 0;
i < block->NodeCount();
i++) {
2067 Node* node = block->NodeAt(
i);
2068 CheckInputsDominate(schedule, block, node, static_cast<int>(
i) - 1);
2077 void Verifier::VerifyNode(Node* node) {
2078 DCHECK_EQ(OperatorProperties::GetTotalInputCount(node->op()),
2079 node->InputCount());
2082 bool check_no_control = node->op()->ControlOutputCount() == 0;
2083 bool check_no_effect = node->op()->EffectOutputCount() == 0;
2084 bool check_no_frame_state = node->opcode() != IrOpcode::kFrameState;
2085 int effect_edges = 0;
2086 if (check_no_effect || check_no_control) {
2087 for (Edge edge : node->use_edges()) {
2088 Node*
const user = edge.from();
2089 DCHECK(!user->IsDead());
2090 if (NodeProperties::IsControlEdge(edge)) {
2091 DCHECK(!check_no_control);
2092 }
else if (NodeProperties::IsEffectEdge(edge)) {
2093 DCHECK(!check_no_effect);
2095 }
else if (NodeProperties::IsFrameStateEdge(edge)) {
2096 DCHECK(!check_no_frame_state);
2102 if (OperatorProperties::GetFrameStateInputCount(node->op()) > 0) {
2103 Node* input = NodeProperties::GetFrameStateInput(node);
2104 DCHECK(input->opcode() == IrOpcode::kFrameState ||
2105 input->opcode() == IrOpcode::kStart ||
2106 input->opcode() == IrOpcode::kDead ||
2107 input->opcode() == IrOpcode::kDeadValue);
2110 for (
int i = 0;
i < node->op()->EffectInputCount();
i++) {
2111 Node* input = NodeProperties::GetEffectInput(node,
i);
2112 DCHECK(input->op()->EffectOutputCount() > 0 ||
2113 input->opcode() == IrOpcode::kDead);
2116 for (
int i = 0;
i < node->op()->ControlInputCount();
i++) {
2117 Node* input = NodeProperties::GetControlInput(node,
i);
2118 DCHECK(input->op()->ControlOutputCount() > 0 ||
2119 input->opcode() == IrOpcode::kDead);
2124 void Verifier::VerifyEdgeInputReplacement(
const Edge& edge,
2125 const Node* replacement) {
2127 DCHECK(!NodeProperties::IsControlEdge(edge) ||
2128 replacement->op()->ControlOutputCount() > 0);
2129 DCHECK(!NodeProperties::IsEffectEdge(edge) ||
2130 replacement->op()->EffectOutputCount() > 0);
2131 DCHECK(!NodeProperties::IsFrameStateEdge(edge) ||
2132 replacement->opcode() == IrOpcode::kFrameState ||
2133 replacement->opcode() == IrOpcode::kDead ||
2134 replacement->opcode() == IrOpcode::kDeadValue);