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