FastISel.cpp revision 6d0c25ec3a7ca822e68f73a4481eee43eb5c9485
1b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman///===-- FastISel.cpp - Implementation of the FastISel class --------------===// 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//===----------------------------------------------------------------------===// 9b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 10b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// This file contains the implementation of the FastISel class. 11b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman// 12b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman//===----------------------------------------------------------------------===// 13b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 146f2766d59744bb3d48867f3151643eac7111e773Dan Gohman#include "llvm/Instructions.h" 15b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/FastISel.h" 16b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineInstrBuilder.h" 17b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/CodeGen/MachineRegisterInfo.h" 1883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetData.h" 19b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "llvm/Target/TargetInstrInfo.h" 2083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng#include "llvm/Target/TargetLowering.h" 21bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman#include "llvm/Target/TargetMachine.h" 22b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanusing namespace llvm; 23b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 24bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// SelectBinaryOp - Select and emit code for a binary operator instruction, 25bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// which has an opcode which directly corresponds to the given ISD opcode. 26bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman/// 27bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohmanbool FastISel::SelectBinaryOp(Instruction *I, ISD::NodeType ISDOpcode, 28bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman DenseMap<const Value*, unsigned> &ValueMap) { 29d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true); 30d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (VT == MVT::Other || !VT.isSimple()) 31d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled type. Halt "fast" selection and bail. 32d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return false; 33d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 34bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman unsigned Op0 = ValueMap[I->getOperand(0)]; 35d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op0 == 0) 36a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman // Unhandled operand. Halt "fast" selection and bail. 37a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman return false; 38a7f2dff98e68ed8b2ac32f953768c04f26b52beaDan Gohman 39d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Check if the second operand is a constant and handle it appropriately. 40d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (ConstantInt *CI = dyn_cast<ConstantInt>(I->getOperand(1))) { 41d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = FastEmit_ri_(VT.getSimpleVT(), ISDOpcode, Op0, 42d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman CI->getZExtValue(), VT.getSimpleVT()); 43d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (ResultReg == 0) 44d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Target-specific code wasn't able to find a machine opcode for 45d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // the given ISD opcode and type. Halt "fast" selection and bail. 46d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return false; 47d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 48d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // We successfully emitted code for the given LLVM Instruction. 49d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman ValueMap[I] = ResultReg; 50d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return true; 51d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman } 52d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 53d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op1 = ValueMap[I->getOperand(1)]; 54d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (Op1 == 0) 55d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman // Unhandled operand. Halt "fast" selection and bail. 56bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 57bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 58bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), ISDOpcode, Op0, Op1); 59bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (ResultReg == 0) 60bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // Target-specific code wasn't able to find a machine opcode for 61bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman // the given ISD opcode and type. Halt "fast" selection and bail. 62bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return false; 63bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 648014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman // We successfully emitted code for the given LLVM Instruction. 65bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman ValueMap[I] = ResultReg; 66bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman return true; 67bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 68bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 69bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohmanbool FastISel::SelectGetElementPtr(Instruction *I, 70bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman DenseMap<const Value*, unsigned> &ValueMap) { 7183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned N = ValueMap[I->getOperand(0)]; 7283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 7383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 7483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 7583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 7683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng const Type *Ty = I->getOperand(0)->getType(); 777a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman MVT::SimpleValueType VT = TLI.getPointerTy().getSimpleVT(); 7883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng for (GetElementPtrInst::op_iterator OI = I->op_begin()+1, E = I->op_end(); 7983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng OI != E; ++OI) { 8083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Value *Idx = *OI; 8183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (const StructType *StTy = dyn_cast<StructType>(Ty)) { 8283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned Field = cast<ConstantInt>(Idx)->getZExtValue(); 8383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (Field) { 8483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Offset 8583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = TD.getStructLayout(StTy)->getElementOffset(Field); 8683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // FIXME: This can be optimized by combining the add with a 8783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // subsequent one. 887a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 8983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 9083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 9183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 9283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 9383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = StTy->getElementType(Field); 9483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } else { 9583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng Ty = cast<SequentialType>(Ty)->getElementType(); 9683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 9783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // If this is a constant subscript, handle it quickly. 9883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ConstantInt *CI = dyn_cast<ConstantInt>(Idx)) { 9983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (CI->getZExtValue() == 0) continue; 10083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t Offs = 10183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng TD.getABITypeSize(Ty)*cast<ConstantInt>(CI)->getSExtValue(); 1027a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_ri_(VT, ISD::ADD, N, Offs, VT); 10383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 10483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 10583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 10683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng continue; 10783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 10883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 10983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // N = N + Idx * ElementSize; 11083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng uint64_t ElementSize = TD.getABITypeSize(Ty); 11183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned IdxN = ValueMap[Idx]; 11283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 11383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 11483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 11583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 11683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // If the index is smaller or larger than intptr_t, truncate or extend 11783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // it. 1182076aa800e78a2e196eac47cc8413a074a761d8dEvan Cheng MVT IdxVT = MVT::getMVT(Idx->getType(), /*HandleUnknown=*/false); 11983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxVT.bitsLT(VT)) 1207a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman IdxN = FastEmit_r(VT, ISD::SIGN_EXTEND, IdxN); 12183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng else if (IdxVT.bitsGT(VT)) 1227a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman IdxN = FastEmit_r(VT, ISD::TRUNCATE, IdxN); 12383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 12483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 12583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 12683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 127f93cf79505f07cb97597fbc5955462ad7670ca5cDan Gohman if (ElementSize != 1) 128f93cf79505f07cb97597fbc5955462ad7670ca5cDan Gohman IdxN = FastEmit_ri_(VT, ISD::MUL, IdxN, ElementSize, VT); 12983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 13083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 13183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 1327a0e6593d03bd2dd21c3ac7dcf189f1da86b16daDan Gohman N = FastEmit_rr(VT, ISD::ADD, N, IdxN); 13383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 13483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 13583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 13683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 13783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 13883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 13983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // We successfully emitted code for the given LLVM Instruction. 14083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng ValueMap[I] = N; 14183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return true; 142bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 143bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 144b0cf29c5cfff797284b3660dc233e135feb65d9aDan GohmanBasicBlock::iterator 145b7864a9e23be526f4f8cde529a57c8943c61c0c7Dan GohmanFastISel::SelectInstructions(BasicBlock::iterator Begin, 146b7864a9e23be526f4f8cde529a57c8943c61c0c7Dan Gohman BasicBlock::iterator End, 147bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman DenseMap<const Value*, unsigned> &ValueMap, 1486ecf50908c78aae0feff1c378fbb75dcf013ed21Dan Gohman DenseMap<const BasicBlock*, 1493c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman MachineBasicBlock *> &MBBMap, 150bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman MachineBasicBlock *mbb) { 151bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman MBB = mbb; 152b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman BasicBlock::iterator I = Begin; 153b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 154b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman for (; I != End; ++I) { 155b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman switch (I->getOpcode()) { 1568014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman case Instruction::Add: { 1578014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FADD : ISD::ADD; 1588014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman if (!SelectBinaryOp(I, Opc, ValueMap)) return I; break; 1598014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman } 1608014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman case Instruction::Sub: { 1618014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FSUB : ISD::SUB; 1628014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman if (!SelectBinaryOp(I, Opc, ValueMap)) return I; break; 1638014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman } 1648014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman case Instruction::Mul: { 1658014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman ISD::NodeType Opc = I->getType()->isFPOrFPVector() ? ISD::FMUL : ISD::MUL; 1668014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman if (!SelectBinaryOp(I, Opc, ValueMap)) return I; break; 1678014e865800cc911697a4c0c42f077df9fcc9805Dan Gohman } 168bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::SDiv: 169bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::SDIV, ValueMap)) return I; break; 170bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::UDiv: 171bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::UDIV, ValueMap)) return I; break; 172bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::FDiv: 173bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::FDIV, ValueMap)) return I; break; 174bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::SRem: 175bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::SREM, ValueMap)) return I; break; 176bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::URem: 177bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::UREM, ValueMap)) return I; break; 178bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::FRem: 179bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::FREM, ValueMap)) return I; break; 180bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::Shl: 181bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::SHL, ValueMap)) return I; break; 182bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::LShr: 183bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::SRL, ValueMap)) return I; break; 184bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::AShr: 185bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::SRA, ValueMap)) return I; break; 186bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::And: 187bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::AND, ValueMap)) return I; break; 188bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::Or: 189bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::OR, ValueMap)) return I; break; 190bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::Xor: 191bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectBinaryOp(I, ISD::XOR, ValueMap)) return I; break; 192bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 193bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman case Instruction::GetElementPtr: 194bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman if (!SelectGetElementPtr(I, ValueMap)) return I; 195b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman break; 196bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 1976f2766d59744bb3d48867f3151643eac7111e773Dan Gohman case Instruction::Br: { 1986f2766d59744bb3d48867f3151643eac7111e773Dan Gohman BranchInst *BI = cast<BranchInst>(I); 1996f2766d59744bb3d48867f3151643eac7111e773Dan Gohman 200e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman if (BI->isUnconditional()) { 2013c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman MachineFunction::iterator NextMBB = 202e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman next(MachineFunction::iterator(MBB)); 2033c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman BasicBlock *LLVMSucc = BI->getSuccessor(0); 2043c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman MachineBasicBlock *MSucc = MBBMap[LLVMSucc]; 2053c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman 2063c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman if (NextMBB != MF.end() && MSucc == NextMBB) { 2073c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman // The unconditional fall-through case, which needs no instructions. 2083c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman } else { 2093c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman // The unconditional branch case. 2103c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman TII.InsertBranch(*MBB, MSucc, NULL, SmallVector<MachineOperand, 0>()); 211e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman } 2123c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman MBB->addSuccessor(MSucc); 2133c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman break; 2146f2766d59744bb3d48867f3151643eac7111e773Dan Gohman } 2156f2766d59744bb3d48867f3151643eac7111e773Dan Gohman 2163c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman // Conditional branches are not handed yet. 2173c8f36fd03d046ee2a8700c60b5a52887d9f07b9Dan Gohman // Halt "fast" selection and bail. 2186f2766d59744bb3d48867f3151643eac7111e773Dan Gohman return I; 2196f2766d59744bb3d48867f3151643eac7111e773Dan Gohman } 2203b7753be2e899cf3a79835a8ff810e869035c87bDan Gohman 2213b7753be2e899cf3a79835a8ff810e869035c87bDan Gohman case Instruction::PHI: 2223b7753be2e899cf3a79835a8ff810e869035c87bDan Gohman // PHI nodes are already emitted. 2233b7753be2e899cf3a79835a8ff810e869035c87bDan Gohman break; 2246d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 2256d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson case Instruction::BitCast: 2266d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson // BitCast consists of either an immediate to register move 2276d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson // or a register to register move. 2286d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson if (ConstantInt* CI = dyn_cast<ConstantInt>(I->getOperand(0))) { 2296d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson if (I->getType()->isInteger()) { 2306d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/false); 2316d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson ValueMap[I] = FastEmit_i(VT.getSimpleVT(), ISD::Constant, 2326d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson CI->getZExtValue()); 2336d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson break; 2346d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson } else 2356d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson // TODO: Support vector and fp constants. 2366d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson return I; 2376d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson } else 2386d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson // TODO: Support non-constant bitcasts. 2396d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson return I; 2403b7753be2e899cf3a79835a8ff810e869035c87bDan Gohman 241b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman default: 242b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman // Unhandled instruction. Halt "fast" selection and bail. 243b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return I; 244b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 245b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 246b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 247b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return I; 248b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 249b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 250bb466331e7e50d03497ce40ee344870236fd9c32Dan GohmanFastISel::FastISel(MachineFunction &mf) 25122bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman : MF(mf), 25222bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman MRI(mf.getRegInfo()), 25322bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TM(mf.getTarget()), 25422bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TD(*TM.getTargetData()), 25522bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TII(*TM.getInstrInfo()), 25622bb31103de3337f0bb74c7bee16d1817d4dca14Dan Gohman TLI(*TM.getTargetLowering()) { 257bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman} 258bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman 259e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {} 260e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman 261b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_(MVT::SimpleValueType, ISD::NodeType) { 262b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 263b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 264b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 265b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_r(MVT::SimpleValueType, ISD::NodeType, 266b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned /*Op0*/) { 267b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 268b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 269b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 270b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_rr(MVT::SimpleValueType, ISD::NodeType, 271b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned /*Op0*/, unsigned /*Op0*/) { 272b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 273b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 274b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 2756d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmit_i(MVT::SimpleValueType, ISD::NodeType, 2766d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson uint64_t /*Imm*/) { 27783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 27883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 27983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 28083785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri(MVT::SimpleValueType, ISD::NodeType, 281d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, uint64_t /*Imm*/) { 282d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 283d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 284d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 285d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmit_rri(MVT::SimpleValueType, ISD::NodeType, 286d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, unsigned /*Op1*/, 287d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman uint64_t /*Imm*/) { 28883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 28983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 29083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 29183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 29283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri. 29383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try 29483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead. 29583785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 296d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm, 297d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT::SimpleValueType ImmType) { 29883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned ResultReg = 0; 29983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // First check if immediate type is legal. If not, we can't use the ri form. 30083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (TLI.getOperationAction(ISD::Constant, ImmType) == TargetLowering::Legal) 301d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman ResultReg = FastEmit_ri(VT, Opcode, Op0, Imm); 30283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ResultReg != 0) 30383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return ResultReg; 3046d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson unsigned MaterialReg = FastEmit_i(ImmType, ISD::Constant, Imm); 305d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (MaterialReg == 0) 306d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 307d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return FastEmit_rr(VT, Opcode, Op0, MaterialReg); 308d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 309d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 310d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) { 311d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return MRI.createVirtualRegister(RC); 31283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 31383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 314b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 31577ad79689d755c49146f534107421cb3d9703fedDan Gohman const TargetRegisterClass* RC) { 316d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 317bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 318b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 319fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg); 320b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 321b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 322b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 323b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 324b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 325b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0) { 326d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 327bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 328b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 329fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0); 330b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 331b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 332b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 333b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 334b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 335b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0, unsigned Op1) { 336d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 337bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 338b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 339fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1); 340b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 341b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 342d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 343d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode, 344d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 345d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm) { 346d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 347d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 348d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 349d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Imm); 350d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 351d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 352d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 353d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode, 354d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 355d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, unsigned Op1, uint64_t Imm) { 356d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 357d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 358d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 359d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm); 360d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 361d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 3626d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 3636d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Andersonunsigned FastISel::FastEmitInst_i(unsigned MachineInstOpcode, 3646d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetRegisterClass *RC, 3656d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson uint64_t Imm) { 3666d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson unsigned ResultReg = createResultReg(RC); 3676d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson const TargetInstrDesc &II = TII.get(MachineInstOpcode); 3686d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson 3696d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson BuildMI(MBB, II, ResultReg).addImm(Imm); 3706d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson return ResultReg; 3716d0c25ec3a7ca822e68f73a4481eee43eb5c9485Owen Anderson}