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