// 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. #ifndef V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_ANALYSIS_H_ #define V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_ANALYSIS_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/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/typer.h" #include "src/compiler/turboshaft/types.h" namespace v8::internal::compiler::turboshaft { // This analysis infers types for all operations. It does so by running a // fixpoint analysis on the input graph in order to properly type PhiOps. The // analysis visits blocks in order and computes operation types using // Turboshaft's Typer. For Goto operations, the analysis checks if this is a // back edge (the Goto's target is a loop block with an index less than the // index of the current block). If this is the case, the analysis revisits the // loop block (this is when ProcessBlock<true> is called). During this revisit, // two things are different to the normal processing of a block: // // 1.) PhiOps are handled specially, which means applying proper // widening/narrowing mechanics to accelerate termination while still computing // somewhat precise types for Phis. 2.) If the type of any of the loop's Phis // grows, we reset the index of unprocessed blocks to the block after the loop // header, such that the entire loop body is revisited with the new type // information. class TypeInferenceAnalysis { … }; } // namespace v8::internal::compiler::turboshaft #endif // V8_COMPILER_TURBOSHAFT_TYPE_INFERENCE_ANALYSIS_H_