// 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_INSTRUCTION_SELECTION_PHASE_H_ #define V8_COMPILER_TURBOSHAFT_INSTRUCTION_SELECTION_PHASE_H_ #include <optional> #include "src/compiler/turboshaft/phase.h" namespace v8::internal { class ProfileDataFromFile; } namespace v8::internal::compiler::turboshaft { // Compute the special reverse-post-order block ordering, which is essentially // a RPO of the graph where loop bodies are contiguous. Properties: // 1. If block A is a predecessor of B, then A appears before B in the order, // unless B is a loop header and A is in the loop headed at B // (i.e. A -> B is a backedge). // => If block A dominates block B, then A appears before B in the order. // => If block A is a loop header, A appears before all blocks in the loop // headed at A. // 2. All loops are contiguous in the order (i.e. no intervening blocks that // do not belong to the loop.) // Note a simple RPO traversal satisfies (1) but not (2). // TODO(nicohartmann@): Investigate faster and simpler alternatives. class V8_EXPORT_PRIVATE TurboshaftSpecialRPONumberer { … }; V8_EXPORT_PRIVATE void PropagateDeferred(Graph& graph); struct ProfileApplicationPhase { … }; struct SpecialRPOSchedulingPhase { … }; struct InstructionSelectionPhase { … }; } // namespace v8::internal::compiler::turboshaft #endif // V8_COMPILER_TURBOSHAFT_INSTRUCTION_SELECTION_PHASE_H_