RegisterCoalescer.cpp revision 5c00e077952d14899c3fc26709c7b2dfd36d0209
1//===- RegisterCoalescer.cpp - Generic Register Coalescing Interface -------==//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the generic RegisterCoalescer interface which
11// is used as the common interface used by all clients and
12// implementations of register coalescing.
13//
14//===----------------------------------------------------------------------===//
15
16#include "llvm/CodeGen/RegisterCoalescer.h"
17#include "llvm/CodeGen/LiveIntervalAnalysis.h"
18#include "llvm/CodeGen/MachineInstr.h"
19#include "llvm/CodeGen/MachineRegisterInfo.h"
20#include "llvm/Target/TargetInstrInfo.h"
21#include "llvm/Target/TargetRegisterInfo.h"
22#include "llvm/Pass.h"
23
24using namespace llvm;
25
26// Register the RegisterCoalescer interface, providing a nice name to refer to.
27static RegisterAnalysisGroup<RegisterCoalescer> Z("Register Coalescer");
28char RegisterCoalescer::ID = 0;
29
30// RegisterCoalescer destructor: DO NOT move this to the header file
31// for RegisterCoalescer or else clients of the RegisterCoalescer
32// class may not depend on the RegisterCoalescer.o file in the current
33// .a file, causing alias analysis support to not be included in the
34// tool correctly!
35//
36RegisterCoalescer::~RegisterCoalescer() {}
37
38unsigned CoalescerPair::compose(unsigned a, unsigned b) const {
39  if (!a) return b;
40  if (!b) return a;
41  return tri_.composeSubRegIndices(a, b);
42}
43
44bool CoalescerPair::isMoveInstr(const MachineInstr *MI,
45                                unsigned &Src, unsigned &Dst,
46                                unsigned &SrcSub, unsigned &DstSub) const {
47  if (MI->isCopy()) {
48    Dst = MI->getOperand(0).getReg();
49    DstSub = MI->getOperand(0).getSubReg();
50    Src = MI->getOperand(1).getReg();
51    SrcSub = MI->getOperand(1).getSubReg();
52  } else if (MI->isExtractSubreg()) {
53    Dst = MI->getOperand(0).getReg();
54    DstSub = MI->getOperand(0).getSubReg();
55    Src = MI->getOperand(1).getReg();
56    SrcSub = compose(MI->getOperand(1).getSubReg(), MI->getOperand(2).getImm());
57  } else if (MI->isSubregToReg()) {
58    Dst = MI->getOperand(0).getReg();
59    DstSub = compose(MI->getOperand(0).getSubReg(), MI->getOperand(3).getImm());
60    Src = MI->getOperand(2).getReg();
61    SrcSub = MI->getOperand(2).getSubReg();
62  } else if (!tii_.isMoveInstr(*MI, Src, Dst, SrcSub, DstSub)) {
63    return false;
64  }
65  return true;
66}
67
68bool CoalescerPair::setRegisters(const MachineInstr *MI) {
69  srcReg_ = dstReg_ = subIdx_ = 0;
70  newRC_ = 0;
71  flipped_ = crossClass_ = false;
72
73  unsigned Src, Dst, SrcSub, DstSub;
74  if (!isMoveInstr(MI, Src, Dst, SrcSub, DstSub))
75    return false;
76  partial_ = SrcSub || DstSub;
77
78  // If one register is a physreg, it must be Dst.
79  if (TargetRegisterInfo::isPhysicalRegister(Src)) {
80    if (TargetRegisterInfo::isPhysicalRegister(Dst))
81      return false;
82    std::swap(Src, Dst);
83    std::swap(SrcSub, DstSub);
84    flipped_ = true;
85  }
86
87  const MachineRegisterInfo &MRI = MI->getParent()->getParent()->getRegInfo();
88
89  if (TargetRegisterInfo::isPhysicalRegister(Dst)) {
90    // Eliminate DstSub on a physreg.
91    if (DstSub) {
92      Dst = tri_.getSubReg(Dst, DstSub);
93      if (!Dst) return false;
94      DstSub = 0;
95    }
96
97    // Eliminate SrcSub by picking a corresponding Dst superregister.
98    if (SrcSub) {
99      Dst = tri_.getMatchingSuperReg(Dst, SrcSub, MRI.getRegClass(Src));
100      if (!Dst) return false;
101      SrcSub = 0;
102    } else if (!MRI.getRegClass(Src)->contains(Dst)) {
103      return false;
104    }
105  } else {
106    // Both registers are virtual.
107
108    // Both registers have subreg indices.
109    if (SrcSub && DstSub) {
110      // For now we only handle the case of identical indices in commensurate
111      // registers: Dreg:ssub_1 + Dreg:ssub_1 -> Dreg
112      // FIXME: Handle Qreg:ssub_3 + Dreg:ssub_1 as QReg:dsub_1 + Dreg.
113      if (SrcSub != DstSub)
114        return false;
115      const TargetRegisterClass *SrcRC = MRI.getRegClass(Src);
116      const TargetRegisterClass *DstRC = MRI.getRegClass(Dst);
117      if (!getCommonSubClass(DstRC, SrcRC))
118        return false;
119      SrcSub = DstSub = 0;
120    }
121
122    // There can be no SrcSub.
123    if (SrcSub) {
124      std::swap(Src, Dst);
125      DstSub = SrcSub;
126      SrcSub = 0;
127      assert(!flipped_ && "Unexpected flip");
128      flipped_ = true;
129    }
130
131    // Find the new register class.
132    const TargetRegisterClass *SrcRC = MRI.getRegClass(Src);
133    const TargetRegisterClass *DstRC = MRI.getRegClass(Dst);
134    if (DstSub)
135      newRC_ = tri_.getMatchingSuperRegClass(DstRC, SrcRC, DstSub);
136    else
137      newRC_ = getCommonSubClass(DstRC, SrcRC);
138    if (!newRC_)
139      return false;
140    crossClass_ = newRC_ != DstRC || newRC_ != SrcRC;
141  }
142  // Check our invariants
143  assert(TargetRegisterInfo::isVirtualRegister(Src) && "Src must be virtual");
144  assert(!(TargetRegisterInfo::isPhysicalRegister(Dst) && DstSub) &&
145         "Cannot have a physical SubIdx");
146  srcReg_ = Src;
147  dstReg_ = Dst;
148  subIdx_ = DstSub;
149  return true;
150}
151
152bool CoalescerPair::flip() {
153  if (subIdx_ || TargetRegisterInfo::isPhysicalRegister(dstReg_))
154    return false;
155  std::swap(srcReg_, dstReg_);
156  flipped_ = !flipped_;
157  return true;
158}
159
160bool CoalescerPair::isCoalescable(const MachineInstr *MI) const {
161  if (!MI)
162    return false;
163  unsigned Src, Dst, SrcSub, DstSub;
164  if (!isMoveInstr(MI, Src, Dst, SrcSub, DstSub))
165    return false;
166
167  // Find the virtual register that is srcReg_.
168  if (Dst == srcReg_) {
169    std::swap(Src, Dst);
170    std::swap(SrcSub, DstSub);
171  } else if (Src != srcReg_) {
172    return false;
173  }
174
175  // Now check that Dst matches dstReg_.
176  if (TargetRegisterInfo::isPhysicalRegister(dstReg_)) {
177    if (!TargetRegisterInfo::isPhysicalRegister(Dst))
178      return false;
179    assert(!subIdx_ && "Inconsistent CoalescerPair state.");
180    // DstSub could be set for a physreg from INSERT_SUBREG.
181    if (DstSub)
182      Dst = tri_.getSubReg(Dst, DstSub);
183    // Full copy of Src.
184    if (!SrcSub)
185      return dstReg_ == Dst;
186    // This is a partial register copy. Check that the parts match.
187    return tri_.getSubReg(dstReg_, SrcSub) == Dst;
188  } else {
189    // dstReg_ is virtual.
190    if (dstReg_ != Dst)
191      return false;
192    // Registers match, do the subregisters line up?
193    return compose(subIdx_, SrcSub) == DstSub;
194  }
195}
196
197// Because of the way .a files work, we must force the SimpleRC
198// implementation to be pulled in if the RegisterCoalescer classes are
199// pulled in.  Otherwise we run the risk of RegisterCoalescer being
200// used, but the default implementation not being linked into the tool
201// that uses it.
202DEFINING_FILE_FOR(RegisterCoalescer)
203