blob: 3bbda1c2e609a41a5f8f34f37648940fdba1eb34 [file] [log] [blame]
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +00001//===--- LiveRangeEdit.cpp - Basic tools for editing a register live range --===//
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// The LiveRangeEdit class represents changes done to a virtual register when it
11// is spilled or split.
12//===----------------------------------------------------------------------===//
13
14#include "LiveRangeEdit.h"
15#include "VirtRegMap.h"
16#include "llvm/CodeGen/LiveIntervalAnalysis.h"
17#include "llvm/CodeGen/MachineRegisterInfo.h"
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +000018#include "llvm/Target/TargetInstrInfo.h"
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000019
20using namespace llvm;
21
22LiveInterval &LiveRangeEdit::create(MachineRegisterInfo &mri,
23 LiveIntervals &lis,
24 VirtRegMap &vrm) {
Jakob Stoklund Olesene324f6e2011-02-18 22:35:20 +000025 const TargetRegisterClass *RC = mri.getRegClass(getReg());
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000026 unsigned VReg = mri.createVirtualRegister(RC);
27 vrm.grow();
Jakob Stoklund Olesenfd389172011-02-19 00:38:43 +000028 vrm.setIsSplitFromReg(VReg, vrm.getOriginal(getReg()));
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000029 LiveInterval &li = lis.getOrCreateInterval(VReg);
30 newRegs_.push_back(&li);
31 return li;
32}
33
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +000034void LiveRangeEdit::scanRemattable(LiveIntervals &lis,
35 const TargetInstrInfo &tii,
36 AliasAnalysis *aa) {
37 for (LiveInterval::vni_iterator I = parent_.vni_begin(),
38 E = parent_.vni_end(); I != E; ++I) {
39 VNInfo *VNI = *I;
40 if (VNI->isUnused())
41 continue;
42 MachineInstr *DefMI = lis.getInstructionFromIndex(VNI->def);
43 if (!DefMI)
44 continue;
45 if (tii.isTriviallyReMaterializable(DefMI, aa))
46 remattable_.insert(VNI);
47 }
48 scannedRemattable_ = true;
49}
50
51bool LiveRangeEdit::anyRematerializable(LiveIntervals &lis,
52 const TargetInstrInfo &tii,
53 AliasAnalysis *aa) {
54 if (!scannedRemattable_)
55 scanRemattable(lis, tii, aa);
56 return !remattable_.empty();
57}
58
Jakob Stoklund Olesena17768f2010-10-14 23:49:52 +000059/// allUsesAvailableAt - Return true if all registers used by OrigMI at
60/// OrigIdx are also available with the same value at UseIdx.
61bool LiveRangeEdit::allUsesAvailableAt(const MachineInstr *OrigMI,
62 SlotIndex OrigIdx,
63 SlotIndex UseIdx,
64 LiveIntervals &lis) {
65 OrigIdx = OrigIdx.getUseIndex();
66 UseIdx = UseIdx.getUseIndex();
67 for (unsigned i = 0, e = OrigMI->getNumOperands(); i != e; ++i) {
68 const MachineOperand &MO = OrigMI->getOperand(i);
69 if (!MO.isReg() || !MO.getReg() || MO.getReg() == getReg())
70 continue;
71 // Reserved registers are OK.
72 if (MO.isUndef() || !lis.hasInterval(MO.getReg()))
73 continue;
74 // We don't want to move any defs.
75 if (MO.isDef())
76 return false;
77 // We cannot depend on virtual registers in uselessRegs_.
78 for (unsigned ui = 0, ue = uselessRegs_.size(); ui != ue; ++ui)
79 if (uselessRegs_[ui]->reg == MO.getReg())
80 return false;
81
82 LiveInterval &li = lis.getInterval(MO.getReg());
83 const VNInfo *OVNI = li.getVNInfoAt(OrigIdx);
84 if (!OVNI)
85 continue;
86 if (OVNI != li.getVNInfoAt(UseIdx))
87 return false;
88 }
89 return true;
90}
91
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +000092bool LiveRangeEdit::canRematerializeAt(Remat &RM,
93 SlotIndex UseIdx,
94 bool cheapAsAMove,
95 LiveIntervals &lis) {
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +000096 assert(scannedRemattable_ && "Call anyRematerializable first");
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +000097
98 // Use scanRemattable info.
99 if (!remattable_.count(RM.ParentVNI))
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +0000100 return false;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000101
102 // No defining instruction.
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +0000103 RM.OrigMI = lis.getInstructionFromIndex(RM.ParentVNI->def);
104 assert(RM.OrigMI && "Defining instruction for remattable value disappeared");
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000105
106 // If only cheap remats were requested, bail out early.
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +0000107 if (cheapAsAMove && !RM.OrigMI->getDesc().isAsCheapAsAMove())
108 return false;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000109
110 // Verify that all used registers are available with the same values.
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +0000111 if (!allUsesAvailableAt(RM.OrigMI, RM.ParentVNI->def, UseIdx, lis))
112 return false;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000113
Jakob Stoklund Olesenb80e9732010-11-10 01:05:12 +0000114 return true;
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000115}
116
117SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
118 MachineBasicBlock::iterator MI,
119 unsigned DestReg,
120 const Remat &RM,
121 LiveIntervals &lis,
122 const TargetInstrInfo &tii,
123 const TargetRegisterInfo &tri) {
124 assert(RM.OrigMI && "Invalid remat");
125 tii.reMaterialize(MBB, MI, DestReg, 0, RM.OrigMI, tri);
Jakob Stoklund Olesenf1583ae2010-10-20 22:50:42 +0000126 rematted_.insert(RM.ParentVNI);
Jakob Stoklund Olesen080c3162010-10-20 22:00:51 +0000127 return lis.InsertMachineInstrInMaps(--MI).getDefIndex();
128}
129