FastISel.cpp revision 0193cd4779ab0f4f0bf5cec1dc8e61039d8263ad
1///===-- FastISel.cpp - Implementation of the FastISel class --------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the implementation of the FastISel class. 11// 12//===----------------------------------------------------------------------===// 13 14#include "llvm/Instructions.h" 15#include "llvm/CodeGen/FastISel.h" 16#include "llvm/CodeGen/MachineInstrBuilder.h" 17#include "llvm/CodeGen/MachineRegisterInfo.h" 18#include "llvm/Target/TargetInstrInfo.h" 19using namespace llvm; 20 21BasicBlock::iterator 22FastISel::SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End, 23 DenseMap<const Value*, unsigned> &ValueMap) { 24 BasicBlock::iterator I = Begin; 25 26 for (; I != End; ++I) { 27 switch (I->getOpcode()) { 28 case Instruction::Add: { 29 unsigned Op0 = ValueMap[I->getOperand(0)]; 30 unsigned Op1 = ValueMap[I->getOperand(1)]; 31 MVT VT = MVT::getMVT(I->getType(), /*HandleUnknown=*/true); 32 if (VT == MVT::Other || !VT.isSimple()) { 33 // Unhandled type. Halt "fast" selection and bail. 34 return I; 35 } 36 unsigned ResultReg = FastEmit_rr(VT.getSimpleVT(), ISD::ADD, Op0, Op1); 37 if (ResultReg == 0) { 38 // Target-specific code wasn't able to find a machine opcode for 39 // the given ISD opcode and type. Halt "fast" selection and bail. 40 return I; 41 } 42 ValueMap[I] = ResultReg; 43 break; 44 } 45 case Instruction::Br: { 46 BranchInst *BI = cast<BranchInst>(I); 47 48 // For now, check for and handle just the most trivial case: an 49 // unconditional fall-through branch. 50 if (BI->isUnconditional() && 51 next(MachineFunction::iterator(MBB))->getBasicBlock() == 52 BI->getSuccessor(0)) { 53 MBB->addSuccessor(next(MachineFunction::iterator(MBB))); 54 break; 55 } 56 57 // Something more complicated. Halt "fast" selection and bail. 58 return I; 59 } 60 default: 61 // Unhandled instruction. Halt "fast" selection and bail. 62 return I; 63 } 64 } 65 66 return I; 67} 68 69FastISel::~FastISel() {} 70 71unsigned FastISel::FastEmit_(MVT::SimpleValueType, ISD::NodeType) { 72 return 0; 73} 74 75unsigned FastISel::FastEmit_r(MVT::SimpleValueType, ISD::NodeType, 76 unsigned /*Op0*/) { 77 return 0; 78} 79 80unsigned FastISel::FastEmit_rr(MVT::SimpleValueType, ISD::NodeType, 81 unsigned /*Op0*/, unsigned /*Op0*/) { 82 return 0; 83} 84 85unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode, 86 const TargetRegisterClass* RC) { 87 MachineRegisterInfo &MRI = MF->getRegInfo(); 88 const TargetInstrDesc &II = TII->get(MachineInstOpcode); 89 unsigned ResultReg = MRI.createVirtualRegister(RC); 90 91 MachineInstr *MI = BuildMI(*MF, II, ResultReg); 92 93 MBB->push_back(MI); 94 return ResultReg; 95} 96 97unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode, 98 const TargetRegisterClass *RC, 99 unsigned Op0) { 100 MachineRegisterInfo &MRI = MF->getRegInfo(); 101 const TargetInstrDesc &II = TII->get(MachineInstOpcode); 102 unsigned ResultReg = MRI.createVirtualRegister(RC); 103 104 MachineInstr *MI = BuildMI(*MF, II, ResultReg); 105 MI->addOperand(MachineOperand::CreateReg(Op0, false)); 106 107 MBB->push_back(MI); 108 return ResultReg; 109} 110 111unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode, 112 const TargetRegisterClass *RC, 113 unsigned Op0, unsigned Op1) { 114 MachineRegisterInfo &MRI = MF->getRegInfo(); 115 const TargetInstrDesc &II = TII->get(MachineInstOpcode); 116 unsigned ResultReg = MRI.createVirtualRegister(RC); 117 118 MachineInstr *MI = BuildMI(*MF, II, ResultReg); 119 MI->addOperand(MachineOperand::CreateReg(Op0, false)); 120 MI->addOperand(MachineOperand::CreateReg(Op1, false)); 121 122 MBB->push_back(MI); 123 return ResultReg; 124} 125