Implement review feedback. No functionality change.
[oota-llvm.git] / lib / CodeGen / LowerSubregs.cpp
1 //===-- LowerSubregs.cpp - Subregister Lowering instruction pass ----------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file was developed by Christopher Lamb and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #define DEBUG_TYPE "lowersubregs"
11 #include "llvm/CodeGen/Passes.h"
12 #include "llvm/Function.h"
13 #include "llvm/CodeGen/MachineFunctionPass.h"
14 #include "llvm/CodeGen/MachineInstr.h"
15 #include "llvm/CodeGen/SSARegMap.h"
16 #include "llvm/Target/MRegisterInfo.h"
17 #include "llvm/Target/TargetInstrInfo.h"
18 #include "llvm/Target/TargetMachine.h"
19 #include "llvm/Support/Debug.h"
20 #include "llvm/Support/Compiler.h"
21 using namespace llvm;
22
23 namespace {
24   struct VISIBILITY_HIDDEN LowerSubregsInstructionPass
25    : public MachineFunctionPass {
26     static char ID; // Pass identification, replacement for typeid
27     LowerSubregsInstructionPass() : MachineFunctionPass((intptr_t)&ID) {}
28     
29     const char *getPassName() const {
30       return "Subregister lowering instruction pass";
31     }
32
33     /// runOnMachineFunction - pass entry point
34     bool runOnMachineFunction(MachineFunction&);
35     
36     bool LowerExtract(MachineInstr *MI);
37     bool LowerInsert(MachineInstr *MI);
38   };
39
40   char LowerSubregsInstructionPass::ID = 0;
41 }
42
43 FunctionPass *llvm::createLowerSubregsPass() { 
44   return new LowerSubregsInstructionPass(); 
45 }
46
47 // Returns the Register Class of a physical register.
48 static const TargetRegisterClass *getPhysicalRegisterRegClass(
49         const MRegisterInfo &MRI,
50         unsigned reg) {
51   assert(MRegisterInfo::isPhysicalRegister(reg) &&
52          "reg must be a physical register");
53   // Pick the register class of the right type that contains this physreg.
54   for (MRegisterInfo::regclass_iterator I = MRI.regclass_begin(),
55          E = MRI.regclass_end(); I != E; ++I)
56     if ((*I)->contains(reg))
57       return *I;
58   assert(false && "Couldn't find the register class");
59   return 0;
60 }
61
62 static bool isSubRegOf(const MRegisterInfo &MRI,
63                        unsigned SubReg,
64                        unsigned SupReg) {
65   const TargetRegisterDesc &RD = MRI[SubReg];
66   for (const unsigned *reg = RD.SuperRegs; *reg != 0; ++reg)
67     if (*reg == SupReg)
68       return true;
69       
70   return false;
71 }
72
73 bool LowerSubregsInstructionPass::LowerExtract(MachineInstr *MI) {
74    MachineBasicBlock *MBB = MI->getParent();
75    MachineFunction &MF = *MBB->getParent();
76    const MRegisterInfo &MRI = *MF.getTarget().getRegisterInfo();
77    
78    assert(MI->getOperand(0).isRegister() && MI->getOperand(0).isDef() &&
79           MI->getOperand(1).isRegister() && MI->getOperand(1).isUse() &&
80           MI->getOperand(2).isImm() && "Malformed extract_subreg");
81
82    unsigned SuperReg = MI->getOperand(1).getReg();
83    unsigned SubIdx = MI->getOperand(2).getImm();
84
85    assert(MRegisterInfo::isPhysicalRegister(SuperReg) &&
86           "Extract supperg source must be a physical register");
87    unsigned SrcReg = MRI.getSubReg(SuperReg, SubIdx);
88    unsigned DstReg = MI->getOperand(0).getReg();
89
90    DOUT << "subreg: CONVERTING: " << *MI;
91
92    if (SrcReg != DstReg) {
93      const TargetRegisterClass *TRC = 0;
94      if (MRegisterInfo::isPhysicalRegister(DstReg)) {
95        TRC = getPhysicalRegisterRegClass(MRI, DstReg);
96      } else {
97        TRC = MF.getSSARegMap()->getRegClass(DstReg);
98      }
99      assert(TRC == getPhysicalRegisterRegClass(MRI, SrcReg) &&
100              "Extract subreg and Dst must be of same register class");
101
102      MRI.copyRegToReg(*MBB, MI, DstReg, SrcReg, TRC);
103      MachineBasicBlock::iterator dMI = MI;
104      DOUT << "subreg: " << *(--dMI);
105    }
106
107    DOUT << "\n";
108    MBB->erase(MI);
109    return true;
110 }
111
112
113 bool LowerSubregsInstructionPass::LowerInsert(MachineInstr *MI) {
114   MachineBasicBlock *MBB = MI->getParent();
115   MachineFunction &MF = *MBB->getParent();
116   const MRegisterInfo &MRI = *MF.getTarget().getRegisterInfo(); 
117   unsigned DstReg = 0;
118   unsigned SrcReg = 0;
119   unsigned InsReg = 0;
120   unsigned SubIdx = 0;
121
122   // If only have 3 operands, then the source superreg is undef
123   // and we can supress the copy from the undef value
124   if (MI->getNumOperands() == 3) {
125     assert((MI->getOperand(0).isRegister() && MI->getOperand(0).isDef()) &&
126            (MI->getOperand(1).isRegister() && MI->getOperand(1).isUse()) &&
127             MI->getOperand(2).isImm() && "Invalid extract_subreg");
128     DstReg = MI->getOperand(0).getReg();
129     SrcReg = DstReg;
130     InsReg = MI->getOperand(1).getReg();
131     SubIdx = MI->getOperand(2).getImm();
132   } else if (MI->getNumOperands() == 4) {
133     assert((MI->getOperand(0).isRegister() && MI->getOperand(0).isDef()) &&
134            (MI->getOperand(1).isRegister() && MI->getOperand(1).isUse()) &&
135            (MI->getOperand(2).isRegister() && MI->getOperand(2).isUse()) &&
136             MI->getOperand(3).isImm() && "Invalid extract_subreg");
137     DstReg = MI->getOperand(0).getReg();
138     SrcReg = MI->getOperand(1).getReg();
139     InsReg = MI->getOperand(2).getReg();
140     SubIdx = MI->getOperand(3).getImm();     
141   } else 
142     assert(0 && "Malformed extract_subreg");
143
144   assert(SubIdx != 0 && "Invalid index for extract_subreg");
145   unsigned DstSubReg = MRI.getSubReg(DstReg, SubIdx);
146
147   assert(MRegisterInfo::isPhysicalRegister(SrcReg) &&
148          "Insert superreg source must be in a physical register");
149   assert(MRegisterInfo::isPhysicalRegister(DstReg) &&
150          "Insert destination must be in a physical register");
151   assert(MRegisterInfo::isPhysicalRegister(InsReg) &&
152          "Inserted value must be in a physical register");
153
154   DOUT << "subreg: CONVERTING: " << *MI;
155        
156   // If the inserted register is already allocated into a subregister
157   // of the destination, we copy the subreg into the source
158   // However, this is only safe if the insert instruction is the kill
159   // of the source register
160   bool revCopyOrder = isSubRegOf(MRI, InsReg, DstReg);    
161   if (revCopyOrder) {
162     if (MI->getOperand(1).isKill()) {
163       DstSubReg = MRI.getSubReg(SrcReg, SubIdx);
164       // Insert sub-register copy
165       const TargetRegisterClass *TRC1 = 0;
166       if (MRegisterInfo::isPhysicalRegister(InsReg)) {
167         TRC1 = getPhysicalRegisterRegClass(MRI, InsReg);
168       } else {
169         TRC1 = MF.getSSARegMap()->getRegClass(InsReg);
170       }
171     
172       MRI.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC1);
173       MachineBasicBlock::iterator dMI = MI;
174       DOUT << "subreg: " << *(--dMI);
175     } else {
176       assert(0 && "Don't know how to convert this insert");
177     }
178   }
179
180   if (SrcReg != DstReg) {
181     // Insert super-register copy
182     const TargetRegisterClass *TRC0 = 0;
183     if (MRegisterInfo::isPhysicalRegister(DstReg)) {
184       TRC0 = getPhysicalRegisterRegClass(MRI, DstReg);
185     } else {
186       TRC0 = MF.getSSARegMap()->getRegClass(DstReg);
187     }
188     assert(TRC0 == getPhysicalRegisterRegClass(MRI, SrcReg) &&
189             "Insert superreg and Dst must be of same register class");
190
191     MRI.copyRegToReg(*MBB, MI, DstReg, SrcReg, TRC0);
192     MachineBasicBlock::iterator dMI = MI;
193     DOUT << "subreg: " << *(--dMI);
194   }
195
196   if (!revCopyOrder && InsReg != DstSubReg) {
197     // Insert sub-register copy
198     const TargetRegisterClass *TRC1 = 0;
199     if (MRegisterInfo::isPhysicalRegister(InsReg)) {
200       TRC1 = getPhysicalRegisterRegClass(MRI, InsReg);
201     } else {
202       TRC1 = MF.getSSARegMap()->getRegClass(InsReg);
203     }
204   
205     MRI.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC1);
206     MachineBasicBlock::iterator dMI = MI;
207     DOUT << "subreg: " << *(--dMI);
208   }
209
210   DOUT << "\n";
211   MBB->erase(MI);
212   return true;                    
213 }
214
215 /// runOnMachineFunction - Reduce subregister inserts and extracts to register
216 /// copies.
217 ///
218 bool LowerSubregsInstructionPass::runOnMachineFunction(MachineFunction &MF) {
219   DOUT << "Machine Function\n";
220   
221   bool MadeChange = false;
222
223   DOUT << "********** LOWERING SUBREG INSTRS **********\n";
224   DOUT << "********** Function: " << MF.getFunction()->getName() << '\n';
225
226   for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
227        mbbi != mbbe; ++mbbi) {
228     for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
229          mi != me;) {
230       MachineInstr *MI = mi++;
231            
232       if (MI->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG) {
233         MadeChange |= LowerExtract(MI);
234       } else if (MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG) {
235         MadeChange |= LowerInsert(MI);
236       }
237     }
238   }
239
240   return MadeChange;
241 }