Mercurial > hg > CbC > CbC_llvm
comparison lib/CodeGen/RenameIndependentSubregs.cpp @ 134:3a76565eade5 LLVM5.0.1
update 5.0.1
author | mir3636 |
---|---|
date | Sat, 17 Feb 2018 09:57:20 +0900 |
parents | 803732b1fca8 |
children | c2174574ed3a |
comparison
equal
deleted
inserted
replaced
133:c60214abe0e8 | 134:3a76565eade5 |
---|---|
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 /// Rename independent subregisters looks for virtual registers with | 10 /// Rename independent subregisters looks for virtual registers with |
11 /// independently used subregisters and renames them to new virtual registers. | 11 /// independently used subregisters and renames them to new virtual registers. |
12 /// Example: In the following: | 12 /// Example: In the following: |
13 /// %vreg0:sub0<read-undef> = ... | 13 /// %0:sub0<read-undef> = ... |
14 /// %vreg0:sub1 = ... | 14 /// %0:sub1 = ... |
15 /// use %vreg0:sub0 | 15 /// use %0:sub0 |
16 /// %vreg0:sub0 = ... | 16 /// %0:sub0 = ... |
17 /// use %vreg0:sub0 | 17 /// use %0:sub0 |
18 /// use %vreg0:sub1 | 18 /// use %0:sub1 |
19 /// sub0 and sub1 are never used together, and we have two independent sub0 | 19 /// sub0 and sub1 are never used together, and we have two independent sub0 |
20 /// definitions. This pass will rename to: | 20 /// definitions. This pass will rename to: |
21 /// %vreg0:sub0<read-undef> = ... | 21 /// %0:sub0<read-undef> = ... |
22 /// %vreg1:sub1<read-undef> = ... | 22 /// %1:sub1<read-undef> = ... |
23 /// use %vreg1:sub1 | 23 /// use %1:sub1 |
24 /// %vreg2:sub1<read-undef> = ... | 24 /// %2:sub1<read-undef> = ... |
25 /// use %vreg2:sub1 | 25 /// use %2:sub1 |
26 /// use %vreg0:sub0 | 26 /// use %0:sub0 |
27 // | 27 // |
28 //===----------------------------------------------------------------------===// | 28 //===----------------------------------------------------------------------===// |
29 | 29 |
30 #include "LiveRangeUtils.h" | 30 #include "LiveRangeUtils.h" |
31 #include "PHIEliminationUtils.h" | 31 #include "PHIEliminationUtils.h" |
32 #include "llvm/CodeGen/LiveInterval.h" | 32 #include "llvm/CodeGen/LiveInterval.h" |
33 #include "llvm/CodeGen/LiveIntervalAnalysis.h" | 33 #include "llvm/CodeGen/LiveIntervals.h" |
34 #include "llvm/CodeGen/MachineFunctionPass.h" | 34 #include "llvm/CodeGen/MachineFunctionPass.h" |
35 #include "llvm/CodeGen/MachineInstrBuilder.h" | 35 #include "llvm/CodeGen/MachineInstrBuilder.h" |
36 #include "llvm/CodeGen/MachineRegisterInfo.h" | 36 #include "llvm/CodeGen/MachineRegisterInfo.h" |
37 #include "llvm/CodeGen/Passes.h" | 37 #include "llvm/CodeGen/Passes.h" |
38 #include "llvm/Target/TargetInstrInfo.h" | 38 #include "llvm/CodeGen/TargetInstrInfo.h" |
39 | 39 |
40 using namespace llvm; | 40 using namespace llvm; |
41 | 41 |
42 #define DEBUG_TYPE "rename-independent-subregs" | 42 #define DEBUG_TYPE "rename-independent-subregs" |
43 | 43 |
132 // Create a new VReg for each class. | 132 // Create a new VReg for each class. |
133 unsigned Reg = LI.reg; | 133 unsigned Reg = LI.reg; |
134 const TargetRegisterClass *RegClass = MRI->getRegClass(Reg); | 134 const TargetRegisterClass *RegClass = MRI->getRegClass(Reg); |
135 SmallVector<LiveInterval*, 4> Intervals; | 135 SmallVector<LiveInterval*, 4> Intervals; |
136 Intervals.push_back(&LI); | 136 Intervals.push_back(&LI); |
137 DEBUG(dbgs() << PrintReg(Reg) << ": Found " << Classes.getNumClasses() | 137 DEBUG(dbgs() << printReg(Reg) << ": Found " << Classes.getNumClasses() |
138 << " equivalence classes.\n"); | 138 << " equivalence classes.\n"); |
139 DEBUG(dbgs() << PrintReg(Reg) << ": Splitting into newly created:"); | 139 DEBUG(dbgs() << printReg(Reg) << ": Splitting into newly created:"); |
140 for (unsigned I = 1, NumClasses = Classes.getNumClasses(); I < NumClasses; | 140 for (unsigned I = 1, NumClasses = Classes.getNumClasses(); I < NumClasses; |
141 ++I) { | 141 ++I) { |
142 unsigned NewVReg = MRI->createVirtualRegister(RegClass); | 142 unsigned NewVReg = MRI->createVirtualRegister(RegClass); |
143 LiveInterval &NewLI = LIS->createEmptyInterval(NewVReg); | 143 LiveInterval &NewLI = LIS->createEmptyInterval(NewVReg); |
144 Intervals.push_back(&NewLI); | 144 Intervals.push_back(&NewLI); |
145 DEBUG(dbgs() << ' ' << PrintReg(NewVReg)); | 145 DEBUG(dbgs() << ' ' << printReg(NewVReg)); |
146 } | 146 } |
147 DEBUG(dbgs() << '\n'); | 147 DEBUG(dbgs() << '\n'); |
148 | 148 |
149 rewriteOperands(Classes, SubRangeInfos, Intervals); | 149 rewriteOperands(Classes, SubRangeInfos, Intervals); |
150 distribute(Classes, SubRangeInfos, Intervals); | 150 distribute(Classes, SubRangeInfos, Intervals); |