1*b5893f02SDimitry Andric //===-- lib/CodeGen/GlobalISel/GISelChangeObserver.cpp --------------------===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric //                     The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric //
10*b5893f02SDimitry Andric // This file constains common code to combine machine functions at generic
11*b5893f02SDimitry Andric // level.
12*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
13*b5893f02SDimitry Andric 
14*b5893f02SDimitry Andric #include "llvm/CodeGen/GlobalISel/GISelChangeObserver.h"
15*b5893f02SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h"
16*b5893f02SDimitry Andric 
17*b5893f02SDimitry Andric using namespace llvm;
18*b5893f02SDimitry Andric 
changingAllUsesOfReg(const MachineRegisterInfo & MRI,unsigned Reg)19*b5893f02SDimitry Andric void GISelChangeObserver::changingAllUsesOfReg(
20*b5893f02SDimitry Andric     const MachineRegisterInfo &MRI, unsigned Reg) {
21*b5893f02SDimitry Andric   for (auto &ChangingMI : MRI.use_instructions(Reg)) {
22*b5893f02SDimitry Andric     changingInstr(ChangingMI);
23*b5893f02SDimitry Andric     ChangingAllUsesOfReg.insert(&ChangingMI);
24*b5893f02SDimitry Andric   }
25*b5893f02SDimitry Andric }
26*b5893f02SDimitry Andric 
finishedChangingAllUsesOfReg()27*b5893f02SDimitry Andric void GISelChangeObserver::finishedChangingAllUsesOfReg() {
28*b5893f02SDimitry Andric   for (auto *ChangedMI : ChangingAllUsesOfReg)
29*b5893f02SDimitry Andric     changedInstr(*ChangedMI);
30*b5893f02SDimitry Andric }
31*b5893f02SDimitry Andric 
RAIIDelegateInstaller(MachineFunction & MF,MachineFunction::Delegate * Del)32*b5893f02SDimitry Andric RAIIDelegateInstaller::RAIIDelegateInstaller(MachineFunction &MF,
33*b5893f02SDimitry Andric                                              MachineFunction::Delegate *Del)
34*b5893f02SDimitry Andric     : MF(MF), Delegate(Del) {
35*b5893f02SDimitry Andric   // Register this as the delegate for handling insertions and deletions of
36*b5893f02SDimitry Andric   // instructions.
37*b5893f02SDimitry Andric   MF.setDelegate(Del);
38*b5893f02SDimitry Andric }
39*b5893f02SDimitry Andric 
~RAIIDelegateInstaller()40*b5893f02SDimitry Andric RAIIDelegateInstaller::~RAIIDelegateInstaller() { MF.resetDelegate(Delegate); }
41