122a56f2fSStanislav Mekhanoshin //===-- SIFixVGPRCopies.cpp - Fix VGPR Copies after regalloc --------------===// 222a56f2fSStanislav Mekhanoshin // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 622a56f2fSStanislav Mekhanoshin // 722a56f2fSStanislav Mekhanoshin //===----------------------------------------------------------------------===// 822a56f2fSStanislav Mekhanoshin // 922a56f2fSStanislav Mekhanoshin /// \file 105f8f34e4SAdrian Prantl /// Add implicit use of exec to vector register copies. 1122a56f2fSStanislav Mekhanoshin /// 1222a56f2fSStanislav Mekhanoshin //===----------------------------------------------------------------------===// 1322a56f2fSStanislav Mekhanoshin 1422a56f2fSStanislav Mekhanoshin #include "AMDGPU.h" 15*560d7e04Sdfukalov #include "GCNSubtarget.h" 16*560d7e04Sdfukalov #include "MCTargetDesc/AMDGPUMCTargetDesc.h" 1722a56f2fSStanislav Mekhanoshin #include "llvm/CodeGen/MachineFunctionPass.h" 1822a56f2fSStanislav Mekhanoshin 1922a56f2fSStanislav Mekhanoshin using namespace llvm; 2022a56f2fSStanislav Mekhanoshin 2122a56f2fSStanislav Mekhanoshin #define DEBUG_TYPE "si-fix-vgpr-copies" 2222a56f2fSStanislav Mekhanoshin 2322a56f2fSStanislav Mekhanoshin namespace { 2422a56f2fSStanislav Mekhanoshin 2522a56f2fSStanislav Mekhanoshin class SIFixVGPRCopies : public MachineFunctionPass { 2622a56f2fSStanislav Mekhanoshin public: 2722a56f2fSStanislav Mekhanoshin static char ID; 2822a56f2fSStanislav Mekhanoshin 2922a56f2fSStanislav Mekhanoshin public: SIFixVGPRCopies()3022a56f2fSStanislav Mekhanoshin SIFixVGPRCopies() : MachineFunctionPass(ID) { 3122a56f2fSStanislav Mekhanoshin initializeSIFixVGPRCopiesPass(*PassRegistry::getPassRegistry()); 3222a56f2fSStanislav Mekhanoshin } 3322a56f2fSStanislav Mekhanoshin 3422a56f2fSStanislav Mekhanoshin bool runOnMachineFunction(MachineFunction &MF) override; 3522a56f2fSStanislav Mekhanoshin getPassName() const3622a56f2fSStanislav Mekhanoshin StringRef getPassName() const override { return "SI Fix VGPR copies"; } 3722a56f2fSStanislav Mekhanoshin }; 3822a56f2fSStanislav Mekhanoshin 3922a56f2fSStanislav Mekhanoshin } // End anonymous namespace. 4022a56f2fSStanislav Mekhanoshin 4122a56f2fSStanislav Mekhanoshin INITIALIZE_PASS(SIFixVGPRCopies, DEBUG_TYPE, "SI Fix VGPR copies", false, false) 4222a56f2fSStanislav Mekhanoshin 4322a56f2fSStanislav Mekhanoshin char SIFixVGPRCopies::ID = 0; 4422a56f2fSStanislav Mekhanoshin 4522a56f2fSStanislav Mekhanoshin char &llvm::SIFixVGPRCopiesID = SIFixVGPRCopies::ID; 4622a56f2fSStanislav Mekhanoshin runOnMachineFunction(MachineFunction & MF)4722a56f2fSStanislav Mekhanoshinbool SIFixVGPRCopies::runOnMachineFunction(MachineFunction &MF) { 485bfbae5cSTom Stellard const GCNSubtarget &ST = MF.getSubtarget<GCNSubtarget>(); 4922a56f2fSStanislav Mekhanoshin const SIRegisterInfo *TRI = ST.getRegisterInfo(); 5022a56f2fSStanislav Mekhanoshin const SIInstrInfo *TII = ST.getInstrInfo(); 5122a56f2fSStanislav Mekhanoshin bool Changed = false; 5222a56f2fSStanislav Mekhanoshin 5322a56f2fSStanislav Mekhanoshin for (MachineBasicBlock &MBB : MF) { 5422a56f2fSStanislav Mekhanoshin for (MachineInstr &MI : MBB) { 5522a56f2fSStanislav Mekhanoshin switch (MI.getOpcode()) { 5622a56f2fSStanislav Mekhanoshin case AMDGPU::COPY: 5722a56f2fSStanislav Mekhanoshin if (TII->isVGPRCopy(MI) && !MI.readsRegister(AMDGPU::EXEC, TRI)) { 5822a56f2fSStanislav Mekhanoshin MI.addOperand(MF, 5922a56f2fSStanislav Mekhanoshin MachineOperand::CreateReg(AMDGPU::EXEC, false, true)); 60d34e60caSNicola Zaghen LLVM_DEBUG(dbgs() << "Add exec use to " << MI); 6122a56f2fSStanislav Mekhanoshin Changed = true; 6222a56f2fSStanislav Mekhanoshin } 6322a56f2fSStanislav Mekhanoshin break; 6422a56f2fSStanislav Mekhanoshin default: 6522a56f2fSStanislav Mekhanoshin break; 6622a56f2fSStanislav Mekhanoshin } 6722a56f2fSStanislav Mekhanoshin } 6822a56f2fSStanislav Mekhanoshin } 6922a56f2fSStanislav Mekhanoshin 7022a56f2fSStanislav Mekhanoshin return Changed; 7122a56f2fSStanislav Mekhanoshin } 72