// Copyright 2023 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. #if !V8_ENABLE_WEBASSEMBLY #error This header should only be included if WebAssembly is enabled. #endif // !V8_ENABLE_WEBASSEMBLY #ifndef V8_COMPILER_TURBOSHAFT_WASM_GC_TYPED_OPTIMIZATION_REDUCER_H_ #define V8_COMPILER_TURBOSHAFT_WASM_GC_TYPED_OPTIMIZATION_REDUCER_H_ #include "src/compiler/turboshaft/assembler.h" #include "src/compiler/turboshaft/operations.h" #include "src/compiler/turboshaft/phase.h" #include "src/compiler/turboshaft/snapshot-table-opindex.h" #include "src/compiler/wasm-graph-assembler.h" #include "src/wasm/wasm-subtyping.h" namespace v8::internal::compiler::turboshaft { // The WasmGCTypedOptimizationReducer infers type information based on the input // graph and reduces type checks and casts based on that information. // // This is done in two steps: // 1) The WasmGCTypeAnalyzer infers the types based on the input graph, e.g.: // func (param anyref) (result i32) // local.get 0 // ref.test $MyType // if // local 0 is known to be (a subtype of) $MyType // local.get 0 // ref.cast $MyType // the input of this cast is a subtype of $MyType // // it can be removed during reduction // struct.get $MyType 0 // return // end // local 0 is still anyref // i32.const 0 // // 2) The WasmGCTypedOptimizationReducer reduces the graph to a new graph // potentially removing, simplifying (e.g. replacing a cast with a null // check) or refining (setting the from type to a more specific type) type // operations. class WasmGCTypeAnalyzer { … }; #include "src/compiler/turboshaft/define-assembler-macros.inc" template <class Next> class WasmGCTypedOptimizationReducer : public Next { … }; #include "src/compiler/turboshaft/undef-assembler-macros.inc" } // namespace v8::internal::compiler::turboshaft #endif // V8_COMPILER_TURBOSHAFT_WASM_GC_TYPED_OPTIMIZATION_REDUCER_H_