Index: llvm/include/llvm/CodeGen/GlobalISel/Utils.h =================================================================== --- llvm/include/llvm/CodeGen/GlobalISel/Utils.h +++ llvm/include/llvm/CodeGen/GlobalISel/Utils.h @@ -151,6 +151,17 @@ MachineInstr *getOpcodeDef(unsigned Opcode, Register Reg, const MachineRegisterInfo &MRI); +struct DefinitionAndSourceRegister { + MachineInstr *MI; + Register Reg; +}; + +/// Find the def instruction for \p Reg, and underlying value Register folding +/// away any copies. +Optional +getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI, + bool CopyOnly = true); + /// Find the def instruction for \p Reg, folding away any trivial copies. May /// return nullptr if \p Reg is not a generic virtual register. MachineInstr *getDefIgnoringCopies(Register Reg, Index: llvm/lib/CodeGen/GlobalISel/Utils.cpp =================================================================== --- llvm/lib/CodeGen/GlobalISel/Utils.cpp +++ llvm/lib/CodeGen/GlobalISel/Utils.cpp @@ -351,13 +351,6 @@ return MI->getOperand(1).getFPImm(); } -namespace { -struct DefinitionAndSourceRegister { - MachineInstr *MI; - Register Reg; -}; -} // namespace - /// Return the source virtual register if this is a bit-preserving no-op cast, /// otherwise Register(). static Register getCopyLikeSrcReg(const MachineInstr &MI, @@ -389,9 +382,9 @@ } } -static Optional -getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI, - bool CopyOnly) { +Optional +llvm::getDefSrcRegIgnoringCopies(Register Reg, const MachineRegisterInfo &MRI, + bool CopyOnly) { Register DefSrcReg = Reg; auto *DefMI = MRI.getVRegDef(Reg); auto DstTy = MRI.getType(DefMI->getOperand(0).getReg());