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