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