8945dd57b1851df2bb7d446f831a96044abce415
[oota-llvm.git] / lib / CodeGen / LowerSubregs.cpp
1 //===-- LowerSubregs.cpp - Subregister Lowering instruction pass ----------===//
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 #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/MachineRegisterInfo.h"
16 #include "llvm/Target/TargetRegisterInfo.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 bool LowerSubregsInstructionPass::LowerExtract(MachineInstr *MI) {
48    MachineBasicBlock *MBB = MI->getParent();
49    MachineFunction &MF = *MBB->getParent();
50    const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo();
51    const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
52    
53    assert(MI->getOperand(0).isRegister() && MI->getOperand(0).isDef() &&
54           MI->getOperand(1).isRegister() && MI->getOperand(1).isUse() &&
55           MI->getOperand(2).isImmediate() && "Malformed extract_subreg");
56
57    unsigned SuperReg = MI->getOperand(1).getReg();
58    unsigned SubIdx = MI->getOperand(2).getImm();
59
60    assert(TargetRegisterInfo::isPhysicalRegister(SuperReg) &&
61           "Extract supperg source must be a physical register");
62    unsigned SrcReg = TRI.getSubReg(SuperReg, SubIdx);
63    unsigned DstReg = MI->getOperand(0).getReg();
64
65    DOUT << "subreg: CONVERTING: " << *MI;
66
67    if (SrcReg != DstReg) {
68      const TargetRegisterClass *TRC = 0;
69      if (TargetRegisterInfo::isPhysicalRegister(DstReg)) {
70        TRC = TRI.getPhysicalRegisterRegClass(DstReg);
71      } else {
72        TRC = MF.getRegInfo().getRegClass(DstReg);
73      }
74      assert(TRC == TRI.getPhysicalRegisterRegClass(SrcReg) &&
75              "Extract subreg and Dst must be of same register class");
76
77      TII.copyRegToReg(*MBB, MI, DstReg, SrcReg, TRC, TRC);
78      MachineBasicBlock::iterator dMI = MI;
79      DOUT << "subreg: " << *(--dMI);
80    }
81
82    DOUT << "\n";
83    MBB->remove(MI);
84    return true;
85 }
86
87
88 bool LowerSubregsInstructionPass::LowerInsert(MachineInstr *MI) {
89   MachineBasicBlock *MBB = MI->getParent();
90   MachineFunction &MF = *MBB->getParent();
91   const TargetRegisterInfo &TRI = *MF.getTarget().getRegisterInfo(); 
92   const TargetInstrInfo &TII = *MF.getTarget().getInstrInfo();
93   assert((MI->getOperand(0).isRegister() && MI->getOperand(0).isDef()) &&
94          ((MI->getOperand(1).isRegister() && MI->getOperand(1).isUse()) || 
95             MI->getOperand(1).isImmediate()) &&
96          (MI->getOperand(2).isRegister() && MI->getOperand(2).isUse()) &&
97           MI->getOperand(3).isImmediate() && "Invalid insert_subreg");
98           
99   // Check if we're inserting into an implicit undef value.
100   bool isImplicit = MI->getOperand(1).isImmediate();
101   unsigned DstReg = MI->getOperand(0).getReg();
102   unsigned SrcReg = isImplicit ? DstReg : MI->getOperand(1).getReg();
103   unsigned InsReg = MI->getOperand(2).getReg();
104   unsigned SubIdx = MI->getOperand(3).getImm();     
105
106   assert(SubIdx != 0 && "Invalid index for extract_subreg");
107   unsigned DstSubReg = TRI.getSubReg(DstReg, SubIdx);
108
109   assert(TargetRegisterInfo::isPhysicalRegister(SrcReg) &&
110          "Insert superreg source must be in a physical register");
111   assert(TargetRegisterInfo::isPhysicalRegister(DstReg) &&
112          "Insert destination must be in a physical register");
113   assert(TargetRegisterInfo::isPhysicalRegister(InsReg) &&
114          "Inserted value must be in a physical register");
115
116   DOUT << "subreg: CONVERTING: " << *MI;
117        
118   // Check whether the implict subreg copy has side affects or not. Only copies
119   // into an undef value have no side affects, that is they can be eliminated
120   // without changing the semantics of the program.
121   bool copyHasSideAffects = isImplicit? 
122                   MI->getOperand(1).getImm() != TargetInstrInfo::IMPL_VAL_UNDEF
123                   : false; 
124        
125   // If the inserted register is already allocated into a subregister
126   // of the destination, we copy the subreg into the source
127   // However, this is only safe if the insert instruction is the kill
128   // of the source register
129   bool revCopyOrder = TRI.isSubRegister(DstReg, InsReg);
130   if (revCopyOrder && (InsReg != DstSubReg || copyHasSideAffects)) {
131     if (isImplicit || MI->getOperand(1).isKill()) {
132       DstSubReg = TRI.getSubReg(SrcReg, SubIdx);
133       // Insert sub-register copy
134       const TargetRegisterClass *TRC1 = 0;
135       if (TargetRegisterInfo::isPhysicalRegister(InsReg)) {
136         TRC1 = TRI.getPhysicalRegisterRegClass(InsReg);
137       } else {
138         TRC1 = MF.getRegInfo().getRegClass(InsReg);
139       }
140       TII.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC1, TRC1);
141
142 #ifndef NDEBUG
143       MachineBasicBlock::iterator dMI = MI;
144       DOUT << "subreg: " << *(--dMI);
145 #endif
146     } else {
147       assert(0 && "Don't know how to convert this insert");
148     }
149   }
150 #ifndef NDEBUG
151   if (InsReg == DstSubReg && !copyHasSideAffects) {
152      DOUT << "subreg: Eliminated subreg copy\n";
153   }
154 #endif
155
156   if (SrcReg != DstReg) {
157     // Insert super-register copy
158     const TargetRegisterClass *TRC0 = 0;
159     if (TargetRegisterInfo::isPhysicalRegister(DstReg)) {
160       TRC0 = TRI.getPhysicalRegisterRegClass(DstReg);
161     } else {
162       TRC0 = MF.getRegInfo().getRegClass(DstReg);
163     }
164     assert(TRC0 == TRI.getPhysicalRegisterRegClass(SrcReg) &&
165             "Insert superreg and Dst must be of same register class");
166
167     TII.copyRegToReg(*MBB, MI, DstReg, SrcReg, TRC0, TRC0);
168
169 #ifndef NDEBUG
170     MachineBasicBlock::iterator dMI = MI;
171     DOUT << "subreg: " << *(--dMI);
172 #endif
173   }
174   
175 #ifndef NDEBUG
176   if (SrcReg == DstReg) {
177      DOUT << "subreg: Eliminated superreg copy\n";
178   }
179 #endif
180
181   if (!revCopyOrder && (InsReg != DstSubReg || copyHasSideAffects)) {
182     // Insert sub-register copy
183     const TargetRegisterClass *TRC1 = 0;
184     if (TargetRegisterInfo::isPhysicalRegister(InsReg)) {
185       TRC1 = TRI.getPhysicalRegisterRegClass(InsReg);
186     } else {
187       TRC1 = MF.getRegInfo().getRegClass(InsReg);
188     }
189     TII.copyRegToReg(*MBB, MI, DstSubReg, InsReg, TRC1, TRC1);
190
191 #ifndef NDEBUG
192     MachineBasicBlock::iterator dMI = MI;
193     DOUT << "subreg: " << *(--dMI);
194 #endif
195   }
196
197   DOUT << "\n";
198   MBB->remove(MI);
199   return true;                    
200 }
201
202 /// runOnMachineFunction - Reduce subregister inserts and extracts to register
203 /// copies.
204 ///
205 bool LowerSubregsInstructionPass::runOnMachineFunction(MachineFunction &MF) {
206   DOUT << "Machine Function\n";
207   
208   bool MadeChange = false;
209
210   DOUT << "********** LOWERING SUBREG INSTRS **********\n";
211   DOUT << "********** Function: " << MF.getFunction()->getName() << '\n';
212
213   for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
214        mbbi != mbbe; ++mbbi) {
215     for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
216          mi != me;) {
217       MachineInstr *MI = mi++;
218            
219       if (MI->getOpcode() == TargetInstrInfo::EXTRACT_SUBREG) {
220         MadeChange |= LowerExtract(MI);
221       } else if (MI->getOpcode() == TargetInstrInfo::INSERT_SUBREG) {
222         MadeChange |= LowerInsert(MI);
223       }
224     }
225   }
226
227   return MadeChange;
228 }