// 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_MAGLEV_MAGLEV_REGALLOC_H_ #define V8_MAGLEV_MAGLEV_REGALLOC_H_ #include "src/codegen/reglist.h" #include "src/compiler/backend/instruction.h" #include "src/maglev/maglev-compilation-info.h" #include "src/maglev/maglev-graph.h" #include "src/maglev/maglev-ir.h" #include "src/maglev/maglev-regalloc-data.h" namespace v8 { namespace internal { namespace maglev { class MaglevCompilationInfo; class MaglevPrintingVisitor; class MergePointRegisterState; // Represents the state of the register frame during register allocation, // including current register values, and the state of each register. // // Register state encodes two orthogonal concepts: // // 1. Used/free registers: Which registers currently hold a valid value, // 2. Blocked/unblocked registers: Which registers can be modified during the // current allocation. // // The combination of these encodes values in different states: // // Free + unblocked: Completely unused registers which can be used for // anything. // Used + unblocked: Live values that can be spilled if there is register // pressure. // Used + blocked: Values that are in a register and are used as an input in // the current allocation. // Free + blocked: Unused registers that are reserved as temporaries, or // inputs that will get clobbered during the execution of the // node being allocated. template <typename RegisterT> class RegisterFrameState { … }; class StraightForwardRegisterAllocator { … }; } // namespace maglev } // namespace internal } // namespace v8 #endif // V8_MAGLEV_MAGLEV_REGALLOC_H_