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