//== ---lib/CodeGen/GlobalISel/GICombinerHelper.cpp --------------------- == // // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GlobalISel/CombinerHelper.h" #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.h" #include "llvm/CodeGen/GlobalISel/Utils.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #define DEBUG_TYPE "gi-combine" using namespace llvm; CombinerHelper::CombinerHelper(MachineIRBuilder &B) : Builder(B), MRI(Builder.getMF().getRegInfo()) {} bool CombinerHelper::tryCombineCopy(MachineInstr &MI) { if (MI.getOpcode() != TargetOpcode::COPY) return false; unsigned DstReg = MI.getOperand(0).getReg(); unsigned SrcReg = MI.getOperand(1).getReg(); LLT DstTy = MRI.getType(DstReg); LLT SrcTy = MRI.getType(SrcReg); // Simple Copy Propagation. // a(sx) = COPY b(sx) -> Replace all uses of a with b. if (DstTy.isValid() && SrcTy.isValid() && DstTy == SrcTy) { MI.eraseFromParent(); MRI.replaceRegWith(DstReg, SrcReg); return true; } return false; } bool CombinerHelper::tryCombine(MachineInstr &MI) { return tryCombineCopy(MI); }