//===- SplitKit.h - Toolkit for splitting live ranges -----------*- 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 // //===----------------------------------------------------------------------===// // // This file contains the SplitAnalysis class as well as mutator functions for // live range splitting. // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_CODEGEN_SPLITKIT_H #define LLVM_LIB_CODEGEN_SPLITKIT_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/BitVector.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/IntervalMap.h" #include "llvm/ADT/PointerIntPair.h" #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/CodeGen/LiveIntervalCalc.h" #include "llvm/CodeGen/LiveIntervals.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/SlotIndexes.h" #include "llvm/Support/Compiler.h" #include <utility> namespace llvm { class LiveInterval; class LiveRange; class LiveIntervals; class LiveRangeEdit; class MachineBlockFrequencyInfo; class MachineDominatorTree; class MachineLoopInfo; class MachineRegisterInfo; class TargetInstrInfo; class TargetRegisterInfo; class VirtRegMap; class VirtRegAuxInfo; /// Determines the latest safe point in a block in which we can insert a split, /// spill or other instruction related with CurLI. class LLVM_LIBRARY_VISIBILITY InsertPointAnalysis { … }; /// SplitAnalysis - Analyze a LiveInterval, looking for live range splitting /// opportunities. class LLVM_LIBRARY_VISIBILITY SplitAnalysis { … }; /// SplitEditor - Edit machine code and LiveIntervals for live range /// splitting. /// /// - Create a SplitEditor from a SplitAnalysis. /// - Start a new live interval with openIntv. /// - Mark the places where the new interval is entered using enterIntv* /// - Mark the ranges where the new interval is used with useIntv* /// - Mark the places where the interval is exited with exitIntv*. /// - Finish the current interval with closeIntv and repeat from 2. /// - Rewrite instructions with finish(). /// class LLVM_LIBRARY_VISIBILITY SplitEditor { … }; } // end namespace llvm #endif // LLVM_LIB_CODEGEN_SPLITKIT_H