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"
1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/CodeGen/CallingConvLower.h"
2084023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman#include "llvm/CodeGen/MachineBasicBlock.h"
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/CallingConv.h"
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/IntrinsicInst.h"
23ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Target/TargetLowering.h"
24b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
25b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmannamespace llvm {
26b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// \brief This is a fast-path instruction selection class that generates poor
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// code and doesn't support illegal types or non-trivial lowering, but runs
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines/// quickly.
30b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanclass FastISel {
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinespublic:
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct ArgListEntry {
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Value *Val;
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Type *Ty;
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsSExt : 1;
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsZExt : 1;
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsInReg : 1;
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsSRet : 1;
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsNest : 1;
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsByVal : 1;
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsInAlloca : 1;
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsReturned : 1;
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    uint16_t Alignment;
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ArgListEntry()
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        : Val(nullptr), Ty(nullptr), IsSExt(false), IsZExt(false),
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          IsInReg(false), IsSRet(false), IsNest(false), IsByVal(false),
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          IsInAlloca(false), IsReturned(false), Alignment(0) {}
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    /// \brief Set CallLoweringInfo attribute flags based on a call instruction
5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    /// and called function attributes.
5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    void setAttributes(ImmutableCallSite *CS, unsigned AttrIdx);
5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  typedef std::vector<ArgListEntry> ArgListTy;
5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
5637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  struct CallLoweringInfo {
5737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    Type *RetTy;
5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool RetSExt : 1;
5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool RetZExt : 1;
6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsVarArg : 1;
6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsInReg : 1;
6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool DoesNotReturn : 1;
6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsReturnValueUsed : 1;
6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // \brief IsTailCall Should be modified by implementations of FastLowerCall
6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    // that perform tail call conversions.
6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    bool IsTailCall;
6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned NumFixedArgs;
7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallingConv::ID CallConv;
7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const Value *Callee;
7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    const char *SymName;
7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ArgListTy Args;
7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ImmutableCallSite *CS;
7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    MachineInstr *Call;
7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned ResultReg;
7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    unsigned NumResultRegs;
7837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    bool IsPatchPoint;
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
8137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SmallVector<Value *, 16> OutVals;
8237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SmallVector<ISD::ArgFlagsTy, 16> OutFlags;
8337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SmallVector<unsigned, 16> OutRegs;
8437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SmallVector<ISD::InputArg, 4> Ins;
8537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    SmallVector<unsigned, 4> InRegs;
8637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo()
8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines        : RetTy(nullptr), RetSExt(false), RetZExt(false), IsVarArg(false),
8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          IsInReg(false), DoesNotReturn(false), IsReturnValueUsed(true),
9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          IsTailCall(false), NumFixedArgs(-1), CallConv(CallingConv::C),
9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines          Callee(nullptr), SymName(nullptr), CS(nullptr), Call(nullptr),
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines          ResultReg(0), NumResultRegs(0), IsPatchPoint(false) {}
9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                const Value *Target, ArgListTy &&ArgsList,
9637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                ImmutableCallSite &Call) {
9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetTy = ResultTy;
9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Callee = Target;
9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
10037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsInReg = Call.paramHasAttr(0, Attribute::InReg);
10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      DoesNotReturn = Call.doesNotReturn();
10237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsVarArg = FuncTy->isVarArg();
10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsReturnValueUsed = !Call.getInstruction()->use_empty();
10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetSExt = Call.paramHasAttr(0, Attribute::SExt);
10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetZExt = Call.paramHasAttr(0, Attribute::ZExt);
10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
10737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CallConv = Call.getCallingConv();
10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Args = std::move(ArgsList);
10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      NumFixedArgs = FuncTy->getNumParams();
11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CS = &Call;
11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *this;
11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo &setCallee(Type *ResultTy, FunctionType *FuncTy,
11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                const char *Target, ArgListTy &&ArgsList,
11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                ImmutableCallSite &Call,
11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                unsigned FixedArgs = ~0U) {
12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetTy = ResultTy;
12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Callee = Call.getCalledValue();
12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      SymName = Target;
12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsInReg = Call.paramHasAttr(0, Attribute::InReg);
12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      DoesNotReturn = Call.doesNotReturn();
12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsVarArg = FuncTy->isVarArg();
12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsReturnValueUsed = !Call.getInstruction()->use_empty();
12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetSExt = Call.paramHasAttr(0, Attribute::SExt);
12937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetZExt = Call.paramHasAttr(0, Attribute::ZExt);
13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CallConv = Call.getCallingConv();
13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Args = std::move(ArgsList);
13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      NumFixedArgs = (FixedArgs == ~0U) ? FuncTy->getNumParams() : FixedArgs;
13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
13537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CS = &Call;
13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *this;
13837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                const Value *Target, ArgListTy &&ArgsList,
14237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                unsigned FixedArgs = ~0U) {
14337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetTy = ResultTy;
14437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Callee = Target;
14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CallConv = CC;
14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Args = std::move(ArgsList);
14737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      NumFixedArgs = (FixedArgs == ~0U) ? Args.size() : FixedArgs;
14837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *this;
14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
15037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo &setCallee(CallingConv::ID CC, Type *ResultTy,
15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                const char *Target, ArgListTy &&ArgsList,
15337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                unsigned FixedArgs = ~0U) {
15437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      RetTy = ResultTy;
15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      SymName = Target;
15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      CallConv = CC;
15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Args = std::move(ArgsList);
15837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      NumFixedArgs = (FixedArgs == ~0U) ? Args.size() : FixedArgs;
15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *this;
16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
16237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    CallLoweringInfo &setTailCall(bool Value = true) {
16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      IsTailCall = Value;
16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return *this;
16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
167ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    CallLoweringInfo &setIsPatchPoint(bool Value = true) {
168ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      IsPatchPoint = Value;
169ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      return *this;
170ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    }
171ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    ArgListTy &getArgs() { return Args; }
17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    void clearOuts() {
17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      OutVals.clear();
17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      OutFlags.clear();
17737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      OutRegs.clear();
17837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
17937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
18037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    void clearIns() {
18137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      Ins.clear();
18237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      InRegs.clear();
18337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
18437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  };
18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
18622bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohmanprotected:
187104e4ce1629ea84736691bd1ee7867bdf90e8a2eDan Gohman  DenseMap<const Value *, unsigned> LocalValueMap;
188a4160c3434b08288d1f79f1acbe453d1b9610b22Dan Gohman  FunctionLoweringInfo &FuncInfo;
189c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MachineFunction *MF;
190bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  MachineRegisterInfo &MRI;
1910586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  MachineFrameInfo &MFI;
1920586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman  MachineConstantPool &MCP;
19336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DebugLoc DbgLoc;
19422bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman  const TargetMachine &TM;
19536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  const DataLayout &DL;
196bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman  const TargetInstrInfo &TII;
19722bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman  const TargetLowering &TLI;
198db4971259ce94cea26e555e9ade82672a3581f5cDan Gohman  const TargetRegisterInfo &TRI;
199d49edb7ab098fa0c82f59efbcf1b4eb2958f8dc3Bob Wilson  const TargetLibraryInfo *LibInfo;
20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool SkipTargetIndependentISel;
20174af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief The position of the last instruction for materializing constants
20337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// for use in the current block. It resets to EmitStartPt when it makes sense
20437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// (for example, it's usually profitable to avoid function calls between the
2057d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// definition and the use)
20684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  MachineInstr *LastLocalValue;
207b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
20837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief The top most instruction in the current block that is allowed for
20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// emitting local variables. LastLocalValue resets to EmitStartPt when it
21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// makes sense (for example, on function calls)
21174af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  MachineInstr *EmitStartPt;
21274af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
213b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanpublic:
21437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Return the position of the last instruction emitted for
21537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// materializing constants for use in the current block.
21684023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  MachineInstr *getLastLocalValue() { return LastLocalValue; }
21784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
21837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Update the position of the last instruction emitted for
21937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// materializing constants for use in the current block.
22074af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  void setLastLocalValue(MachineInstr *I) {
22174af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin    EmitStartPt = I;
22274af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin    LastLocalValue = I;
22374af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  }
22484023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
22537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Set the current block to which generated machine instructions will
22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// be appended, and clear the local CSE map.
22784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  void startNewBlock();
228241f464d24a6c22721607841069bbeb17b3f71e6Dan Gohman
22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Return current debug location information.
23036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DebugLoc getCurDebugLoc() const { return DbgLoc; }
231390f3ace34855a3d4c9e0adf468976375f8c6dc1Devang Patel
23237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Do "fast" instruction selection for function arguments and append
23337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// the machine instructions to the current block. Returns true when
23437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// successful.
23537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool lowerArguments();
23637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
23737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Do "fast" instruction selection for the given LLVM IR instruction
23837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// and append the generated machine instructions to the current block.
23937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// Returns true if selection was successful.
24037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectInstruction(const Instruction *I);
241b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
24237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Do "fast" instruction selection for the given LLVM IR operator
2437d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// (Instruction or ConstantExpr), and append generated machine instructions
2447d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// to the current block. Return true if selection was successful.
24537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectOperator(const User *I, unsigned Opcode);
24640b189e4e257924d90aaf63bf2e12bc7bbca961aDan Gohman
24737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Create a virtual register and arrange for it to be assigned the
24837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// value for the given LLVM value.
24946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  unsigned getRegForValue(const Value *V);
25099b218218c0ca3ebfdd568ddfeafa07842e9d69dDan Gohman
25137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Look up the value to see if its value is already cached in a
25237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// register. It may be defined by instructions across blocks or defined
25337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// locally.
25446510a73e977273ec67747eb34cbdb43f815e451Dan Gohman  unsigned lookUpRegForValue(const Value *V);
25559fbc80f6b3b5c71dfb84149f589625f7ed510e3Evan Cheng
25637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This is a wrapper around getRegForValue that also takes care of
25737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// truncating or sign-extending the given getelementptr index value.
258a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman  std::pair<unsigned, bool> getRegForGEPIndex(const Value *V);
259c8a1a3c426209e9c7b35e279e1578a89edc40af6Dan Gohman
2607d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief We're checking to see if we can fold \p LI into \p FoldInst. Note
2617d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// that we could have a sequence where multiple LLVM IR instructions are
2627d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// folded into the same machineinstr.  For example we could have:
2637d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
26475299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   A: x = load i32 *P
26575299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   B: y = icmp A, 42
26675299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///   C: br y, ...
26775299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///
2687d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// In this scenario, \p LI is "A", and \p FoldInst is "C".  We know about "B"
2697d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// (and any other folded instructions) because it is between A and C.
27075299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  ///
27175299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  /// If we succeed folding, return true.
27275299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  bool tryToFoldLoad(const LoadInst *LI, const Instruction *FoldInst);
27375299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky
2747d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief The specified machine instr operand is a vreg, and that vreg is
2757d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// being provided by the specified load instruction.  If possible, try to
2767d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// fold the load as an operand to the instruction, returning true if
277beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner  /// possible.
2787d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
27975299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  /// This method should be implemented by targets.
28075299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky  virtual bool tryToFoldLoadIntoMI(MachineInstr * /*MI*/, unsigned /*OpNo*/,
28175299e3a95c0cfcade8515c603e7802351a11beeEli Bendersky                                   const LoadInst * /*LI*/) {
282beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner    return false;
283beac75da3784929aee9f0357fc5cd76d49d6c3d7Chris Lattner  }
2842ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
28537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Reset InsertPt to prepare for inserting instructions into the
28637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// current block.
28784023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman  void recomputeInsertPt();
28884023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
28937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Remove all dead instructions between the I and E.
290425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier  void removeDeadCode(MachineBasicBlock::iterator I,
291425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier                      MachineBasicBlock::iterator E);
292425e951734c3a0615e22ec94ffa51cc16ce6e483Chad Rosier
29376ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  struct SavePoint {
29476ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher    MachineBasicBlock::iterator InsertPt;
29576ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher    DebugLoc DL;
29676ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  };
29776ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher
29837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Prepare InsertPt to begin inserting instructions into the local
29937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// value area and return the old insert position.
30076ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  SavePoint enterLocalValueArea();
30184023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
30237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Reset InsertPt to the given old insert position.
30376ad43c6e1619ed4c087b8ccb2cd573eb9d7093eEric Christopher  void leaveLocalValueArea(SavePoint Old);
30484023e0fbefc406a4c611d3d64a10df5d3a97dd7Dan Gohman
305cc8430f742b0f1e567292c8a776e94fc1c930b2aDan Gohman  virtual ~FastISel();
306cc8430f742b0f1e567292c8a776e94fc1c930b2aDan Gohman
307b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanprotected:
30837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  explicit FastISel(FunctionLoweringInfo &FuncInfo,
30937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                    const TargetLibraryInfo *LibInfo,
31037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                    bool SkipTargetIndependentISel = false);
31137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
31237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code when the normal
31337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// FastISel process fails to select an instruction. This gives targets a
31437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// chance to emit code for anything that doesn't fit into FastISel's
31537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// framework. It returns true if it was successful.
31637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual bool fastSelectInstruction(const Instruction *I) = 0;
31737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
31837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to do target-
31937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// specific argument lowering. It returns true if it was successful.
32037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual bool fastLowerArguments();
32137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
32237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to do target-
32337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// specific call lowering. It returns true if it was successful.
32437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual bool fastLowerCall(CallLoweringInfo &CLI);
32537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
32637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to do target-
32737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// specific intrinsic lowering. It returns true if it was successful.
32837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual bool fastLowerIntrinsicCall(const IntrinsicInst *II);
32937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
33037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3317d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type and opcode be emitted.
33237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_(MVT VT, MVT RetVT, unsigned Opcode);
333bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
33437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3357d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register operand be emitted.
33637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_r(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
33737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                              bool Op0IsKill);
338bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
33937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3407d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register operands be emitted.
34137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_rr(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
34237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                               bool Op0IsKill, unsigned Op1, bool Op1IsKill);
343b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
34437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3457d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and immediate
34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  // operands be emitted.
34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_ri(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
34837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                               bool Op0IsKill, uint64_t Imm);
349d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman
35037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3517d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and floating-point
3527d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// immediate operands be emitted.
35337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_rf(MVT VT, MVT RetVT, unsigned Opcode, unsigned Op0,
35437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                               bool Op0IsKill, const ConstantFP *FPImm);
35510df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3577d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and register and immediate
3587d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// operands be emitted.
35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_rri(MVT VT, MVT RetVT, unsigned Opcode,
36037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                unsigned Op0, bool Op0IsKill, unsigned Op1,
36137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                bool Op1IsKill, uint64_t Imm);
36237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
36337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is a wrapper of fastEmit_ri.
36437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ///
3657d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// It first tries to emit an instruction with an immediate operand using
36637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// fastEmit_ri.  If that fails, it materializes the immediate into a register
36737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// and try fastEmit_rr instead.
36837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmit_ri_(MVT VT, unsigned Opcode, unsigned Op0, bool Op0IsKill,
369a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                        uint64_t Imm, MVT ImmType);
3702ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
37137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3727d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and immediate operand be emitted.
37337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_i(MVT VT, MVT RetVT, unsigned Opcode, uint64_t Imm);
37483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng
37537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief This method is called by target-independent code to request that an
3767d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instruction with the given type, opcode, and floating-point immediate
3777d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// operand be emitted.
37837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastEmit_f(MVT VT, MVT RetVT, unsigned Opcode,
37946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman                              const ConstantFP *FPImm);
38010df0fa73e396bbc93a8940e8b53827390c54d10Dan Gohman
38137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with no operands and a result register in the
38237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// given register class.
38337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_(unsigned MachineInstOpcode,
384b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                         const TargetRegisterClass *RC);
385bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman
38637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with one register operand and a result register
38737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// in the given register class.
38837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_r(unsigned MachineInstOpcode,
38937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                          const TargetRegisterClass *RC, unsigned Op0,
39037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                          bool Op0IsKill);
39137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
39237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with two register operands and a result
39337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// register in the given register class.
39437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rr(unsigned MachineInstOpcode,
39537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           const TargetRegisterClass *RC, unsigned Op0,
39637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           bool Op0IsKill, unsigned Op1, bool Op1IsKill);
39737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
39837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with three register operands and a result
3997d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// register in the given register class.
40037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rrr(unsigned MachineInstOpcode,
40137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            const TargetRegisterClass *RC, unsigned Op0,
40237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            bool Op0IsKill, unsigned Op1, bool Op1IsKill,
40337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            unsigned Op2, bool Op2IsKill);
40437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
40537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with a register operand, an immediate, and a
40637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// result register in the given register class.
40737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_ri(unsigned MachineInstOpcode,
40837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           const TargetRegisterClass *RC, unsigned Op0,
40937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           bool Op0IsKill, uint64_t Imm);
41037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
41137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with one register operand and two immediate
41237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// operands.
41337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rii(unsigned MachineInstOpcode,
41437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            const TargetRegisterClass *RC, unsigned Op0,
41537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            bool Op0IsKill, uint64_t Imm1, uint64_t Imm2);
41637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
41737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with two register operands and a result
4187d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// register in the given register class.
41937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rf(unsigned MachineInstOpcode,
42037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           const TargetRegisterClass *RC, unsigned Op0,
42137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           bool Op0IsKill, const ConstantFP *FPImm);
42237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
42337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with two register operands, an immediate, and a
42437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// result register in the given register class.
42537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rri(unsigned MachineInstOpcode,
42637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            const TargetRegisterClass *RC, unsigned Op0,
42737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                            bool Op0IsKill, unsigned Op1, bool Op1IsKill,
428a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                            uint64_t Imm);
4292ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
43037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with two register operands, two immediates
43137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// operands, and a result register in the given register class.
43237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_rrii(unsigned MachineInstOpcode,
43337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                             const TargetRegisterClass *RC, unsigned Op0,
43437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                             bool Op0IsKill, unsigned Op1, bool Op1IsKill,
43568f25571e759c1fcf2da206109647259f49f7416Manman Ren                             uint64_t Imm1, uint64_t Imm2);
43668f25571e759c1fcf2da206109647259f49f7416Manman Ren
43737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with a single immediate operand, and a result
43837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// register in the given register class.
43937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_i(unsigned MachineInstrOpcode,
44037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                          const TargetRegisterClass *RC, uint64_t Imm);
44137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
44237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr with a two immediate operands.
44337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_ii(unsigned MachineInstrOpcode,
44437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           const TargetRegisterClass *RC, uint64_t Imm1,
44537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                           uint64_t Imm2);
44637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
44737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a MachineInstr for an extract_subreg from a specified index of
44837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// a superregister to a specified type.
44937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitInst_extractsubreg(MVT RetVT, unsigned Op0, bool Op0IsKill,
450a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman                                      uint32_t Idx);
4518970f00deff00ffce1f35cf00883357e1582daa1Owen Anderson
45237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit MachineInstrs to compute the value of Op with all but the
45337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// least significant bit set to zero.
45437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned fastEmitZExtFromI1(MVT VT, unsigned Op0, bool Op0IsKill);
45514ea1ec2324cb595f2e035bbf54ddcd483f17c11Dan Gohman
45637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit an unconditional branch to the given block, unless it is the
4577d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// immediate (fall-through) successor, and update the CFG.
45837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void fastEmitBranch(MachineBasicBlock *MBB, DebugLoc DL);
459d98d6203e429b2d7208b6687931e9079e85e95ecDan Gohman
46037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Update the value map to include the new mapping for this
46137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// instruction, or insert an extra copy to get the result in a previous
46237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// determined register.
46337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  ///
46437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// NOTE: This is only necessary because we might select a block that uses a
46537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// value before we select the block that defines the value. It might be
46637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// possible to fix this by selecting blocks in reverse postorder.
46737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  void updateValueMap(const Value *I, unsigned Reg, unsigned NumRegs = 1);
468ea09f4f4691a0db65772b54fe8163a48c9dce01dEvan Cheng
469c7f72de3b4ef21828ea4780f0693bf0acd04e1c5Dan Gohman  unsigned createResultReg(const TargetRegisterClass *RC);
4702ce5bf188dfa4329eb246df6011dd1edde5a5979Owen Anderson
47137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Try to constrain Op so that it is usable by argument OpNum of the
47237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// provided MCInstrDesc. If this fails, create a new virtual register in the
47337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// correct class and COPY the value there.
474dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  unsigned constrainOperandRegClass(const MCInstrDesc &II, unsigned Op,
475dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines                                    unsigned OpNum);
476dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
47737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit a constant in a register using target-specific logic, such as
4787d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// constant pool loads.
47937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastMaterializeConstant(const Constant *C) { return 0; }
4800586d91bb3e516d5826826522d9a90ed6ef74d86Dan Gohman
48137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit an alloca address in a register using target-specific logic.
48237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastMaterializeAlloca(const AllocaInst *C) { return 0; }
483c7f72de3b4ef21828ea4780f0693bf0acd04e1c5Dan Gohman
48437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Emit the floating-point constant +0.0 in a register using target-
48537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// specific logic.
48637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  virtual unsigned fastMaterializeFloatZero(const ConstantFP *CF) {
4872790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman    return 0;
4882790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman  }
4892790ba8e5a7bb6e00fdac9997d840598fb60271cEli Friedman
490cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// \brief Check if \c Add is an add that can be safely folded into \c GEP.
491cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  ///
492cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// \c Add can be folded into \c GEP if:
493cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add is an add,
494cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add's size matches \c GEP's,
495cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add is in the same basic block as \c GEP, and
496cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  /// - \c Add has a constant operand.
497cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson  bool canFoldAddIntoGEP(const User *GEP, const Value *Add);
498cc7052343e5e955d4e2f48885c06360f9003390aBob Wilson
49937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Test whether the given value has exactly one use.
50037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool hasTrivialKill(const Value *V);
501c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
502c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  /// \brief Create a machine mem operand from the given instruction.
503c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  MachineMemOperand *createMachineMemOperandFor(const Instruction *I) const;
504c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines
50537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  CmpInst::Predicate optimizeCmpPredicate(const CmpInst *CI) const;
50637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
50737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool lowerCallTo(const CallInst *CI, const char *SymName, unsigned NumArgs);
50837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool lowerCallTo(CallLoweringInfo &CLI);
50937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
51037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool isCommutativeIntrinsic(IntrinsicInst const *II) {
51137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    switch (II->getIntrinsicID()) {
51237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case Intrinsic::sadd_with_overflow:
51337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case Intrinsic::uadd_with_overflow:
51437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case Intrinsic::smul_with_overflow:
51537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    case Intrinsic::umul_with_overflow:
51637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return true;
51737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    default:
51837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines      return false;
51937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    }
52037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  }
521e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman
5222586b8f9366aed5a1efa44d3f18d095511601642Eli Friedman
52337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool lowerCall(const CallInst *I);
52437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Select and emit code for a binary operator instruction, which has
52537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// an opcode which directly corresponds to the given ISD opcode.
52637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectBinaryOp(const User *I, unsigned ISDOpcode);
52737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectFNeg(const User *I);
52837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectGetElementPtr(const User *I);
52937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectStackmap(const CallInst *I);
53037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectPatchpoint(const CallInst *I);
53137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectCall(const User *Call);
53237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectIntrinsicCall(const IntrinsicInst *II);
53337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectBitCast(const User *I);
53437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectCast(const User *I, unsigned Opcode);
53537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectExtractValue(const User *I);
53637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool selectInsertValue(const User *I);
537cd462d055ffc18a526a9a1d343261d8550e99280Chad Rosier
53837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate:
5397d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// \brief Handle PHI nodes in successor blocks.
5407d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  ///
541e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman  /// Emit code to ensure constants are copied into registers when needed.
542e8c92dd439581bec7e3516cbdbea74e2e60fe7f0Dan Gohman  /// Remember the virtual registers that need to be added to the Machine PHI
5437d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// nodes as input.  We cannot just directly add them, because expansion might
5447d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// result in multiple MBB's for one BB.  As such, the start of the BB might
5457d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// correspond to a different MBB than the end.
54637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB);
5471fdc614bee2a324fcc210d1e46d9b6fca3ca324bDan Gohman
54837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Helper for materializeRegForValue to materialize a constant in a
54937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// target-independent way.
55037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  unsigned materializeConstant(const Value *V, MVT VT);
55137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
55237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Helper for getRegForVale. This function is called when the value
55337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// isn't already available in a register and must be materialized with new
5547d185e4e5b1da7e07e1c3b9539e2c9bc8e983e62Michael Gottesman  /// instructions.
5551fdc614bee2a324fcc210d1e46d9b6fca3ca324bDan Gohman  unsigned materializeRegForValue(const Value *V, MVT VT);
556a6cb641f48df20f6f79018569b519e5a32e897a2Dan Gohman
55737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Clears LocalValueMap and moves the area for the new local variables
55837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// to the beginning of the block. It helps to avoid spilling cached variables
55937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// across heavy instructions like calls.
56074af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin  void flushLocalValueMap();
56174af88a6661ad5185924bf39164fb4aa144d32cfIvan Krasin
56237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Insertion point before trying to select the current instruction.
56337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  MachineBasicBlock::iterator SavedInsertPt;
56437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
56537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// \brief Add a stackmap or patchpoint intrinsic call's live variable
56637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  /// operands to a stackmap or patchpoint machine instruction.
567c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines  bool addStackMapLiveVars(SmallVectorImpl<MachineOperand> &Ops,
568c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines                           const CallInst *CI, unsigned StartIdx);
56937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  bool lowerCallOperands(const CallInst *CI, unsigned ArgIdx, unsigned NumArgs,
57037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                         const Value *Callee, bool ForceRetVoidTy,
57137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                         CallLoweringInfo &CLI);
572b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman};
573b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
57437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} // end namespace llvm
575b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman
576b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#endif
577