// Copyright 2022 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. #ifndef V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_REDUCER_H_ #define V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_REDUCER_H_ #include <limits> #include <optional> #include "src/base/logging.h" #include "src/base/vector.h" #include "src/compiler/common-operator.h" #include "src/compiler/turboshaft/assembler.h" #include "src/compiler/turboshaft/copying-phase.h" #include "src/compiler/turboshaft/operations.h" #include "src/compiler/turboshaft/representations.h" #include "src/compiler/turboshaft/sidetable.h" #include "src/compiler/turboshaft/snapshot-table.h" #include "src/compiler/turboshaft/tracing.h" #include "src/compiler/turboshaft/type-inference-analysis.h" #include "src/compiler/turboshaft/typer.h" #include "src/compiler/turboshaft/types.h" #include "src/compiler/turboshaft/uniform-reducer-adapter.h" namespace v8::internal::compiler::turboshaft { #include "src/compiler/turboshaft/define-assembler-macros.inc" template <typename Op> V8_INLINE bool CanBeTyped(const Op& operation) { … } struct TypeInferenceReducerArgs : base::ContextualClass<TypeInferenceReducerArgs> { … }; // TypeInferenceReducer is the central component to infer types for Turboshaft // graphs. It comes with different options for how the input and output graph // should be typed: // // - InputGraphTyping::kNone: No types are computed for the input graph. // - InputGraphTyping::kPrecise: We run a full fixpoint analysis on the input // graph to infer the most precise types possible (see TypeInferenceAnalysis). // // - OutputGraphTyping::kNone: No types will be set for the output graph. // - OutputGraphTyping::kPreserveFromInputGraph: Types from the input graph will // be preserved for the output graph. Where this is not possible (e.g. new // operations introduced during lowering), the output operation will be untyped. // - OutputGraphTyping::kRefineFromInputGraph: Types from the input graph will // be used where they provide additional precision (e.g loop phis). For new // operations, the reducer reruns the typer to make sure that the output graph // is fully typed. // // NOTE: The TypeInferenceReducer has to be the last reducer in the stack! template <class Next> class TypeInferenceReducer : public UniformReducerAdapter<TypeInferenceReducer, Next> { … }; #include "src/compiler/turboshaft/undef-assembler-macros.inc" } // namespace v8::internal::compiler::turboshaft #endif // V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_REDUCER_H_