FastISel.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. //===- FastISel.h - Definition of the FastISel class ------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. ///
  9. /// \file
  10. /// This file defines the FastISel class.
  11. ///
  12. //===----------------------------------------------------------------------===//
  13. #ifndef LLVM_CODEGEN_FASTISEL_H
  14. #define LLVM_CODEGEN_FASTISEL_H
  15. #include "llvm/ADT/DenseMap.h"
  16. #include "llvm/ADT/SmallVector.h"
  17. #include "llvm/ADT/StringRef.h"
  18. #include "llvm/CodeGen/MachineBasicBlock.h"
  19. #include "llvm/CodeGen/TargetLowering.h"
  20. #include "llvm/IR/Attributes.h"
  21. #include "llvm/IR/CallingConv.h"
  22. #include "llvm/IR/DebugLoc.h"
  23. #include "llvm/IR/DerivedTypes.h"
  24. #include "llvm/IR/InstrTypes.h"
  25. #include "llvm/IR/IntrinsicInst.h"
  26. #include "llvm/Support/MachineValueType.h"
  27. #include <algorithm>
  28. #include <cstdint>
  29. #include <utility>
  30. namespace llvm {
  31. class AllocaInst;
  32. class BasicBlock;
  33. class CallInst;
  34. class Constant;
  35. class ConstantFP;
  36. class DataLayout;
  37. class FunctionLoweringInfo;
  38. class LoadInst;
  39. class MachineConstantPool;
  40. class MachineFrameInfo;
  41. class MachineFunction;
  42. class MachineInstr;
  43. class MachineMemOperand;
  44. class MachineOperand;
  45. class MachineRegisterInfo;
  46. class MCContext;
  47. class MCInstrDesc;
  48. class MCSymbol;
  49. class TargetInstrInfo;
  50. class TargetLibraryInfo;
  51. class TargetMachine;
  52. class TargetRegisterClass;
  53. class TargetRegisterInfo;
  54. class Type;
  55. class User;
  56. class Value;
  57. /// This is a fast-path instruction selection class that generates poor
  58. /// code and doesn't support illegal types or non-trivial lowering, but runs
  59. /// quickly.
  60. class FastISel {
  61. public:
  62. using ArgListEntry = TargetLoweringBase::ArgListEntry;
  63. using ArgListTy = TargetLoweringBase::ArgListTy;
  64. struct CallLoweringInfo {
  65. Type *RetTy = nullptr;
  66. bool RetSExt : 1;
  67. bool RetZExt : 1;
  68. bool IsVarArg : 1;
  69. bool IsInReg : 1;
  70. bool DoesNotReturn : 1;
  71. bool IsReturnValueUsed : 1;
  72. bool IsPatchPoint : 1;
  73. // IsTailCall Should be modified by implementations of FastLowerCall
  74. // that perform tail call conversions.
  75. bool IsTailCall = false;
  76. unsigned NumFixedArgs = -1;
  77. CallingConv::ID CallConv = CallingConv::C;
  78. const Value *Callee = nullptr;
  79. MCSymbol *Symbol = nullptr;
  80. ArgListTy Args;
  81. const CallBase *CB = nullptr;
  82. MachineInstr *Call = nullptr;
  83. Register ResultReg;
  84. unsigned NumResultRegs = 0;
  85. SmallVector<Value *, 16> OutVals;
  86. SmallVector<ISD::ArgFlagsTy, 16> OutFlags;
  87. SmallVector<Register, 16> OutRegs;
  88. SmallVector<ISD::InputArg, 4> Ins;
  89. SmallVector<Register, 4> InRegs;
  90. CallLoweringInfo()
  91. : RetSExt(false), RetZExt(false), IsVarArg(false), IsInReg(false),
  92. DoesNotReturn(false), IsReturnValueUsed(true), IsPatchPoint(false) {}
  93. CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
  94. const Value *Target, ArgListTy &&ArgsList,
  95. const CallBase &Call) {
  96. RetTy = ResultTy;
  97. Callee = Target;
  98. IsInReg = Call.hasRetAttr(Attribute::InReg);
  99. DoesNotReturn = Call.doesNotReturn();
  100. IsVarArg = FuncTy->isVarArg();
  101. IsReturnValueUsed = !Call.use_empty();
  102. RetSExt = Call.hasRetAttr(Attribute::SExt);
  103. RetZExt = Call.hasRetAttr(Attribute::ZExt);
  104. CallConv = Call.getCallingConv();
  105. Args = std::move(ArgsList);
  106. NumFixedArgs = FuncTy->getNumParams();
  107. CB = &Call;
  108. return *this;
  109. }
  110. CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
  111. MCSymbol *Target, ArgListTy &&ArgsList,
  112. const CallBase &Call,
  113. unsigned FixedArgs = ~0U) {
  114. RetTy = ResultTy;
  115. Callee = Call.getCalledOperand();
  116. Symbol = Target;
  117. IsInReg = Call.hasRetAttr(Attribute::InReg);
  118. DoesNotReturn = Call.doesNotReturn();
  119. IsVarArg = FuncTy->isVarArg();
  120. IsReturnValueUsed = !Call.use_empty();
  121. RetSExt = Call.hasRetAttr(Attribute::SExt);
  122. RetZExt = Call.hasRetAttr(Attribute::ZExt);
  123. CallConv = Call.getCallingConv();
  124. Args = std::move(ArgsList);
  125. NumFixedArgs = (FixedArgs == ~0U) ? FuncTy->getNumParams() : FixedArgs;
  126. CB = &Call;
  127. return *this;
  128. }
  129. CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
  130. const Value *Target, ArgListTy &&ArgsList,
  131. unsigned FixedArgs = ~0U) {
  132. RetTy = ResultTy;
  133. Callee = Target;
  134. CallConv = CC;
  135. Args = std::move(ArgsList);
  136. NumFixedArgs = (FixedArgs == ~0U) ? Args.size() : FixedArgs;
  137. return *this;
  138. }
  139. CallLoweringInfo &setCallee(const DataLayout &DL, MCContext &Ctx,
  140. CallingConv::ID CC, Type *ResultTy,
  141. StringRef Target, ArgListTy &&ArgsList,
  142. unsigned FixedArgs = ~0U);
  143. CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
  144. MCSymbol *Target, ArgListTy &&ArgsList,
  145. unsigned FixedArgs = ~0U) {
  146. RetTy = ResultTy;
  147. Symbol = Target;
  148. CallConv = CC;
  149. Args = std::move(ArgsList);
  150. NumFixedArgs = (FixedArgs == ~0U) ? Args.size() : FixedArgs;
  151. return *this;
  152. }
  153. CallLoweringInfo &setTailCall(bool Value = true) {
  154. IsTailCall = Value;
  155. return *this;
  156. }
  157. CallLoweringInfo &setIsPatchPoint(bool Value = true) {
  158. IsPatchPoint = Value;
  159. return *this;
  160. }
  161. ArgListTy &getArgs() { return Args; }
  162. void clearOuts() {
  163. OutVals.clear();
  164. OutFlags.clear();
  165. OutRegs.clear();
  166. }
  167. void clearIns() {
  168. Ins.clear();
  169. InRegs.clear();
  170. }
  171. };
  172. protected:
  173. DenseMap<const Value *, Register> LocalValueMap;
  174. FunctionLoweringInfo &FuncInfo;
  175. MachineFunction *MF;
  176. MachineRegisterInfo &MRI;
  177. MachineFrameInfo &MFI;
  178. MachineConstantPool &MCP;
  179. DebugLoc DbgLoc;
  180. const TargetMachine &TM;
  181. const DataLayout &DL;
  182. const TargetInstrInfo &TII;
  183. const TargetLowering &TLI;
  184. const TargetRegisterInfo &TRI;
  185. const TargetLibraryInfo *LibInfo;
  186. bool SkipTargetIndependentISel;
  187. /// The position of the last instruction for materializing constants
  188. /// for use in the current block. It resets to EmitStartPt when it makes sense
  189. /// (for example, it's usually profitable to avoid function calls between the
  190. /// definition and the use)
  191. MachineInstr *LastLocalValue;
  192. /// The top most instruction in the current block that is allowed for
  193. /// emitting local variables. LastLocalValue resets to EmitStartPt when it
  194. /// makes sense (for example, on function calls)
  195. MachineInstr *EmitStartPt;
  196. public:
  197. virtual ~FastISel();
  198. /// Return the position of the last instruction emitted for
  199. /// materializing constants for use in the current block.
  200. MachineInstr *getLastLocalValue() { return LastLocalValue; }
  201. /// Update the position of the last instruction emitted for
  202. /// materializing constants for use in the current block.
  203. void setLastLocalValue(MachineInstr *I) {
  204. EmitStartPt = I;
  205. LastLocalValue = I;
  206. }
  207. /// Set the current block to which generated machine instructions will
  208. /// be appended.
  209. void startNewBlock();
  210. /// Flush the local value map.
  211. void finishBasicBlock();
  212. /// Return current debug location information.
  213. DebugLoc getCurDebugLoc() const { return DbgLoc; }
  214. /// Do "fast" instruction selection for function arguments and append
  215. /// the machine instructions to the current block. Returns true when
  216. /// successful.
  217. bool lowerArguments();
  218. /// Do "fast" instruction selection for the given LLVM IR instruction
  219. /// and append the generated machine instructions to the current block.
  220. /// Returns true if selection was successful.
  221. bool selectInstruction(const Instruction *I);
  222. /// Do "fast" instruction selection for the given LLVM IR operator
  223. /// (Instruction or ConstantExpr), and append generated machine instructions
  224. /// to the current block. Return true if selection was successful.
  225. bool selectOperator(const User *I, unsigned Opcode);
  226. /// Create a virtual register and arrange for it to be assigned the
  227. /// value for the given LLVM value.
  228. Register getRegForValue(const Value *V);
  229. /// Look up the value to see if its value is already cached in a
  230. /// register. It may be defined by instructions across blocks or defined
  231. /// locally.
  232. Register lookUpRegForValue(const Value *V);
  233. /// This is a wrapper around getRegForValue that also takes care of
  234. /// truncating or sign-extending the given getelementptr index value.
  235. Register getRegForGEPIndex(const Value *Idx);
  236. /// We're checking to see if we can fold \p LI into \p FoldInst. Note
  237. /// that we could have a sequence where multiple LLVM IR instructions are
  238. /// folded into the same machineinstr. For example we could have:
  239. ///
  240. /// A: x = load i32 *P
  241. /// B: y = icmp A, 42
  242. /// C: br y, ...
  243. ///
  244. /// In this scenario, \p LI is "A", and \p FoldInst is "C". We know about "B"
  245. /// (and any other folded instructions) because it is between A and C.
  246. ///
  247. /// If we succeed folding, return true.
  248. bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst);
  249. /// The specified machine instr operand is a vreg, and that vreg is
  250. /// being provided by the specified load instruction. If possible, try to
  251. /// fold the load as an operand to the instruction, returning true if
  252. /// possible.
  253. ///
  254. /// This method should be implemented by targets.
  255. virtual bool tryToFoldLoadIntoMI(MachineInstr * /*MI*/, unsigned /*OpNo*/,
  256. const LoadInst * /*LI*/) {
  257. return false;
  258. }
  259. /// Reset InsertPt to prepare for inserting instructions into the
  260. /// current block.
  261. void recomputeInsertPt();
  262. /// Remove all dead instructions between the I and E.
  263. void removeDeadCode(MachineBasicBlock::iterator I,
  264. MachineBasicBlock::iterator E);
  265. using SavePoint = MachineBasicBlock::iterator;
  266. /// Prepare InsertPt to begin inserting instructions into the local
  267. /// value area and return the old insert position.
  268. SavePoint enterLocalValueArea();
  269. /// Reset InsertPt to the given old insert position.
  270. void leaveLocalValueArea(SavePoint Old);
  271. protected:
  272. explicit FastISel(FunctionLoweringInfo &FuncInfo,
  273. const TargetLibraryInfo *LibInfo,
  274. bool SkipTargetIndependentISel = false);
  275. /// This method is called by target-independent code when the normal
  276. /// FastISel process fails to select an instruction. This gives targets a
  277. /// chance to emit code for anything that doesn't fit into FastISel's
  278. /// framework. It returns true if it was successful.
  279. virtual bool fastSelectInstruction(const Instruction *I) = 0;
  280. /// This method is called by target-independent code to do target-
  281. /// specific argument lowering. It returns true if it was successful.
  282. virtual bool fastLowerArguments();
  283. /// This method is called by target-independent code to do target-
  284. /// specific call lowering. It returns true if it was successful.
  285. virtual bool fastLowerCall(CallLoweringInfo &CLI);
  286. /// This method is called by target-independent code to do target-
  287. /// specific intrinsic lowering. It returns true if it was successful.
  288. virtual bool fastLowerIntrinsicCall(const IntrinsicInst *II);
  289. /// This method is called by target-independent code to request that an
  290. /// instruction with the given type and opcode be emitted.
  291. virtual unsigned fastEmit_(MVT VT, MVT RetVT, unsigned Opcode);
  292. /// This method is called by target-independent code to request that an
  293. /// instruction with the given type, opcode, and register operand be emitted.
  294. virtual unsigned fastEmit_r(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0);
  295. /// This method is called by target-independent code to request that an
  296. /// instruction with the given type, opcode, and register operands be emitted.
  297. virtual unsigned fastEmit_rr(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
  298. unsigned Op1);
  299. /// This method is called by target-independent code to request that an
  300. /// instruction with the given type, opcode, and register and immediate
  301. /// operands be emitted.
  302. virtual unsigned fastEmit_ri(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
  303. uint64_t Imm);
  304. /// This method is a wrapper of fastEmit_ri.
  305. ///
  306. /// It first tries to emit an instruction with an immediate operand using
  307. /// fastEmit_ri. If that fails, it materializes the immediate into a register
  308. /// and try fastEmit_rr instead.
  309. Register fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, uint64_t Imm,
  310. MVT ImmType);
  311. /// This method is called by target-independent code to request that an
  312. /// instruction with the given type, opcode, and immediate operand be emitted.
  313. virtual unsigned fastEmit_i(MVT VT, MVT RetVT, unsigned Opcode, uint64_t Imm);
  314. /// This method is called by target-independent code to request that an
  315. /// instruction with the given type, opcode, and floating-point immediate
  316. /// operand be emitted.
  317. virtual unsigned fastEmit_f(MVT VT, MVT RetVT, unsigned Opcode,
  318. const ConstantFP *FPImm);
  319. /// Emit a MachineInstr with no operands and a result register in the
  320. /// given register class.
  321. Register fastEmitInst_(unsigned MachineInstOpcode,
  322. const TargetRegisterClass *RC);
  323. /// Emit a MachineInstr with one register operand and a result register
  324. /// in the given register class.
  325. Register fastEmitInst_r(unsigned MachineInstOpcode,
  326. const TargetRegisterClass *RC, unsigned Op0);
  327. /// Emit a MachineInstr with two register operands and a result
  328. /// register in the given register class.
  329. Register fastEmitInst_rr(unsigned MachineInstOpcode,
  330. const TargetRegisterClass *RC, unsigned Op0,
  331. unsigned Op1);
  332. /// Emit a MachineInstr with three register operands and a result
  333. /// register in the given register class.
  334. Register fastEmitInst_rrr(unsigned MachineInstOpcode,
  335. const TargetRegisterClass *RC, unsigned Op0,
  336. unsigned Op1, unsigned Op2);
  337. /// Emit a MachineInstr with a register operand, an immediate, and a
  338. /// result register in the given register class.
  339. Register fastEmitInst_ri(unsigned MachineInstOpcode,
  340. const TargetRegisterClass *RC, unsigned Op0,
  341. uint64_t Imm);
  342. /// Emit a MachineInstr with one register operand and two immediate
  343. /// operands.
  344. Register fastEmitInst_rii(unsigned MachineInstOpcode,
  345. const TargetRegisterClass *RC, unsigned Op0,
  346. uint64_t Imm1, uint64_t Imm2);
  347. /// Emit a MachineInstr with a floating point immediate, and a result
  348. /// register in the given register class.
  349. Register fastEmitInst_f(unsigned MachineInstOpcode,
  350. const TargetRegisterClass *RC,
  351. const ConstantFP *FPImm);
  352. /// Emit a MachineInstr with two register operands, an immediate, and a
  353. /// result register in the given register class.
  354. Register fastEmitInst_rri(unsigned MachineInstOpcode,
  355. const TargetRegisterClass *RC, unsigned Op0,
  356. unsigned Op1, uint64_t Imm);
  357. /// Emit a MachineInstr with a single immediate operand, and a result
  358. /// register in the given register class.
  359. Register fastEmitInst_i(unsigned MachineInstOpcode,
  360. const TargetRegisterClass *RC, uint64_t Imm);
  361. /// Emit a MachineInstr for an extract_subreg from a specified index of
  362. /// a superregister to a specified type.
  363. Register fastEmitInst_extractsubreg(MVT RetVT, unsigned Op0, uint32_t Idx);
  364. /// Emit MachineInstrs to compute the value of Op with all but the
  365. /// least significant bit set to zero.
  366. Register fastEmitZExtFromI1(MVT VT, unsigned Op0);
  367. /// Emit an unconditional branch to the given block, unless it is the
  368. /// immediate (fall-through) successor, and update the CFG.
  369. void fastEmitBranch(MachineBasicBlock *MSucc, const DebugLoc &DbgLoc);
  370. /// Emit an unconditional branch to \p FalseMBB, obtains the branch weight
  371. /// and adds TrueMBB and FalseMBB to the successor list.
  372. void finishCondBranch(const BasicBlock *BranchBB, MachineBasicBlock *TrueMBB,
  373. MachineBasicBlock *FalseMBB);
  374. /// Update the value map to include the new mapping for this
  375. /// instruction, or insert an extra copy to get the result in a previous
  376. /// determined register.
  377. ///
  378. /// NOTE: This is only necessary because we might select a block that uses a
  379. /// value before we select the block that defines the value. It might be
  380. /// possible to fix this by selecting blocks in reverse postorder.
  381. void updateValueMap(const Value *I, Register Reg, unsigned NumRegs = 1);
  382. Register createResultReg(const TargetRegisterClass *RC);
  383. /// Try to constrain Op so that it is usable by argument OpNum of the
  384. /// provided MCInstrDesc. If this fails, create a new virtual register in the
  385. /// correct class and COPY the value there.
  386. Register constrainOperandRegClass(const MCInstrDesc &II, Register Op,
  387. unsigned OpNum);
  388. /// Emit a constant in a register using target-specific logic, such as
  389. /// constant pool loads.
  390. virtual unsigned fastMaterializeConstant(const Constant *C) { return 0; }
  391. /// Emit an alloca address in a register using target-specific logic.
  392. virtual unsigned fastMaterializeAlloca(const AllocaInst *C) { return 0; }
  393. /// Emit the floating-point constant +0.0 in a register using target-
  394. /// specific logic.
  395. virtual unsigned fastMaterializeFloatZero(const ConstantFP *CF) {
  396. return 0;
  397. }
  398. /// Check if \c Add is an add that can be safely folded into \c GEP.
  399. ///
  400. /// \c Add can be folded into \c GEP if:
  401. /// - \c Add is an add,
  402. /// - \c Add's size matches \c GEP's,
  403. /// - \c Add is in the same basic block as \c GEP, and
  404. /// - \c Add has a constant operand.
  405. bool canFoldAddIntoGEP(const User *GEP, const Value *Add);
  406. /// Create a machine mem operand from the given instruction.
  407. MachineMemOperand *createMachineMemOperandFor(const Instruction *I) const;
  408. CmpInst::Predicate optimizeCmpPredicate(const CmpInst *CI) const;
  409. bool lowerCallTo(const CallInst *CI, MCSymbol *Symbol, unsigned NumArgs);
  410. bool lowerCallTo(const CallInst *CI, const char *SymName,
  411. unsigned NumArgs);
  412. bool lowerCallTo(CallLoweringInfo &CLI);
  413. bool lowerCall(const CallInst *I);
  414. /// Select and emit code for a binary operator instruction, which has
  415. /// an opcode which directly corresponds to the given ISD opcode.
  416. bool selectBinaryOp(const User *I, unsigned ISDOpcode);
  417. bool selectFNeg(const User *I, const Value *In);
  418. bool selectGetElementPtr(const User *I);
  419. bool selectStackmap(const CallInst *I);
  420. bool selectPatchpoint(const CallInst *I);
  421. bool selectCall(const User *I);
  422. bool selectIntrinsicCall(const IntrinsicInst *II);
  423. bool selectBitCast(const User *I);
  424. bool selectFreeze(const User *I);
  425. bool selectCast(const User *I, unsigned Opcode);
  426. bool selectExtractValue(const User *U);
  427. bool selectXRayCustomEvent(const CallInst *II);
  428. bool selectXRayTypedEvent(const CallInst *II);
  429. bool shouldOptForSize(const MachineFunction *MF) const {
  430. // TODO: Implement PGSO.
  431. return MF->getFunction().hasOptSize();
  432. }
  433. private:
  434. /// Handle PHI nodes in successor blocks.
  435. ///
  436. /// Emit code to ensure constants are copied into registers when needed.
  437. /// Remember the virtual registers that need to be added to the Machine PHI
  438. /// nodes as input. We cannot just directly add them, because expansion might
  439. /// result in multiple MBB's for one BB. As such, the start of the BB might
  440. /// correspond to a different MBB than the end.
  441. bool handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
  442. /// Helper for materializeRegForValue to materialize a constant in a
  443. /// target-independent way.
  444. Register materializeConstant(const Value *V, MVT VT);
  445. /// Helper for getRegForVale. This function is called when the value
  446. /// isn't already available in a register and must be materialized with new
  447. /// instructions.
  448. Register materializeRegForValue(const Value *V, MVT VT);
  449. /// Clears LocalValueMap and moves the area for the new local variables
  450. /// to the beginning of the block. It helps to avoid spilling cached variables
  451. /// across heavy instructions like calls.
  452. void flushLocalValueMap();
  453. /// Removes dead local value instructions after SavedLastLocalvalue.
  454. void removeDeadLocalValueCode(MachineInstr *SavedLastLocalValue);
  455. /// Insertion point before trying to select the current instruction.
  456. MachineBasicBlock::iterator SavedInsertPt;
  457. /// Add a stackmap or patchpoint intrinsic call's live variable
  458. /// operands to a stackmap or patchpoint machine instruction.
  459. bool addStackMapLiveVars(SmallVectorImpl<MachineOperand> &Ops,
  460. const CallInst *CI, unsigned StartIdx);
  461. bool lowerCallOperands(const CallInst *CI, unsigned ArgIdx, unsigned NumArgs,
  462. const Value *Callee, bool ForceRetVoidTy,
  463. CallLoweringInfo &CLI);
  464. };
  465. } // end namespace llvm
  466. #endif // LLVM_CODEGEN_FASTISEL_H