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 TargetRegisterInfo &TRI; 3040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 31c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// DstReg - The register that will be left after coalescing. It can be a 3240d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// virtual or physical register. 33c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned DstReg; 3440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 35c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// SrcReg - the virtual register that will be coalesced into dstReg. 36c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned SrcReg; 3740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 3894b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// DstIdx - The sub-register index of the old DstReg in the new coalesced 3994b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// register. 4094b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen unsigned DstIdx; 4194b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen 4294b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// SrcIdx - The sub-register index of the old SrcReg in the new coalesced 4394b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// register. 4494b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen unsigned SrcIdx; 4540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 46c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// Partial - True when the original copy was a partial subregister copy. 47c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool Partial; 4840d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 49c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// CrossClass - True when both regs are virtual, and newRC is constrained. 50c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool CrossClass; 518df08017d81ef3749acdc3234e3f33c15a6d0defJakob Stoklund Olesen 526fa87df0d6948d9957eb16042b088e9d6e859854Lang Hames /// Flipped - True when DstReg and SrcReg are reversed from the original 53c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// copy instruction. 54c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool Flipped; 5540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 56c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// NewRC - The register class of the coalesced register, or NULL if DstReg 5794b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// is a physreg. This register class may be a super-register of both 5894b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// SrcReg and DstReg. 59c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetRegisterClass *NewRC; 6040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 6140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen public: 62a7542d5f870c5d98960d1676e23ac1d1d975d7e5Benjamin Kramer CoalescerPair(const TargetRegisterInfo &tri) 63a7542d5f870c5d98960d1676e23ac1d1d975d7e5Benjamin Kramer : TRI(tri), DstReg(0), SrcReg(0), DstIdx(0), SrcIdx(0), 64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Partial(false), CrossClass(false), Flipped(false), NewRC(nullptr) {} 6540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 6645c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen /// Create a CoalescerPair representing a virtreg-to-physreg copy. 6745c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen /// No need to call setRegisters(). 6845c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen CoalescerPair(unsigned VirtReg, unsigned PhysReg, 6945c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen const TargetRegisterInfo &tri) 7045c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen : TRI(tri), DstReg(PhysReg), SrcReg(VirtReg), DstIdx(0), SrcIdx(0), 71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Partial(false), CrossClass(false), Flipped(false), NewRC(nullptr) {} 7245c5c57179e8b4938042431f8e12c9bfad67b3c8Jakob Stoklund Olesen 7340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// setRegisters - set registers to match the copy instruction MI. Return 7440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// false if MI is not a coalescable copy instruction. 7540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool setRegisters(const MachineInstr*); 7640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 77c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// flip - Swap SrcReg and DstReg. Return false if swapping is impossible 78c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// because DstReg is a physical register, or SubIdx is set. 7940d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool flip(); 8040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 8140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isCoalescable - Return true if MI is a copy instruction that will become 8240d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// an identity copy after coalescing. 8340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen bool isCoalescable(const MachineInstr*) const; 8440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 8540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isPhys - Return true if DstReg is a physical register. 86c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isPhys() const { return !NewRC; } 8740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 88c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// isPartial - Return true if the original copy instruction did not copy 89c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// the full register, but was a subreg operation. 90c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isPartial() const { return Partial; } 9140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 92c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// isCrossClass - Return true if DstReg is virtual and NewRC is a smaller 93c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen /// register class than DstReg's. 94c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isCrossClass() const { return CrossClass; } 958df08017d81ef3749acdc3234e3f33c15a6d0defJakob Stoklund Olesen 9640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// isFlipped - Return true when getSrcReg is the register being defined by 9740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// the original copy instruction. 98c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen bool isFlipped() const { return Flipped; } 9940d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 10040d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getDstReg - Return the register (virtual or physical) that will remain 10140d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// after coalescing. 102c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned getDstReg() const { return DstReg; } 10340d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 10440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getSrcReg - Return the virtual register that will be coalesced away. 105c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen unsigned getSrcReg() const { return SrcReg; } 10640d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 10794b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// getDstIdx - Return the subregister index that DstReg will be coalesced 10894b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// into, or 0. 10994b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen unsigned getDstIdx() const { return DstIdx; } 11094b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen 11194b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// getSrcIdx - Return the subregister index that SrcReg will be coalesced 11294b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen /// into, or 0. 11394b62ac5f3b2732251f164ee6feab2dd1a4b967fJakob Stoklund Olesen unsigned getSrcIdx() const { return SrcIdx; } 11440d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen 11540d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen /// getNewRC - Return the register class of the coalesced register. 116c19e6dd64fe4fa825c8d79e1d097e301c66eaf72Jakob Stoklund Olesen const TargetRegisterClass *getNewRC() const { return NewRC; } 11740d07bbebbe73914af28be1bdab169ce8333adcaJakob Stoklund Olesen }; 118b0efa94fb63d55c7aa5eb3c7c23d39a763036c24Rafael Espindola} // End llvm namespace 1192c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene 1202c17c4d8d9f232f0329786ad9abee976bc0f3d27David Greene#endif 121