RegisterCoalescer.h revision 7842a741eb0e1baa35af8c3bb5884655c1edaa9e
17842a741eb0e1baa35af8c3bb5884655c1edaa9eJim Grosbach//===-- RegisterCoalescer.h - Register Coalescing Interface -----*- C++ -*-===// 22c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// 32c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// The LLVM Compiler Infrastructure 42c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 72c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// 82c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene//===----------------------------------------------------------------------===// 92c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// 107842a741eb0e1baa35af8c3bb5884655c1edaa9eJim Grosbach// This file contains the abstract interface for register coalescers, 112c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// allowing them to interact with and query register allocators. 122c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene// 132c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene//===----------------------------------------------------------------------===// 142c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene 152c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene#ifndef LLVM_CODEGEN_REGISTER_COALESCER_H 162c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene#define LLVM_CODEGEN_REGISTER_COALESCER_H 172c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene 18d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohmannamespace llvm { 19d68a07650cdb2e18f18f362ba533459aa10e01b6Dan Gohman 202c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene class MachineInstr; 2140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen class TargetRegisterInfo; 2240d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen class TargetRegisterClass; 2340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen class TargetInstrInfo; 242c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene 2540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// CoalescerPair - A helper class for register coalescers. When deciding if 2640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// two registers can be coalesced, CoalescerPair can determine if a copy 2740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// instruction would become an identity copy after coalescing. 2840d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen class CoalescerPair { 29c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetInstrInfo &TII; 30c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetRegisterInfo &TRI; 3140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 32c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// DstReg - The register that will be left after coalescing. It can be a 3340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// virtual or physical register. 34c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned DstReg; 3540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 36c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// SrcReg - the virtual register that will be coalesced into dstReg. 37c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned SrcReg; 3840d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 39c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// subReg_ - The subregister index of srcReg in DstReg. It is possible the 40c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// coalesce SrcReg into a subreg of the larger DstReg when DstReg is a 4140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// virtual register. 42c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned SubIdx; 4340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 44c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// Partial - True when the original copy was a partial subregister copy. 45c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool Partial; 4640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 47c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// CrossClass - True when both regs are virtual, and newRC is constrained. 48c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool CrossClass; 498df08017d81ef3749acdc3234e3f33c15a6d0defJakob Stoklund Olesen 50c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// Flipped - True when DstReg and SrcReg are reversed from the oriignal 51c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// copy instruction. 52c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool Flipped; 5340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 54c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// NewRC - The register class of the coalesced register, or NULL if DstReg 5540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// is a physreg. 56c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetRegisterClass *NewRC; 5740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 5840d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen public: 5940d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen CoalescerPair(const TargetInstrInfo &tii, const TargetRegisterInfo &tri) 60c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen : TII(tii), TRI(tri), DstReg(0), SrcReg(0), SubIdx(0), 61c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen Partial(false), CrossClass(false), Flipped(false), NewRC(0) {} 6240d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 6340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// setRegisters - set registers to match the copy instruction MI. Return 6440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// false if MI is not a coalescable copy instruction. 6540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool setRegisters(const MachineInstr*); 6640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 67c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// flip - Swap SrcReg and DstReg. Return false if swapping is impossible 68c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// because DstReg is a physical register, or SubIdx is set. 6940d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool flip(); 7040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 7140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isCoalescable - Return true if MI is a copy instruction that will become 7240d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// an identity copy after coalescing. 7340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool isCoalescable(const MachineInstr*) const; 7440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 7540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isPhys - Return true if DstReg is a physical register. 76c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isPhys() const { return !NewRC; } 7740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 78c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// isPartial - Return true if the original copy instruction did not copy 79c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// the full register, but was a subreg operation. 80c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isPartial() const { return Partial; } 8140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 82c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// isCrossClass - Return true if DstReg is virtual and NewRC is a smaller 83c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// register class than DstReg's. 84c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isCrossClass() const { return CrossClass; } 858df08017d81ef3749acdc3234e3f33c15a6d0defJakob Stoklund Olesen 8640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isFlipped - Return true when getSrcReg is the register being defined by 8740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// the original copy instruction. 88c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isFlipped() const { return Flipped; } 8940d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 9040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getDstReg - Return the register (virtual or physical) that will remain 9140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// after coalescing. 92c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned getDstReg() const { return DstReg; } 9340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 9440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getSrcReg - Return the virtual register that will be coalesced away. 95c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned getSrcReg() const { return SrcReg; } 9640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 9740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getSubIdx - Return the subregister index in DstReg that SrcReg will be 9840d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// coalesced into, or 0. 99c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned getSubIdx() const { return SubIdx; } 10040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 10140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getNewRC - Return the register class of the coalesced register. 102c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetRegisterClass *getNewRC() const { return NewRC; } 10340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen }; 104b0efa94fb63d55c7aa5eb3c7c23d39a763036c24Rafael Espindola} // End llvm namespace 1052c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene 1062c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene#endif 107