// Copyright 2024 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include #include "src/compiler/backend/instruction.h" #include "src/compiler/graph-visualizer.h" #include "src/compiler/turboshaft/assembler.h" #include "src/compiler/turboshaft/phase.h" #include "src/compiler/turboshaft/variable-reducer.h" #include "test/unittests/test-utils.h" namespace v8::internal::compiler::turboshaft { class TestInstance { public: using Assembler = TSAssembler; struct CapturedOperation { TestInstance* instance; OpIndex input; std::set generated_output; bool IsEmpty() const { return generated_output.empty(); } template bool Contains() const { for (OpIndex o : generated_output) { if (instance->graph().Get(o).Is()) return true; } return false; } template const underlying_operation_t* GetFirst() const { for (OpIndex o : generated_output) { if (auto result = instance->graph().Get(o).TryCast()) { return result; } } return nullptr; } template const underlying_operation_t* GetAs() const { DCHECK_EQ(generated_output.size(), 1); return GetFirst(); } const Operation* Get() const { DCHECK_EQ(generated_output.size(), 1); return &instance->graph().Get(*generated_output.begin()); } }; template static TestInstance CreateFromGraph(PipelineData* data, int parameter_count, const Builder& builder, Isolate* isolate, Zone* zone) { auto graph = std::make_unique(zone); TestInstance instance(data, std::move(graph), isolate, zone); // Generate a function prolog Block* start_block = instance.Asm().NewBlock(); instance.Asm().Bind(start_block); instance.Asm().Parameter(3, RegisterRepresentation::Tagged(), "%context"); instance.Asm().Parameter(0, RegisterRepresentation::Tagged(), "%this"); for (int i = 0; i < parameter_count; ++i) { instance.parameters_.push_back( instance.Asm().Parameter(1 + i, RegisterRepresentation::Tagged())); } builder(instance); return instance; } Assembler& Asm() { return assembler_; } Graph& graph() { return *graph_; } Factory& factory() { return *isolate_->factory(); } Zone* zone() { return zone_; } Assembler& operator()() { return Asm(); } template