//===- llvm/CodeGen/LivePhysRegs.h - Live Physical Register Set -*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // /// \file /// This file implements the LivePhysRegs utility for tracking liveness of /// physical registers. This can be used for ad-hoc liveness tracking after /// register allocation. You can start with the live-ins/live-outs at the /// beginning/end of a block and update the information while walking the /// instructions inside the block. This implementation tracks the liveness on a /// sub-register granularity. /// /// We assume that the high bits of a physical super-register are not preserved /// unless the instruction has an implicit-use operand reading the super- /// register. /// /// X86 Example: /// %ymm0 = ... /// %xmm0 = ... (Kills %xmm0, all %xmm0s sub-registers, and %ymm0) /// /// %ymm0 = ... /// %xmm0 = ..., implicit %ymm0 (%ymm0 and all its sub-registers are alive) //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_LIVEPHYSREGS_H #define LLVM_CODEGEN_LIVEPHYSREGS_H #include "llvm/ADT/SparseSet.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/MC/MCRegister.h" #include "llvm/MC/MCRegisterInfo.h" #include <cassert> #include <utility> namespace llvm { template <typename T> class ArrayRef; class MachineInstr; class MachineFunction; class MachineOperand; class MachineRegisterInfo; class raw_ostream; /// A set of physical registers with utility functions to track liveness /// when walking backward/forward through a basic block. class LivePhysRegs { … }; inline raw_ostream &operator<<(raw_ostream &OS, const LivePhysRegs& LR) { … } /// Computes registers live-in to \p MBB assuming all of its successors /// live-in lists are up-to-date. Puts the result into the given LivePhysReg /// instance \p LiveRegs. void computeLiveIns(LivePhysRegs &LiveRegs, const MachineBasicBlock &MBB); /// Recomputes dead and kill flags in \p MBB. void recomputeLivenessFlags(MachineBasicBlock &MBB); /// Adds registers contained in \p LiveRegs to the block live-in list of \p MBB. /// Does not add reserved registers. void addLiveIns(MachineBasicBlock &MBB, const LivePhysRegs &LiveRegs); /// Convenience function combining computeLiveIns() and addLiveIns(). void computeAndAddLiveIns(LivePhysRegs &LiveRegs, MachineBasicBlock &MBB); /// Convenience function for recomputing live-in's for a MBB. Returns true if /// any changes were made. static inline bool recomputeLiveIns(MachineBasicBlock &MBB) { … } /// Convenience function for recomputing live-in's for a set of MBBs until the /// computation converges. inline void fullyRecomputeLiveIns(ArrayRef<MachineBasicBlock *> MBBs) { … } } // end namespace llvm #endif // LLVM_CODEGEN_LIVEPHYSREGS_H