1cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===-- SIFixSGPRLiveRanges.cpp - Fix SGPR live ranges ----------------------===// 2cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 3cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// The LLVM Compiler Infrastructure 4cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 5cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// This file is distributed under the University of Illinois Open Source 6cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// License. See LICENSE.TXT for details. 7cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 8cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines//===----------------------------------------------------------------------===// 9cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines// 10cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// \file 11cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// SALU instructions ignore control flow, so we need to modify the live ranges 12cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// of the registers they define. 13cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// 14cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// The strategy is to view the entire program as if it were a single basic 15cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// block and calculate the intervals accordingly. We implement this 16cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// by walking this list of segments for each LiveRange and setting the 17cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// end of each segment equal to the start of the segment that immediately 18cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines/// follows it. 19cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "AMDGPU.h" 21cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "SIRegisterInfo.h" 22cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/CodeGen/LiveIntervalAnalysis.h" 23cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/CodeGen/MachineFunctionPass.h" 24cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/CodeGen/MachineRegisterInfo.h" 25cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Support/Debug.h" 26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#include "llvm/Target/TargetMachine.h" 27cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 28cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesusing namespace llvm; 29cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 30cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#define DEBUG_TYPE "si-fix-sgpr-live-ranges" 31cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 32cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesnamespace { 33cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 34cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass SIFixSGPRLiveRanges : public MachineFunctionPass { 35cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic: 36cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines static char ID; 37cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 38cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinespublic: 39cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines SIFixSGPRLiveRanges() : MachineFunctionPass(ID) { 40cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines initializeSIFixSGPRLiveRangesPass(*PassRegistry::getPassRegistry()); 41cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual bool runOnMachineFunction(MachineFunction &MF) override; 44cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 45cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual const char *getPassName() const override { 46cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return "SI Fix SGPR live ranges"; 47cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 48cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 49cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines virtual void getAnalysisUsage(AnalysisUsage &AU) const override { 50cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AU.addRequired<LiveIntervals>(); 51cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AU.addPreserved<LiveIntervals>(); 52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AU.addPreserved<SlotIndexes>(); 53cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines AU.setPreservesCFG(); 54cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MachineFunctionPass::getAnalysisUsage(AU); 55cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 56cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines}; 57cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 58cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} // End anonymous namespace. 59cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 60cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesINITIALIZE_PASS_BEGIN(SIFixSGPRLiveRanges, DEBUG_TYPE, 61cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "SI Fix SGPR Live Ranges", false, false) 62cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesINITIALIZE_PASS_DEPENDENCY(LiveIntervals) 63cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesINITIALIZE_PASS_END(SIFixSGPRLiveRanges, DEBUG_TYPE, 64cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines "SI Fix SGPR Live Ranges", false, false) 65cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 66cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hineschar SIFixSGPRLiveRanges::ID = 0; 67cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 68cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hineschar &llvm::SIFixSGPRLiveRangesID = SIFixSGPRLiveRanges::ID; 69cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 70cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen HinesFunctionPass *llvm::createSIFixSGPRLiveRangesPass() { 71cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return new SIFixSGPRLiveRanges(); 72cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 73cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool SIFixSGPRLiveRanges::runOnMachineFunction(MachineFunction &MF) { 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MachineRegisterInfo &MRI = MF.getRegInfo(); 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const SIRegisterInfo *TRI = static_cast<const SIRegisterInfo *>( 77cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MF.getTarget().getRegisterInfo()); 78cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LiveIntervals *LIS = &getAnalysis<LiveIntervals>(); 79cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 80cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (MachineFunction::iterator BI = MF.begin(), BE = MF.end(); 81cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines BI != BE; ++BI) { 82cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 83cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MachineBasicBlock &MBB = *BI; 84cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); 85cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines I != E; ++I) { 86cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MachineInstr &MI = *I; 87cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines MachineOperand *ExecUse = MI.findRegisterUseOperand(AMDGPU::EXEC); 88cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (ExecUse) 89cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 90cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 91cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (const MachineOperand &Def : MI.operands()) { 92cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!Def.isReg() || !Def.isDef() ||!TargetRegisterInfo::isVirtualRegister(Def.getReg())) 93cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 94cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 95cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines const TargetRegisterClass *RC = MRI.getRegClass(Def.getReg()); 96cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 97cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines if (!TRI->isSGPRClass(RC)) 98cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines continue; 99cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LiveInterval &LI = LIS->getInterval(Def.getReg()); 100cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines for (unsigned i = 0, e = LI.size() - 1; i != e; ++i) { 101cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LiveRange::Segment &Seg = LI.segments[i]; 102cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines LiveRange::Segment &Next = LI.segments[i + 1]; 103cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines Seg.end = Next.start; 104cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 105cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 106cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 107cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines } 108cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 109cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines return false; 110cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines} 111