1f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Copyright 2016 the V8 project authors. All rights reserved.
2f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch// found in the LICENSE file.
4f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
5f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/machine-graph-verifier.h"
6f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
7f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/common-operator.h"
8f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/graph.h"
9f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/linkage.h"
10f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/machine-operator.h"
11f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/node-properties.h"
12f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/node.h"
13f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/compiler/schedule.h"
14f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#include "src/zone/zone.h"
15f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
16f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace v8 {
17f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace internal {
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace compiler {
19f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
20f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochnamespace {
21f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass MachineRepresentationInferrer {
23f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
24f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  MachineRepresentationInferrer(Schedule const* schedule, Graph const* graph,
25f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                Linkage* linkage, Zone* zone)
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      : schedule_(schedule),
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        linkage_(linkage),
28c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        representation_vector_(graph->NodeCount(), MachineRepresentation::kNone,
29c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                               zone) {
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Run();
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
32f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
3362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  CallDescriptor* call_descriptor() const {
3462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return linkage_->GetIncomingDescriptor();
3562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
3662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
37f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  MachineRepresentation GetRepresentation(Node const* node) const {
38f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return representation_vector_.at(node->id());
39f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
40f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
41f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
42f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  MachineRepresentation GetProjectionType(Node const* projection) {
43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    size_t index = ProjectionIndexOf(projection->op());
44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node* input = projection->InputAt(0);
45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    switch (input->opcode()) {
46f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kInt32AddWithOverflow:
47f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kInt32SubWithOverflow:
48f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kInt32MulWithOverflow:
49f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        CHECK_LE(index, static_cast<size_t>(1));
50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return index == 0 ? MachineRepresentation::kWord32
51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          : MachineRepresentation::kBit;
52f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kInt64AddWithOverflow:
53f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kInt64SubWithOverflow:
54f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        CHECK_LE(index, static_cast<size_t>(1));
55f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return index == 0 ? MachineRepresentation::kWord64
56f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          : MachineRepresentation::kBit;
57f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kTryTruncateFloat32ToInt64:
58f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kTryTruncateFloat64ToInt64:
59f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kTryTruncateFloat32ToUint64:
60f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kTryTruncateFloat64ToUint64:
61f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        CHECK_LE(index, static_cast<size_t>(1));
62f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return index == 0 ? MachineRepresentation::kWord64
63f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                          : MachineRepresentation::kBit;
64f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case IrOpcode::kCall: {
65f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        CallDescriptor const* desc = CallDescriptorOf(input->op());
66f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return desc->GetReturnType(index).representation();
67f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
68f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
69f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineRepresentation::kNone;
70f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
71f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
72f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  MachineRepresentation PromoteRepresentation(MachineRepresentation rep) {
7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    switch (rep) {
7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord8:
7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord16:
7762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord32:
7862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        return MachineRepresentation::kWord32;
7962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      default:
8062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        break;
8162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
8262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return rep;
8362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
8462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
85f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void Run() {
86f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    auto blocks = schedule_->all_blocks();
87f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    for (BasicBlock* block : *blocks) {
88f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      for (size_t i = 0; i <= block->NodeCount(); ++i) {
89f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        Node const* node =
90f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            i < block->NodeCount() ? block->NodeAt(i) : block->control_input();
91f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        if (node == nullptr) {
92f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          DCHECK_EQ(block->NodeCount(), i);
93f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          break;
94f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        }
95f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        switch (node->opcode()) {
96f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kParameter:
97f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
98f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                linkage_->GetParameterType(ParameterIndexOf(node->op()))
99f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                    .representation();
100f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
10162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kReturn: {
10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                linkage_->GetReturnType().representation());
10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          }
106f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kProjection: {
107f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] = GetProjectionType(node);
108f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          } break;
109f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTypedStateValues:
110f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] = MachineRepresentation::kNone;
111f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
112f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kAtomicLoad:
113f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kLoad:
114f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kProtectedLoad:
11562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
11662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                LoadRepresentationOf(node->op()).representation());
117f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
118f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kCheckedLoad:
11962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
12062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                CheckedLoadRepresentationOf(node->op()).representation());
121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kLoadStackPointer:
123f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kLoadFramePointer:
124f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kLoadParentFramePointer:
125f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
126f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                MachineType::PointerRepresentation();
127f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kUnalignedLoad:
12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                UnalignedLoadRepresentationOf(node->op()).representation());
13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
132f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kPhi:
133f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
134f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                PhiRepresentationOf(node->op());
135f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
136f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kCall: {
137f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CallDescriptor const* desc = CallDescriptorOf(node->op());
138f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            if (desc->ReturnCount() > 0) {
139f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
140f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  desc->GetReturnType(0).representation();
141f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            } else {
142f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
143f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  MachineRepresentation::kTagged;
144f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
145f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
146f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          }
14762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kAtomicStore:
14862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] =
14962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                PromoteRepresentation(AtomicStoreRepresentationOf(node->op()));
15062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
15162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kStore:
15262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kProtectedStore:
15362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
15462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                StoreRepresentationOf(node->op()).representation());
15562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
15662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kCheckedStore:
157f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
15862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                PromoteRepresentation(CheckedStoreRepresentationOf(node->op()));
15962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
16062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kUnalignedStore:
16162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            representation_vector_[node->id()] = PromoteRepresentation(
16262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                UnalignedStoreRepresentationOf(node->op()));
163f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
164f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kHeapConstant:
165f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kNumberConstant:
166f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeBitToTagged:
167f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kIfException:
168f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kOsrValue:
169f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToTagged:
170f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToTagged:
171f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastWordToTagged:
172f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] = MachineRepresentation::kTagged;
173f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
174f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kExternalConstant:
175f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
176f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                MachineType::PointerRepresentation();
177f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
178f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastTaggedToWord:
179f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
180f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                MachineType::PointerRepresentation();
181f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
182f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastWordToTaggedSigned:
183f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] =
184f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                MachineRepresentation::kTaggedSigned;
185f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
186f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kWord32Equal:
187f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32LessThan:
188f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32LessThanOrEqual:
189f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint32LessThan:
190f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint32LessThanOrEqual:
191f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kWord64Equal:
192f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt64LessThan:
193f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt64LessThanOrEqual:
194f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint64LessThan:
195f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint64LessThanOrEqual:
196f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32Equal:
197f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32LessThan:
198f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32LessThanOrEqual:
199f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64Equal:
200f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64LessThan:
201f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64LessThanOrEqual:
202f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeTaggedToBit:
203f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            representation_vector_[node->id()] = MachineRepresentation::kBit;
204f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
205f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define LABEL(opcode) case IrOpcode::k##opcode:
206f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateInt64ToInt32:
207f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat32ToInt32:
208f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat32ToUint32:
209f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastFloat32ToInt32:
210f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32x4ExtractLane:
21162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kInt16x8ExtractLane:
21262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kInt8x16ExtractLane:
213f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32Constant:
214f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRelocatableInt32Constant:
215f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToWord32:
216f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToUint32:
217f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat64ToInt32:
218f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat64ToUint32:
219f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundFloat64ToInt32:
220f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64ExtractLowWord32:
221f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64ExtractHighWord32:
222f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_UNOP_32_LIST(LABEL)
223f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_BINOP_32_LIST(LABEL) {
224f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
225f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  MachineRepresentation::kWord32;
226f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
227f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
228f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToInt64:
229f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToUint64:
230f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt64Constant:
231f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRelocatableInt64Constant:
232f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastFloat64ToInt64:
233f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_BINOP_64_LIST(LABEL) {
234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  MachineRepresentation::kWord64;
236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
237f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt32ToFloat32:
239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint32ToFloat32:
240f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt64ToFloat32:
241f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint64ToFloat32:
242f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32Constant:
243f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToFloat32:
244f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT32_BINOP_LIST(LABEL)
245f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT32_UNOP_LIST(LABEL) {
246f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
247f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  MachineRepresentation::kFloat32;
248f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
249f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
250f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt64ToFloat64:
251f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint64ToFloat64:
252f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat32ToFloat64:
253f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToFloat64:
254f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToFloat64:
255f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64Constant:
256f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64SilenceNaN:
257f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT64_BINOP_LIST(LABEL)
258f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT64_UNOP_LIST(LABEL) {
259f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              representation_vector_[node->id()] =
260f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  MachineRepresentation::kFloat64;
261f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
262f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
263f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef LABEL
264f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          default:
265f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
266f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        }
267f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
268f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
269f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
270f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
271f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Schedule const* const schedule_;
272f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Linkage const* const linkage_;
273f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  ZoneVector<MachineRepresentation> representation_vector_;
274f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
275f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
276f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochclass MachineRepresentationChecker {
277f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch public:
278c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  MachineRepresentationChecker(
279c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      Schedule const* const schedule,
28062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      MachineRepresentationInferrer const* const inferrer, bool is_stub,
28162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      const char* name)
28262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      : schedule_(schedule),
28362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        inferrer_(inferrer),
28462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        is_stub_(is_stub),
28562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        name_(name) {}
286f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
287f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void Run() {
288f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    BasicBlockVector const* blocks = schedule_->all_blocks();
289f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    for (BasicBlock* block : *blocks) {
290f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      for (size_t i = 0; i <= block->NodeCount(); ++i) {
291f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        Node const* node =
292f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            i < block->NodeCount() ? block->NodeAt(i) : block->control_input();
293f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        if (node == nullptr) {
294f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          DCHECK_EQ(block->NodeCount(), i);
295f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          break;
296f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        }
297f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        switch (node->opcode()) {
298f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kCall:
299f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTailCall:
300f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckCallInputs(node);
301f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
302f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeBitToTagged:
303f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CHECK_EQ(MachineRepresentation::kBit,
304c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                     inferrer_->GetRepresentation(node->InputAt(0)));
305f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
306f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeTaggedToBit:
307f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CHECK_EQ(MachineRepresentation::kTagged,
308c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                     inferrer_->GetRepresentation(node->InputAt(0)));
309f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
310f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt64ToFloat64:
311f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint64ToFloat64:
312f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt64ToFloat32:
313f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint64ToFloat32:
314f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateInt64ToInt32:
315f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputForInt64Op(node, 0);
316f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
317f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastWordToTagged:
318f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastWordToTaggedSigned:
319f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputRepresentationIs(
320f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                node, 0, MachineType::PointerRepresentation());
321f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
322f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastTaggedToWord:
323f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputIsTagged(node, 0);
324f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
325f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToWord32:
326f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToUint32:
327f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat64ToFloat32:
328f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat64ToInt32:
329f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat64ToUint32:
330f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundFloat64ToInt32:
331f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64ExtractLowWord32:
332f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64ExtractHighWord32:
333f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastFloat64ToInt64:
334f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputForFloat64Op(node, 0);
335f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
336f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kWord64Equal:
33762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            if (Is64()) {
33862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputIsTaggedOrPointer(node, 0);
33962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputIsTaggedOrPointer(node, 1);
34062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              if (!is_stub_) {
34162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                CheckValueInputRepresentationIs(
34262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                    node, 1, inferrer_->GetRepresentation(node->InputAt(0)));
34362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              }
34462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            } else {
34562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputForInt64Op(node, 0);
34662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputForInt64Op(node, 1);
34762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            }
348f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
349f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt64LessThan:
350f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt64LessThanOrEqual:
351f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint64LessThan:
352f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint64LessThanOrEqual:
353f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputForInt64Op(node, 0);
354f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputForInt64Op(node, 1);
355f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
356f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32x4ExtractLane:
35762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kInt16x8ExtractLane:
35862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kInt8x16ExtractLane:
359f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputRepresentationIs(node, 0,
360f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                            MachineRepresentation::kSimd128);
361f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
362f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#define LABEL(opcode) case IrOpcode::k##opcode:
363f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToTagged:
364f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToTagged:
365f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToFloat64:
366f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToFloat64:
367f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundInt32ToFloat32:
368f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kRoundUint32ToFloat32:
369f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeInt32ToInt64:
370f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeUint32ToUint64:
371f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_UNOP_32_LIST(LABEL) { CheckValueInputForInt32Op(node, 0); }
372f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
373f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kWord32Equal:
37462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            if (Is32()) {
37562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputIsTaggedOrPointer(node, 0);
37662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputIsTaggedOrPointer(node, 1);
37762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              if (!is_stub_) {
37862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                CheckValueInputRepresentationIs(
37962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                    node, 1, inferrer_->GetRepresentation(node->InputAt(0)));
38062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              }
38162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            } else {
38262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputForInt32Op(node, 0);
38362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              CheckValueInputForInt32Op(node, 1);
38462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            }
38562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
38662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32LessThan:
388f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kInt32LessThanOrEqual:
389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint32LessThan:
390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kUint32LessThanOrEqual:
391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_BINOP_32_LIST(LABEL) {
392f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForInt32Op(node, 0);
393f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForInt32Op(node, 1);
394f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
395f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
396f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_BINOP_64_LIST(LABEL) {
397f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForInt64Op(node, 0);
398f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForInt64Op(node, 1);
399f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
400f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
401f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32Equal:
402f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32LessThan:
403f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat32LessThanOrEqual:
404f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT32_BINOP_LIST(LABEL) {
405f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat32Op(node, 0);
406f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat32Op(node, 1);
407f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
408f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
409f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kChangeFloat32ToFloat64:
410f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat32ToInt32:
411f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTruncateFloat32ToUint32:
412f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBitcastFloat32ToInt32:
413f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT32_UNOP_LIST(LABEL) {
414f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat32Op(node, 0);
415f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
416f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
417f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64Equal:
418f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64LessThan:
419f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64LessThanOrEqual:
420f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT64_BINOP_LIST(LABEL) {
421f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat64Op(node, 0);
422f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat64Op(node, 1);
423f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
424f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
425f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFloat64SilenceNaN:
426f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            MACHINE_FLOAT64_UNOP_LIST(LABEL) {
427f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              CheckValueInputForFloat64Op(node, 0);
428f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
429f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
430f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch#undef LABEL
431f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kParameter:
432f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kProjection:
433f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
434f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kLoad:
435f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kAtomicLoad:
436f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputIsTaggedOrPointer(node, 0);
437f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputRepresentationIs(
438f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                node, 1, MachineType::PointerRepresentation());
439f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
440f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kStore:
441f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputIsTaggedOrPointer(node, 0);
442f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputRepresentationIs(
443f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                node, 1, MachineType::PointerRepresentation());
44462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            switch (inferrer_->GetRepresentation(node)) {
445f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTagged:
446f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedPointer:
447f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedSigned:
448f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                CheckValueInputIsTagged(node, 2);
449f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                break;
450f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              default:
451f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                CheckValueInputRepresentationIs(
45262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                    node, 2, inferrer_->GetRepresentation(node));
453f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
454f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
455f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kAtomicStore:
456f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputIsTaggedOrPointer(node, 0);
457f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputRepresentationIs(
458f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                node, 1, MachineType::PointerRepresentation());
45962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            switch (inferrer_->GetRepresentation(node)) {
460f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTagged:
461f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedPointer:
462f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedSigned:
463f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                CheckValueInputIsTagged(node, 2);
464f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                break;
465f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              default:
466f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                CheckValueInputRepresentationIs(
46762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                    node, 2, inferrer_->GetRepresentation(node));
468f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
469f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
470f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kPhi:
471c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch            switch (inferrer_->GetRepresentation(node)) {
472f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTagged:
473f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedPointer:
474f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              case MachineRepresentation::kTaggedSigned:
475f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                for (int i = 0; i < node->op()->ValueInputCount(); ++i) {
476f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  CheckValueInputIsTagged(node, i);
477f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                }
478f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                break;
47962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              case MachineRepresentation::kWord32:
48062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                for (int i = 0; i < node->op()->ValueInputCount(); ++i) {
48162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  CheckValueInputForInt32Op(node, i);
48262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                }
48362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                break;
484f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              default:
485f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                for (int i = 0; i < node->op()->ValueInputCount(); ++i) {
486f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  CheckValueInputRepresentationIs(
487c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch                      node, i, inferrer_->GetRepresentation(node));
488f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                }
489f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                break;
490f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
491f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
492f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kBranch:
493f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kSwitch:
494f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            CheckValueInputForInt32Op(node, 0);
495f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
49662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kReturn: {
49762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            // TODO(ishell): enable once the pop count parameter type becomes
49862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            // MachineType::PointerRepresentation(). Currently it's int32 or
49962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            // word-size.
50062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            // CheckValueInputRepresentationIs(
50162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            //     node, 0, MachineType::PointerRepresentation());  // Pop count
50262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            size_t return_count = inferrer_->call_descriptor()->ReturnCount();
50362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            for (size_t i = 0; i < return_count; i++) {
50462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              MachineType type = inferrer_->call_descriptor()->GetReturnType(i);
50562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              int input_index = static_cast<int>(i + 1);
50662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              switch (type.representation()) {
50762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                case MachineRepresentation::kTagged:
50862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                case MachineRepresentation::kTaggedPointer:
50962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                case MachineRepresentation::kTaggedSigned:
51062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  CheckValueInputIsTagged(node, input_index);
51162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  break;
51262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                case MachineRepresentation::kWord32:
51362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  CheckValueInputForInt32Op(node, input_index);
51462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  break;
51562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                default:
51662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                  CheckValueInputRepresentationIs(
51762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                      node, 2, inferrer_->GetRepresentation(node));
51862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              }
51962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              break;
52062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            }
52162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            break;
52262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          }
52362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          case IrOpcode::kThrow:
52462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            CheckValueInputIsTagged(node, 0);
525f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
526f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kTypedStateValues:
527f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          case IrOpcode::kFrameState:
528f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
529f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          default:
530f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            if (node->op()->ValueInputCount() != 0) {
531f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              std::stringstream str;
532f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              str << "Node #" << node->id() << ":" << *node->op()
533f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                  << " in the machine graph is not being checked.";
53462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch              PrintDebugHelp(str, node);
535f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              FATAL(str.str().c_str());
536f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            }
537f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            break;
538f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        }
539f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
540f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
541f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
542f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
543f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch private:
54462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static bool Is32() {
54562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType::PointerRepresentation() ==
54662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch           MachineRepresentation::kWord32;
54762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
54862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  static bool Is64() {
54962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return MachineType::PointerRepresentation() ==
55062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch           MachineRepresentation::kWord64;
55162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
55262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
553f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputRepresentationIs(Node const* node, int index,
554f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                       MachineRepresentation representation) {
555f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
556c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    MachineRepresentation input_representation =
557c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        inferrer_->GetRepresentation(input);
558c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (input_representation != representation) {
559f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      std::stringstream str;
56062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      str << "TypeError: node #" << node->id() << ":" << *node->op()
56162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          << " uses node #" << input->id() << ":" << *input->op() << ":"
56262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          << input_representation << " which doesn't have a " << representation
56362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          << " representation.";
56462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      PrintDebugHelp(str, node);
565f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      FATAL(str.str().c_str());
566f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
567f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
568f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
569f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputIsTagged(Node const* node, int index) {
570f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
571c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    switch (inferrer_->GetRepresentation(input)) {
572f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTagged:
573f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
574f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
575f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return;
576f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
577f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
578f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
579f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
580f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    str << "TypeError: node #" << node->id() << ":" << *node->op()
581f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " uses node #" << input->id() << ":" << *input->op()
582f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " which doesn't have a tagged representation.";
58362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PrintDebugHelp(str, node);
584f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FATAL(str.str().c_str());
585f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
586f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
587f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputIsTaggedOrPointer(Node const* node, int index) {
588f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
589c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    switch (inferrer_->GetRepresentation(input)) {
590f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTagged:
591f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
592f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
593f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return;
59462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kBit:
59562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord8:
59662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord16:
59762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord32:
59862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        if (Is32()) {
59962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          return;
60062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        }
60162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        break;
60262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kWord64:
60362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        if (Is64()) {
60462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          return;
60562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        }
60662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        break;
607f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
608f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
609f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
610c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (inferrer_->GetRepresentation(input) !=
611f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        MachineType::PointerRepresentation()) {
612f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      std::ostringstream str;
613f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      str << "TypeError: node #" << node->id() << ":" << *node->op()
614f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          << " uses node #" << input->id() << ":" << *input->op()
615f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          << " which doesn't have a tagged or pointer representation.";
61662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      PrintDebugHelp(str, node);
617f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      FATAL(str.str().c_str());
618f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
619f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
620f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
621f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputForInt32Op(Node const* node, int index) {
622f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
623c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    switch (inferrer_->GetRepresentation(input)) {
624f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kBit:
625f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord8:
626f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord16:
627f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord32:
628f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return;
629f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kNone: {
630f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        std::ostringstream str;
631f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        str << "TypeError: node #" << input->id() << ":" << *input->op()
632f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            << " is untyped.";
63362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        PrintDebugHelp(str, node);
634f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        FATAL(str.str().c_str());
635f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
636f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
637f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
638f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
639f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
640f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
641f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    str << "TypeError: node #" << node->id() << ":" << *node->op()
642f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " uses node #" << input->id() << ":" << *input->op()
643f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " which doesn't have an int32-compatible representation.";
64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PrintDebugHelp(str, node);
645f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FATAL(str.str().c_str());
646f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
647f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
648f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputForInt64Op(Node const* node, int index) {
649f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
650c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    MachineRepresentation input_representation =
651c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        inferrer_->GetRepresentation(input);
652c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    switch (input_representation) {
653f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord64:
654f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return;
655f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kNone: {
656f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        std::ostringstream str;
657f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        str << "TypeError: node #" << input->id() << ":" << *input->op()
658f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            << " is untyped.";
65962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        PrintDebugHelp(str, node);
660f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        FATAL(str.str().c_str());
661f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
662f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
663f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
664f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
665f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
666f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
667f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
66862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    str << "TypeError: node #" << node->id() << ":" << *node->op()
66962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        << " uses node #" << input->id() << ":" << *input->op() << ":"
67062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        << input_representation
67162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch        << " which doesn't have a kWord64 representation.";
67262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PrintDebugHelp(str, node);
673f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FATAL(str.str().c_str());
674f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
675f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
676f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputForFloat32Op(Node const* node, int index) {
677f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
678c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (MachineRepresentation::kFloat32 ==
679c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        inferrer_->GetRepresentation(input)) {
680f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return;
681f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
682f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
683f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    str << "TypeError: node #" << node->id() << ":" << *node->op()
684f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " uses node #" << input->id() << ":" << *input->op()
685f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " which doesn't have a kFloat32 representation.";
68662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PrintDebugHelp(str, node);
687f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FATAL(str.str().c_str());
688f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
689f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
690f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckValueInputForFloat64Op(Node const* node, int index) {
691f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    Node const* input = node->InputAt(index);
692c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch    if (MachineRepresentation::kFloat64 ==
693c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch        inferrer_->GetRepresentation(input)) {
694f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      return;
695f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
696f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
697f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    str << "TypeError: node #" << node->id() << ":" << *node->op()
698f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " uses node #" << input->id() << ":" << *input->op()
699f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        << " which doesn't have a kFloat64 representation.";
70062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PrintDebugHelp(str, node);
701f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    FATAL(str.str().c_str());
702f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
703f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
704f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  void CheckCallInputs(Node const* node) {
705f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    CallDescriptor const* desc = CallDescriptorOf(node->op());
706f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    std::ostringstream str;
707f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    bool should_log_error = false;
708f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    for (size_t i = 0; i < desc->InputCount(); ++i) {
709f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      Node const* input = node->InputAt(static_cast<int>(i));
710c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      MachineRepresentation const input_type =
711c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch          inferrer_->GetRepresentation(input);
712f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      MachineRepresentation const expected_input_type =
713f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          desc->GetInputType(i).representation();
714f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      if (!IsCompatible(expected_input_type, input_type)) {
715f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        if (!should_log_error) {
716f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          should_log_error = true;
717f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          str << "TypeError: node #" << node->id() << ":" << *node->op()
718f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch              << " has wrong type for:" << std::endl;
719f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        } else {
720f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch          str << std::endl;
721f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        }
722f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        str << " * input " << i << " (" << input->id() << ":" << *input->op()
72362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch            << ") doesn't have a " << expected_input_type << " representation.";
724f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      }
725f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
726f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    if (should_log_error) {
72762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      PrintDebugHelp(str, node);
728f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      FATAL(str.str().c_str());
729f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
730f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
731f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
732f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool Intersect(MachineRepresentation lhs, MachineRepresentation rhs) {
733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return (GetRepresentationProperties(lhs) &
734f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch            GetRepresentationProperties(rhs)) != 0;
735f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
736f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
737f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  enum RepresentationProperties { kIsPointer = 1, kIsTagged = 2 };
738f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
739f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  int GetRepresentationProperties(MachineRepresentation representation) {
740f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    switch (representation) {
741f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTagged:
742f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
743f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return kIsPointer | kIsTagged;
744f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
745f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return kIsTagged;
746f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord32:
747f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineRepresentation::kWord32 ==
748f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineType::PointerRepresentation()
749f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   ? kIsPointer
750f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   : 0;
751f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord64:
752f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return MachineRepresentation::kWord64 ==
753f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                       MachineType::PointerRepresentation()
754f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   ? kIsPointer
755f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   : 0;
756f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      default:
757f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return 0;
758f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
759f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
760f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
761f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  bool IsCompatible(MachineRepresentation expected,
762f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                    MachineRepresentation actual) {
763f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    switch (expected) {
764f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTagged:
765f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return (actual == MachineRepresentation::kTagged ||
766f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                actual == MachineRepresentation::kTaggedSigned ||
767f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                actual == MachineRepresentation::kTaggedPointer);
768f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedSigned:
769f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kTaggedPointer:
770f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kFloat32:
771f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kFloat64:
772f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kSimd128:
77362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x4:
77462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x8:
77562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      case MachineRepresentation::kSimd1x16:
776f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kBit:
777f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord8:
778f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord16:
779f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord64:
780f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return expected == actual;
781f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        break;
782f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kWord32:
783f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        return (actual == MachineRepresentation::kBit ||
784f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                actual == MachineRepresentation::kWord8 ||
785f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                actual == MachineRepresentation::kWord16 ||
786f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                actual == MachineRepresentation::kWord32);
787f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      case MachineRepresentation::kNone:
788f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch        UNREACHABLE();
789f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    }
790f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch    return false;
791f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  }
792f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
79362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void PrintDebugHelp(std::ostream& out, Node const* node) {
79462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    if (DEBUG_BOOL) {
79562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      out << "\n#\n# Specify option --csa-trap-on-node=" << name_ << ","
79662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch          << node->id() << " for debugging.";
79762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
79862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
79962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
800f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  Schedule const* const schedule_;
801c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch  MachineRepresentationInferrer const* const inferrer_;
80262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  bool is_stub_;
80362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  const char* name_;
804f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch};
805f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
806f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace
807f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
808f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdochvoid MachineGraphVerifier::Run(Graph* graph, Schedule const* const schedule,
80962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               Linkage* linkage, bool is_stub, const char* name,
81062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                               Zone* temp_zone) {
811f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  MachineRepresentationInferrer representation_inferrer(schedule, graph,
812f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                                                        linkage, temp_zone);
81362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  MachineRepresentationChecker checker(schedule, &representation_inferrer,
81462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch                                       is_stub, name);
815f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch  checker.Run();
816f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}
817f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch
818f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace compiler
819f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace internal
820f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch}  // namespace v8
821