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 Mekhanoshin bool 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