1f121a61b5a70b8f5d5414f896e00918fa36479a5Michael Gottesman//===-- FastISel.h - Definition of the FastISel class ---*- C++ -*---------===//
2b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
3b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//                     The LLVM Compiler Infrastructure
4b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
5b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file is distributed under the University of Illinois Open Source
6b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// License. See LICENSE.TXT for details.
7b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//
8b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===//
97d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman///
107d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman/// \file
117d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman/// This file defines the FastISel class.
127d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman///
13b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===//
142ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
15b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#ifndef LLVM_CODEGEN_FASTISEL_H
16b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#define LLVM_CODEGEN_FASTISEL_H
17b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
18b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/ADT/DenseMap.h"
1984023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman#include "llvm/CodeGen/MachineBasicBlock.h"
20b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
21b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmannamespace llvm {
22b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
230586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohmanclass AllocaInst;
24066b5d8403483bf3a8bb033b690da318fbc68e79Benjamin Kramerclass Constant;
2510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohmanclass ConstantFP;
26cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesclass CallInst;
2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass DataLayout;
28a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohmanclass FunctionLoweringInfo;
29dd5b58ad7be78be90390074f0df138778af5c895Dan Gohmanclass Instruction;
30066b5d8403483bf3a8bb033b690da318fbc68e79Benjamin Kramerclass LoadInst;
3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MVT;
3295267a1e671efc3c14e916b6978bbb15973b4cdcOwen Andersonclass MachineConstantPool;
3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass MachineFrameInfo;
34b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanclass MachineFunction;
35f81eca0ab908fdcf98ae0efaa75acccc8ba40dc2Dan Gohmanclass MachineInstr;
36bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohmanclass MachineRegisterInfo;
37b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanclass TargetInstrInfo;
38d49edb7ab098fa0c82f59efbcf1b4eb2958f8dc3Bob Wilsonclass TargetLibraryInfo;
3983785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengclass TargetLowering;
4022bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohmanclass TargetMachine;
41b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanclass TargetRegisterClass;
42db4971259ce94cea26e555e9ade82672a3581f5cDan Gohmanclass TargetRegisterInfo;
43066b5d8403483bf3a8bb033b690da318fbc68e79Benjamin Kramerclass User;
44066b5d8403483bf3a8bb033b690da318fbc68e79Benjamin Kramerclass Value;
45b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
467d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman/// This is a fast-path instruction selection class that generates poor code and
477d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman/// doesn't support illegal types or non-trivial lowering, but runs quickly.
48b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanclass FastISel {
4922bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohmanprotected:
50104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman  DenseMap<const Value *, unsigned> LocalValueMap;
51a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman  FunctionLoweringInfo &FuncInfo;
52cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MachineFunction *MF;
53bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  MachineRegisterInfo &MRI;
540586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  MachineFrameInfo &MFI;
550586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  MachineConstantPool &MCP;
5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DebugLoc DbgLoc;
5722bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman  const TargetMachine &TM;
5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const DataLayout &DL;
59bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrInfo &TII;
6022bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman  const TargetLowering &TLI;
61db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman  const TargetRegisterInfo &TRI;
62d49edb7ab098fa0c82f59efbcf1b4eb2958f8dc3Bob Wilson  const TargetLibraryInfo *LibInfo;
6374af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
647d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// The position of the last instruction for materializing constants for use
657d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// in the current block. It resets to EmitStartPt when it makes sense (for
667d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// example, it's usually profitable to avoid function calls between the
677d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// definition and the use)
6884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  MachineInstr *LastLocalValue;
69b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
707d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// The top most instruction in the current block that is allowed for emitting
717d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// local variables. LastLocalValue resets to EmitStartPt when it makes sense
727d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// (for example, on function calls)
7374af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  MachineInstr *EmitStartPt;
7474af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
75b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanpublic:
767d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Return the position of the last instruction emitted for materializing
777d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// constants for use in the current block.
7884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  MachineInstr *getLastLocalValue() { return LastLocalValue; }
7984023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
807d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Update the position of the last instruction emitted for materializing
817d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// constants for use in the current block.
8274af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  void setLastLocalValue(MachineInstr *I) {
8374af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin    EmitStartPt = I;
8474af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin    LastLocalValue = I;
8574af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  }
8684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
877d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Set the current block to which generated machine instructions will be
887d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// appended, and clear the local CSE map.
8984023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  void startNewBlock();
90241f464d24a6c22721607841069bbeb17b3f71e6Dan Gohman
917d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Return current debug location information.
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DebugLoc getCurDebugLoc() const { return DbgLoc; }
93092e5e75661fdd5d54a748fb00fab59d21031268Evan Cheng
947d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Do "fast" instruction selection for function arguments and append machine
957d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instructions to the current block. Return true if it is successful.
96092e5e75661fdd5d54a748fb00fab59d21031268Evan Cheng  bool LowerArguments();
97390f3ace34855a3d4c9e0adf468976375f8c6dc1Devang Patel
987d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Do "fast" instruction selection for the given LLVM IR instruction, and
997d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// append generated machine instructions to the current block. Return true if
1007d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// selection was successful.
10146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectInstruction(const Instruction *I);
102b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
1037d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Do "fast" instruction selection for the given LLVM IR operator
1047d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// (Instruction or ConstantExpr), and append generated machine instructions
1057d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// to the current block. Return true if selection was successful.
10646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectOperator(const User *I, unsigned Opcode);
10740b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman
1087d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Create a virtual register and arrange for it to be assigned the value for
1097d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// the given LLVM value.
11046510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  unsigned getRegForValue(const Value *V);
11199b218218c0ca3ebfdd568ddfeafa07842e9d69dDan Gohman
1127d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Look up the value to see if its value is already cached in a register. It
1137d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// may be defined by instructions across blocks or defined locally.
11446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  unsigned lookUpRegForValue(const Value *V);
11559fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng
1167d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This is a wrapper around getRegForValue that also takes care of truncating
1177d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// or sign-extending the given getelementptr index value.
118a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman  std::pair<unsigned, bool> getRegForGEPIndex(const Value *V);
119c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
1207d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief We're checking to see if we can fold \p LI into \p FoldInst. Note
1217d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// that we could have a sequence where multiple LLVM IR instructions are
1227d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// folded into the same machineinstr.  For example we could have:
1237d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
12475299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   A: x = load i32 *P
12575299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   B: y = icmp A, 42
12675299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   C: br y, ...
12775299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///
1287d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// In this scenario, \p LI is "A", and \p FoldInst is "C".  We know about "B"
1297d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// (and any other folded instructions) because it is between A and C.
13075299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///
13175299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  /// If we succeed folding, return true.
13275299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst);
13375299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky
1347d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief The specified machine instr operand is a vreg, and that vreg is
1357d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// being provided by the specified load instruction.  If possible, try to
1367d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// fold the load as an operand to the instruction, returning true if
137beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner  /// possible.
1387d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
13975299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  /// This method should be implemented by targets.
14075299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  virtual bool tryToFoldLoadIntoMI(MachineInstr * /*MI*/, unsigned /*OpNo*/,
14175299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky                                   const LoadInst * /*LI*/) {
142beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner    return false;
143beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner  }
1442ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
1457d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Reset InsertPt to prepare for inserting instructions into the current
1467d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// block.
14784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  void recomputeInsertPt();
14884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
1497d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Remove all dead instructions between the I and E.
150425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier  void removeDeadCode(MachineBasicBlock::iterator I,
151425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier                      MachineBasicBlock::iterator E);
152425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier
15376ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  struct SavePoint {
15476ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher    MachineBasicBlock::iterator InsertPt;
15576ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher    DebugLoc DL;
15676ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  };
15776ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher
1587d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Prepare InsertPt to begin inserting instructions into the local value area
1597d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// and return the old insert position.
16076ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  SavePoint enterLocalValueArea();
16184023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
1627d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Reset InsertPt to the given old insert position.
16376ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  void leaveLocalValueArea(SavePoint Old);
16484023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
165cc8430f742b0f1e567292c8a776e94fc1c930b2aDan Gohman  virtual ~FastISel();
166cc8430f742b0f1e567292c8a776e94fc1c930b2aDan Gohman
167b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanprotected:
168d49edb7ab098fa0c82f59efbcf1b4eb2958f8dc3Bob Wilson  explicit FastISel(FunctionLoweringInfo &funcInfo,
169d49edb7ab098fa0c82f59efbcf1b4eb2958f8dc3Bob Wilson                    const TargetLibraryInfo *libInfo);
170e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman
1717d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code when the normal FastISel
1727d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// process fails to select an instruction.  This gives targets a chance to
1737d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// emit code for anything that doesn't fit into FastISel's framework. It
1747d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// returns true if it was successful.
1756e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman  virtual bool
17646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  TargetSelectInstruction(const Instruction *I) = 0;
177092e5e75661fdd5d54a748fb00fab59d21031268Evan Cheng
1787d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to do target specific
1797d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// argument lowering. It returns true if it was successful.
180092e5e75661fdd5d54a748fb00fab59d21031268Evan Cheng  virtual bool FastLowerArguments();
1816e3ff375474c4fd78feb0b8463eb273a23cb4404Dan Gohman
1827d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
1837d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type and opcode be emitted.
184825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_(MVT VT,
185825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                             MVT RetVT,
1867c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                             unsigned Opcode);
187bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
1887d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
1897d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register operand be emitted.
190825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_r(MVT VT,
191825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                              MVT RetVT,
192a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                              unsigned Opcode,
193a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                              unsigned Op0, bool Op0IsKill);
194bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
1957d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
1967d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register operands be emitted.
197825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_rr(MVT VT,
198825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                               MVT RetVT,
1997c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned Opcode,
200a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               unsigned Op0, bool Op0IsKill,
201a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               unsigned Op1, bool Op1IsKill);
202b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
2037d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
2047d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and immediate
2057d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// operands be emitted.
206825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_ri(MVT VT,
207825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                               MVT RetVT,
2087c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned Opcode,
209a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               unsigned Op0, bool Op0IsKill,
210a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               uint64_t Imm);
211d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
2127d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
2137d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and floating-point
2147d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// immediate operands be emitted.
215825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_rf(MVT VT,
216825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                               MVT RetVT,
2177c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                               unsigned Opcode,
218a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               unsigned Op0, bool Op0IsKill,
219a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                               const ConstantFP *FPImm);
22010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
2217d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
2227d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and immediate
2237d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// operands be emitted.
224825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_rri(MVT VT,
225825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                MVT RetVT,
2267c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                                unsigned Opcode,
227a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                unsigned Op0, bool Op0IsKill,
228a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                unsigned Op1, bool Op1IsKill,
229a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                uint64_t Imm);
23083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
2317d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief This method is a wrapper of FastEmit_ri.
2327d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
2337d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// It first tries to emit an instruction with an immediate operand using
2347d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// FastEmit_ri.  If that fails, it materializes the immediate into a register
2357d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// and try FastEmit_rr instead.
236825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  unsigned FastEmit_ri_(MVT VT,
2377c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                        unsigned Opcode,
238a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                        unsigned Op0, bool Op0IsKill,
239a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                        uint64_t Imm, MVT ImmType);
2402ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
2417d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
2427d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and immediate operand be emitted.
243825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_i(MVT VT,
244825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                              MVT RetVT,
2457c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned Opcode,
2466d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                              uint64_t Imm);
24783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
2487d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// This method is called by target-independent code to request that an
2497d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and floating-point immediate
2507d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// operand be emitted.
251825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  virtual unsigned FastEmit_f(MVT VT,
252825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                              MVT RetVT,
2537c3ecb6838ef7a2ca306c0f3cd68022f0855ae71Dan Gohman                              unsigned Opcode,
25446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                              const ConstantFP *FPImm);
25510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
2567d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with no operands and a result register in the given
2577d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// register class.
258b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  unsigned FastEmitInst_(unsigned MachineInstOpcode,
259b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                         const TargetRegisterClass *RC);
260bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
2617d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with one register operand and a result register in the
2627d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// given register class.
263b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  unsigned FastEmitInst_r(unsigned MachineInstOpcode,
264b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                          const TargetRegisterClass *RC,
265a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                          unsigned Op0, bool Op0IsKill);
266bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
2677d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with two register operands and a result register in
2687d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// the given register class.
269b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  unsigned FastEmitInst_rr(unsigned MachineInstOpcode,
270b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                           const TargetRegisterClass *RC,
271a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           unsigned Op0, bool Op0IsKill,
272a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           unsigned Op1, bool Op1IsKill);
273bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
2747d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with three register operands and a result register in
2757d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// the given register class.
276d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson  unsigned FastEmitInst_rrr(unsigned MachineInstOpcode,
277d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson                           const TargetRegisterClass *RC,
278d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson                           unsigned Op0, bool Op0IsKill,
279d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson                           unsigned Op1, bool Op1IsKill,
280d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson                           unsigned Op2, bool Op2IsKill);
281d71867a8f4b1ab6ab8cc8f5b1a732184ec5bad1bOwen Anderson
2827d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with a register operand, an immediate, and a result
2837d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// register in the given register class.
284d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned FastEmitInst_ri(unsigned MachineInstOpcode,
285d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                           const TargetRegisterClass *RC,
286a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           unsigned Op0, bool Op0IsKill,
287a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           uint64_t Imm);
288d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
2897d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with one register operand and two immediate operands.
2902ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson  unsigned FastEmitInst_rii(unsigned MachineInstOpcode,
2912ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson                           const TargetRegisterClass *RC,
2922ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson                           unsigned Op0, bool Op0IsKill,
2932ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson                           uint64_t Imm1, uint64_t Imm2);
2942ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
2957d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with two register operands and a result register in
2967d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// the given register class.
29710df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman  unsigned FastEmitInst_rf(unsigned MachineInstOpcode,
29810df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman                           const TargetRegisterClass *RC,
299a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           unsigned Op0, bool Op0IsKill,
300a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                           const ConstantFP *FPImm);
30110df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
3027d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with two register operands, an immediate, and a result
3037d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// register in the given register class.
304d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman  unsigned FastEmitInst_rri(unsigned MachineInstOpcode,
305d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman                            const TargetRegisterClass *RC,
306a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                            unsigned Op0, bool Op0IsKill,
307a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                            unsigned Op1, bool Op1IsKill,
308a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                            uint64_t Imm);
3092ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
3107d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with two register operands, two immediates operands,
3117d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// and a result register in the given register class.
31268f25571e759c1fcf2da206109647259f49f7416Manman Ren  unsigned FastEmitInst_rrii(unsigned MachineInstOpcode,
31368f25571e759c1fcf2da206109647259f49f7416Manman Ren                             const TargetRegisterClass *RC,
31468f25571e759c1fcf2da206109647259f49f7416Manman Ren                             unsigned Op0, bool Op0IsKill,
31568f25571e759c1fcf2da206109647259f49f7416Manman Ren                             unsigned Op1, bool Op1IsKill,
31668f25571e759c1fcf2da206109647259f49f7416Manman Ren                             uint64_t Imm1, uint64_t Imm2);
31768f25571e759c1fcf2da206109647259f49f7416Manman Ren
3187d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with a single immediate operand, and a result register
3197d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// in the given register class.
3206d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson  unsigned FastEmitInst_i(unsigned MachineInstrOpcode,
3216d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                          const TargetRegisterClass *RC,
3226d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson                          uint64_t Imm);
323d74ea775af55782e3b0d5b10fa7602f8822a2f72Owen Anderson
3247d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr with a two immediate operands.
325d74ea775af55782e3b0d5b10fa7602f8822a2f72Owen Anderson  unsigned FastEmitInst_ii(unsigned MachineInstrOpcode,
326d74ea775af55782e3b0d5b10fa7602f8822a2f72Owen Anderson                          const TargetRegisterClass *RC,
327d74ea775af55782e3b0d5b10fa7602f8822a2f72Owen Anderson                          uint64_t Imm1, uint64_t Imm2);
328d74ea775af55782e3b0d5b10fa7602f8822a2f72Owen Anderson
3297d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a MachineInstr for an extract_subreg from a specified index of a
3307d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// superregister to a specified type.
331825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  unsigned FastEmitInst_extractsubreg(MVT RetVT,
332a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                      unsigned Op0, bool Op0IsKill,
333a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                      uint32_t Idx);
3348970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
3357d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit MachineInstrs to compute the value of Op with all but the least
3367d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// significant bit set to zero.
337825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  unsigned FastEmitZExtFromI1(MVT VT,
338a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                              unsigned Op0, bool Op0IsKill);
33914ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
3407d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit an unconditional branch to the given block, unless it is the
3417d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// immediate (fall-through) successor, and update the CFG.
3423bf912593301152b65accb9d9c37a95172f1df5aStuart Hastings  void FastEmitBranch(MachineBasicBlock *MBB, DebugLoc DL);
343d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman
344482feb33b2bba677d47bab859d9e1e95d67016bdEli Friedman  void UpdateValueMap(const Value* I, unsigned Reg, unsigned NumRegs = 1);
345ea09f4f4691a0db65772b54fe8163a48c9dce01dEvan Cheng
346c7f72de3b4ef21828ea4780f0693bf0acd04e1c5Dan Gohman  unsigned createResultReg(const TargetRegisterClass *RC);
3472ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
348dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// Try to constrain Op so that it is usable by argument OpNum of the provided
349dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// MCInstrDesc. If this fails, create a new virtual register in the correct
350dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  /// class and COPY the value there.
351dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned constrainOperandRegClass(const MCInstrDesc &II, unsigned Op,
352dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    unsigned OpNum);
353dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
3547d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit a constant in a register using target-specific logic, such as
3557d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// constant pool loads.
35646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  virtual unsigned TargetMaterializeConstant(const Constant* C) {
3570586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman    return 0;
3580586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  }
3590586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
3607d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Emit an alloca address in a register using target-specific logic.
36146510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  virtual unsigned TargetMaterializeAlloca(const AllocaInst* C) {
36295267a1e671efc3c14e916b6978bbb15973b4cdcOwen Anderson    return 0;
36395267a1e671efc3c14e916b6978bbb15973b4cdcOwen Anderson  }
364c7f72de3b4ef21828ea4780f0693bf0acd04e1c5Dan Gohman
3652790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman  virtual unsigned TargetMaterializeFloatZero(const ConstantFP* CF) {
3662790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman    return 0;
3672790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman  }
3682790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman
369cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// \brief Check if \c Add is an add that can be safely folded into \c GEP.
370cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  ///
371cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// \c Add can be folded into \c GEP if:
372cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add is an add,
373cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add's size matches \c GEP's,
374cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add is in the same basic block as \c GEP, and
375cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add has a constant operand.
376cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  bool canFoldAddIntoGEP(const User *GEP, const Value *Add);
377cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson
378cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// Test whether the given value has exactly one use.
379cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool hasTrivialKill(const Value *V) const;
380cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
381cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  /// \brief Create a machine mem operand from the given instruction.
382cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  MachineMemOperand *createMachineMemOperandFor(const Instruction *I) const;
383cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines
384ea09f4f4691a0db65772b54fe8163a48c9dce01dEvan Chengprivate:
38546510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectBinaryOp(const User *I, unsigned ISDOpcode);
386bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
38746510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectFNeg(const User *I);
3883d45a853db014fdddcdb79424e663dfed5eccbc7Dan Gohman
38946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectGetElementPtr(const User *I);
390763d89343be210eb62a13318ca0cc9321ce46bfbDan Gohman
391cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool SelectStackmap(const CallInst *I);
39246510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectCall(const User *I);
39333134c4a75558288d663267c8991f6bd37a530afDan Gohman
39446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectBitCast(const User *I);
3952ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
39646510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  bool SelectCast(const User *I, unsigned Opcode);
397e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman
3982586b8f9366aed5a1efa44d3f18d095511601642Eli Friedman  bool SelectExtractValue(const User *I);
3992586b8f9366aed5a1efa44d3f18d095511601642Eli Friedman
400cd462d055ffc18a526a9a1d343261d8550e99280Chad Rosier  bool SelectInsertValue(const User *I);
401cd462d055ffc18a526a9a1d343261d8550e99280Chad Rosier
4027d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief Handle PHI nodes in successor blocks.
4037d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
404e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman  /// Emit code to ensure constants are copied into registers when needed.
405e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman  /// Remember the virtual registers that need to be added to the Machine PHI
4067d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// nodes as input.  We cannot just directly add them, because expansion might
4077d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// result in multiple MBB's for one BB.  As such, the start of the BB might
4087d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// correspond to a different MBB than the end.
409e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman  bool HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
4101fdc614bee2a324fcc210d1e46d9b6fca3ca324bDan Gohman
4117d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Helper for getRegForVale. This function is called when the value isn't
4127d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// already available in a register and must be materialized with new
4137d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instructions.
4141fdc614bee2a324fcc210d1e46d9b6fca3ca324bDan Gohman  unsigned materializeRegForValue(const Value *V, MVT VT);
415a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman
4167d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// Clears LocalValueMap and moves the area for the new local variables to the
4177d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// beginning of the block. It helps to avoid spilling cached variables across
4187d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// heavy instructions like calls.
41974af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  void flushLocalValueMap();
42074af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
421cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines  bool addStackMapLiveVars(SmallVectorImpl<MachineOperand> &Ops,
422cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines                           const CallInst *CI, unsigned StartIdx);
423b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman};
424b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
425b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman}
426b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
427b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#endif
428