CommuteChangesDestination() should check if to-be-commuted instruction defines any...
[oota-llvm.git] / lib / CodeGen / TargetInstrInfoImpl.cpp
1 //===-- TargetInstrInfoImpl.cpp - Target Instruction Information ----------===//
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 TargetInstrInfoImpl class, it just provides default
11 // implementations of various methods.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "llvm/Target/TargetInstrInfo.h"
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/CodeGen/MachineFrameInfo.h"
18 #include "llvm/CodeGen/MachineInstr.h"
19 #include "llvm/CodeGen/MachineInstrBuilder.h"
20 #include "llvm/CodeGen/PseudoSourceValue.h"
21 using namespace llvm;
22
23 // commuteInstruction - The default implementation of this method just exchanges
24 // operand 1 and 2.
25 MachineInstr *TargetInstrInfoImpl::commuteInstruction(MachineInstr *MI,
26                                                       bool NewMI) const {
27   const TargetInstrDesc &TID = MI->getDesc();
28   bool HasDef = TID.getNumDefs();
29   unsigned Idx1 = HasDef ? 1 : 0;
30   unsigned Idx2 = HasDef ? 2 : 1;
31
32   assert(MI->getOperand(Idx1).isReg() && MI->getOperand(Idx2).isReg() &&
33          "This only knows how to commute register operands so far");
34   unsigned Reg1 = MI->getOperand(Idx1).getReg();
35   unsigned Reg2 = MI->getOperand(Idx2).getReg();
36   bool Reg1IsKill = MI->getOperand(Idx1).isKill();
37   bool Reg2IsKill = MI->getOperand(Idx2).isKill();
38   bool ChangeReg0 = false;
39   if (HasDef && MI->getOperand(0).getReg() == Reg1) {
40     // Must be two address instruction!
41     assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
42            "Expecting a two-address instruction!");
43     Reg2IsKill = false;
44     ChangeReg0 = true;
45   }
46
47   if (NewMI) {
48     // Create a new instruction.
49     unsigned Reg0 = HasDef
50       ? (ChangeReg0 ? Reg2 : MI->getOperand(0).getReg()) : 0;
51     bool Reg0IsDead = HasDef ? MI->getOperand(0).isDead() : false;
52     MachineFunction &MF = *MI->getParent()->getParent();
53     if (HasDef)
54       return BuildMI(MF, MI->getDebugLoc(), MI->getDesc())
55         .addReg(Reg0, RegState::Define | getDeadRegState(Reg0IsDead))
56         .addReg(Reg2, getKillRegState(Reg2IsKill))
57         .addReg(Reg1, getKillRegState(Reg2IsKill));
58     else
59       return BuildMI(MF, MI->getDebugLoc(), MI->getDesc())
60         .addReg(Reg2, getKillRegState(Reg2IsKill))
61         .addReg(Reg1, getKillRegState(Reg2IsKill));
62   }
63
64   if (ChangeReg0)
65     MI->getOperand(0).setReg(Reg2);
66   MI->getOperand(Idx2).setReg(Reg1);
67   MI->getOperand(Idx1).setReg(Reg2);
68   MI->getOperand(Idx2).setIsKill(Reg1IsKill);
69   MI->getOperand(Idx1).setIsKill(Reg2IsKill);
70   return MI;
71 }
72
73 /// CommuteChangesDestination - Return true if commuting the specified
74 /// instruction will also changes the destination operand. Also return the
75 /// current operand index of the would be new destination register by
76 /// reference. This can happen when the commutable instruction is also a
77 /// two-address instruction.
78 bool TargetInstrInfoImpl::CommuteChangesDestination(MachineInstr *MI,
79                                                     unsigned &OpIdx) const{
80   const TargetInstrDesc &TID = MI->getDesc();
81   if (!TID.getNumDefs())
82     return false;
83   assert(MI->getOperand(1).isReg() && MI->getOperand(2).isReg() &&
84          "This only knows how to commute register operands so far");
85   if (MI->getOperand(0).getReg() == MI->getOperand(1).getReg()) {
86     // Must be two address instruction!
87     assert(MI->getDesc().getOperandConstraint(0, TOI::TIED_TO) &&
88            "Expecting a two-address instruction!");
89     OpIdx = 2;
90     return true;
91   }
92   return false;
93 }
94
95
96 bool TargetInstrInfoImpl::PredicateInstruction(MachineInstr *MI,
97                             const SmallVectorImpl<MachineOperand> &Pred) const {
98   bool MadeChange = false;
99   const TargetInstrDesc &TID = MI->getDesc();
100   if (!TID.isPredicable())
101     return false;
102   
103   for (unsigned j = 0, i = 0, e = MI->getNumOperands(); i != e; ++i) {
104     if (TID.OpInfo[i].isPredicate()) {
105       MachineOperand &MO = MI->getOperand(i);
106       if (MO.isReg()) {
107         MO.setReg(Pred[j].getReg());
108         MadeChange = true;
109       } else if (MO.isImm()) {
110         MO.setImm(Pred[j].getImm());
111         MadeChange = true;
112       } else if (MO.isMBB()) {
113         MO.setMBB(Pred[j].getMBB());
114         MadeChange = true;
115       }
116       ++j;
117     }
118   }
119   return MadeChange;
120 }
121
122 void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
123                                         MachineBasicBlock::iterator I,
124                                         unsigned DestReg,
125                                         const MachineInstr *Orig) const {
126   MachineInstr *MI = MBB.getParent()->CloneMachineInstr(Orig);
127   MI->getOperand(0).setReg(DestReg);
128   MBB.insert(I, MI);
129 }
130
131 unsigned
132 TargetInstrInfoImpl::GetFunctionSizeInBytes(const MachineFunction &MF) const {
133   unsigned FnSize = 0;
134   for (MachineFunction::const_iterator MBBI = MF.begin(), E = MF.end();
135        MBBI != E; ++MBBI) {
136     const MachineBasicBlock &MBB = *MBBI;
137     for (MachineBasicBlock::const_iterator I = MBB.begin(),E = MBB.end();
138          I != E; ++I)
139       FnSize += GetInstSizeInBytes(I);
140   }
141   return FnSize;
142 }
143
144 /// foldMemoryOperand - Attempt to fold a load or store of the specified stack
145 /// slot into the specified machine instruction for the specified operand(s).
146 /// If this is possible, a new instruction is returned with the specified
147 /// operand folded, otherwise NULL is returned. The client is responsible for
148 /// removing the old instruction and adding the new one in the instruction
149 /// stream.
150 MachineInstr*
151 TargetInstrInfo::foldMemoryOperand(MachineFunction &MF,
152                                    MachineInstr* MI,
153                                    const SmallVectorImpl<unsigned> &Ops,
154                                    int FrameIndex) const {
155   unsigned Flags = 0;
156   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
157     if (MI->getOperand(Ops[i]).isDef())
158       Flags |= MachineMemOperand::MOStore;
159     else
160       Flags |= MachineMemOperand::MOLoad;
161
162   // Ask the target to do the actual folding.
163   MachineInstr *NewMI = foldMemoryOperandImpl(MF, MI, Ops, FrameIndex);
164   if (!NewMI) return 0;
165
166   assert((!(Flags & MachineMemOperand::MOStore) ||
167           NewMI->getDesc().mayStore()) &&
168          "Folded a def to a non-store!");
169   assert((!(Flags & MachineMemOperand::MOLoad) ||
170           NewMI->getDesc().mayLoad()) &&
171          "Folded a use to a non-load!");
172   const MachineFrameInfo &MFI = *MF.getFrameInfo();
173   assert(MFI.getObjectOffset(FrameIndex) != -1);
174   MachineMemOperand MMO(PseudoSourceValue::getFixedStack(FrameIndex),
175                         Flags,
176                         MFI.getObjectOffset(FrameIndex),
177                         MFI.getObjectSize(FrameIndex),
178                         MFI.getObjectAlignment(FrameIndex));
179   NewMI->addMemOperand(MF, MMO);
180
181   return NewMI;
182 }
183
184 /// foldMemoryOperand - Same as the previous version except it allows folding
185 /// of any load and store from / to any address, not just from a specific
186 /// stack slot.
187 MachineInstr*
188 TargetInstrInfo::foldMemoryOperand(MachineFunction &MF,
189                                    MachineInstr* MI,
190                                    const SmallVectorImpl<unsigned> &Ops,
191                                    MachineInstr* LoadMI) const {
192   assert(LoadMI->getDesc().canFoldAsLoad() && "LoadMI isn't foldable!");
193 #ifndef NDEBUG
194   for (unsigned i = 0, e = Ops.size(); i != e; ++i)
195     assert(MI->getOperand(Ops[i]).isUse() && "Folding load into def!");
196 #endif
197
198   // Ask the target to do the actual folding.
199   MachineInstr *NewMI = foldMemoryOperandImpl(MF, MI, Ops, LoadMI);
200   if (!NewMI) return 0;
201
202   // Copy the memoperands from the load to the folded instruction.
203   for (std::list<MachineMemOperand>::iterator I = LoadMI->memoperands_begin(),
204        E = LoadMI->memoperands_end(); I != E; ++I)
205     NewMI->addMemOperand(MF, *I);
206
207   return NewMI;
208 }