FastISel.cpp revision d5fe57d2f980c6bd1a61450f99c254a76d0f1683
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(); 772076aa800e78a2e196eac47cc8413a074a761d8dEvan Cheng MVT VT = MVT::getMVT(Ty, /*HandleUnknown=*/false); 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. 88d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman N = FastEmit_ri_(VT.getSimpleVT(), ISD::ADD, N, Offs, VT.getSimpleVT()); 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(); 102d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman N = FastEmit_ri_(VT.getSimpleVT(), ISD::ADD, N, Offs, VT.getSimpleVT()); 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)) 12083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng IdxN = FastEmit_r(VT.getSimpleVT(), ISD::SIGN_EXTEND, IdxN); 12183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng else if (IdxVT.bitsGT(VT)) 12283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng IdxN = FastEmit_r(VT.getSimpleVT(), ISD::TRUNCATE, IdxN); 12383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 12483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 12583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 12683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 12783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // FIXME: If multiple is power of two, turn it into a shift. The 12883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // optimization should be in FastEmit_ri? 129d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman IdxN = FastEmit_ri_(VT.getSimpleVT(), ISD::MUL, IdxN, 130d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman ElementSize, VT.getSimpleVT()); 13183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (IdxN == 0) 13283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 13383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 13483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng N = FastEmit_rr(VT.getSimpleVT(), ISD::ADD, N, IdxN); 13583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (N == 0) 13683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // Unhandled operand. Halt "fast" selection and bail. 13783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return false; 13883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 13983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng } 14083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 14183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // We successfully emitted code for the given LLVM Instruction. 14283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng ValueMap[I] = N; 14383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return true; 144bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman} 145bdedd4477331b3b0d28d74658baf05f675f2d195Dan Gohman 146b0cf29c5cfff797284b3660dc233e135feb65d9aDan GohmanBasicBlock::iterator 147b7864a9e23be526f4f8cde529a57c8943c61c0c7Dan GohmanFastISel::SelectInstructions(BasicBlock::iterator Begin, 148b7864a9e23be526f4f8cde529a57c8943c61c0c7Dan Gohman BasicBlock::iterator End, 149bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman DenseMap<const Value*, unsigned> &ValueMap, 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 2006f2766d59744bb3d48867f3151643eac7111e773Dan Gohman // For now, check for and handle just the most trivial case: an 2016f2766d59744bb3d48867f3151643eac7111e773Dan Gohman // unconditional fall-through branch. 202e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman if (BI->isUnconditional()) { 203e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman MachineFunction::iterator NextMBB = 204e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman next(MachineFunction::iterator(MBB)); 205bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman if (NextMBB != MF.end() && 206e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman NextMBB->getBasicBlock() == BI->getSuccessor(0)) { 207e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman MBB->addSuccessor(NextMBB); 208e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman break; 209e6798b757acb3a2077c2498e9913fff2f5e4325cDan Gohman } 2106f2766d59744bb3d48867f3151643eac7111e773Dan Gohman } 2116f2766d59744bb3d48867f3151643eac7111e773Dan Gohman 2126f2766d59744bb3d48867f3151643eac7111e773Dan Gohman // Something more complicated. Halt "fast" selection and bail. 2136f2766d59744bb3d48867f3151643eac7111e773Dan Gohman return I; 2146f2766d59744bb3d48867f3151643eac7111e773Dan Gohman } 215b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman default: 216b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman // Unhandled instruction. Halt "fast" selection and bail. 217b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return I; 218b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 219b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman } 220b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 221b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return I; 222b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 223b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 224bb466331e7e50d03497ce40ee344870236fd9c32Dan GohmanFastISel::FastISel(MachineFunction &mf) 22583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng : MF(mf), MRI(mf.getRegInfo()), 22683785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng TD(*mf.getTarget().getTargetData()), 22783785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng TII(*mf.getTarget().getInstrInfo()), 22883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng TLI(*mf.getTarget().getTargetLowering()) { 229bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman} 230bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman 231e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan GohmanFastISel::~FastISel() {} 232e285a74f7cf9dd3ccf4fe758576cf83301f8a43eDan Gohman 233b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_(MVT::SimpleValueType, ISD::NodeType) { 234b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 235b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 236b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 237b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_r(MVT::SimpleValueType, ISD::NodeType, 238b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned /*Op0*/) { 239b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 240b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 241b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 242b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmit_rr(MVT::SimpleValueType, ISD::NodeType, 243b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned /*Op0*/, unsigned /*Op0*/) { 244b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return 0; 245b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 246b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 247d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmit_i(MVT::SimpleValueType, uint64_t /*Imm*/) { 24883785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 24983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 25083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 25183785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri(MVT::SimpleValueType, ISD::NodeType, 252d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, uint64_t /*Imm*/) { 253d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 254d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 255d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 256d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmit_rri(MVT::SimpleValueType, ISD::NodeType, 257d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned /*Op0*/, unsigned /*Op1*/, 258d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman uint64_t /*Imm*/) { 25983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return 0; 26083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 26183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 26283785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_ri_ - This method is a wrapper of FastEmit_ri. It first tries 26383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// to emit an instruction with an immediate operand using FastEmit_ri. 26483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// If that fails, it materializes the immediate into a register and try 26583785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng/// FastEmit_rr instead. 26683785c80968165b30fcdd111ceb2c28d38bcff86Evan Chengunsigned FastISel::FastEmit_ri_(MVT::SimpleValueType VT, ISD::NodeType Opcode, 267d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm, 268d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman MVT::SimpleValueType ImmType) { 26983785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng unsigned ResultReg = 0; 27083785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng // First check if immediate type is legal. If not, we can't use the ri form. 27183785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (TLI.getOperationAction(ISD::Constant, ImmType) == TargetLowering::Legal) 272d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman ResultReg = FastEmit_ri(VT, Opcode, Op0, Imm); 27383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng if (ResultReg != 0) 27483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng return ResultReg; 275d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned MaterialReg = FastEmit_i(ImmType, Imm); 276d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman if (MaterialReg == 0) 277d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return 0; 278d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return FastEmit_rr(VT, Opcode, Op0, MaterialReg); 279d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 280d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 281d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::createResultReg(const TargetRegisterClass* RC) { 282d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return MRI.createVirtualRegister(RC); 28383785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng} 28483785c80968165b30fcdd111ceb2c28d38bcff86Evan Cheng 285b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 28677ad79689d755c49146f534107421cb3d9703fedDan Gohman const TargetRegisterClass* RC) { 287d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 288bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 289b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 290fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg); 291b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 292b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 293b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 294b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 295b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 296b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0) { 297d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 298bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 299b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 300fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0); 301b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 302b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 303b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 304b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohmanunsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 305b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman const TargetRegisterClass *RC, 306b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman unsigned Op0, unsigned Op1) { 307d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 308bb466331e7e50d03497ce40ee344870236fd9c32Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 309b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman 310fd903944de8ddcbe88902fa1eca9366eb9641201Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1); 311b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman return ResultReg; 312b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman} 313d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 314d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_ri(unsigned MachineInstOpcode, 315d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 316d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, uint64_t Imm) { 317d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 318d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 319d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 320d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addImm(Imm); 321d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 322d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 323d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 324d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohmanunsigned FastISel::FastEmitInst_rri(unsigned MachineInstOpcode, 325d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetRegisterClass *RC, 326d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned Op0, unsigned Op1, uint64_t Imm) { 327d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman unsigned ResultReg = createResultReg(RC); 328d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman const TargetInstrDesc &II = TII.get(MachineInstOpcode); 329d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman 330d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman BuildMI(MBB, II, ResultReg).addReg(Op0).addReg(Op1).addImm(Imm); 331d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman return ResultReg; 332d5fe57d2f980c6bd1a61450f99c254a76d0f1683Dan Gohman} 333