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