|  | //===-- SIFixVGPRCopies.cpp - Fix VGPR Copies after regalloc --------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | /// \file | 
|  | /// \brief Add implicit use of exec to vector register copies. | 
|  | /// | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "AMDGPU.h" | 
|  | #include "AMDGPUSubtarget.h" | 
|  | #include "SIInstrInfo.h" | 
|  | #include "llvm/CodeGen/MachineFunctionPass.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | #define DEBUG_TYPE "si-fix-vgpr-copies" | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | class SIFixVGPRCopies : public MachineFunctionPass { | 
|  | public: | 
|  | static char ID; | 
|  |  | 
|  | public: | 
|  | SIFixVGPRCopies() : MachineFunctionPass(ID) { | 
|  | initializeSIFixVGPRCopiesPass(*PassRegistry::getPassRegistry()); | 
|  | } | 
|  |  | 
|  | bool runOnMachineFunction(MachineFunction &MF) override; | 
|  |  | 
|  | StringRef getPassName() const override { return "SI Fix VGPR copies"; } | 
|  | }; | 
|  |  | 
|  | } // End anonymous namespace. | 
|  |  | 
|  | INITIALIZE_PASS(SIFixVGPRCopies, DEBUG_TYPE, "SI Fix VGPR copies", false, false) | 
|  |  | 
|  | char SIFixVGPRCopies::ID = 0; | 
|  |  | 
|  | char &llvm::SIFixVGPRCopiesID = SIFixVGPRCopies::ID; | 
|  |  | 
|  | bool SIFixVGPRCopies::runOnMachineFunction(MachineFunction &MF) { | 
|  | const SISubtarget &ST = MF.getSubtarget<SISubtarget>(); | 
|  | const SIRegisterInfo *TRI = ST.getRegisterInfo(); | 
|  | const SIInstrInfo *TII = ST.getInstrInfo(); | 
|  | bool Changed = false; | 
|  |  | 
|  | for (MachineBasicBlock &MBB : MF) { | 
|  | for (MachineInstr &MI : MBB) { | 
|  | switch (MI.getOpcode()) { | 
|  | case AMDGPU::COPY: | 
|  | if (TII->isVGPRCopy(MI) && !MI.readsRegister(AMDGPU::EXEC, TRI)) { | 
|  | MI.addOperand(MF, | 
|  | MachineOperand::CreateReg(AMDGPU::EXEC, false, true)); | 
|  | DEBUG(dbgs() << "Add exec use to " << MI); | 
|  | Changed = true; | 
|  | } | 
|  | break; | 
|  | default: | 
|  | break; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  | return Changed; | 
|  | } |