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