class MachineBasicBlock;
class MachineFunction;
+class MachineRegisterInfo;
class TargetInstrInfo;
class TargetRegisterClass;
/// lowering, but runs quickly.
class FastISel {
MachineBasicBlock *MBB;
- MachineFunction *MF;
- const TargetInstrInfo *TII;
+ MachineFunction &MF;
+ MachineRegisterInfo &MRI;
+ const TargetInstrInfo &TII;
public:
/// SelectInstructions - Do "fast" instruction selection over the
/// register numbers.
BasicBlock::iterator
SelectInstructions(BasicBlock::iterator Begin, BasicBlock::iterator End,
- DenseMap<const Value*, unsigned> &ValueMap);
+ DenseMap<const Value*, unsigned> &ValueMap,
+ MachineBasicBlock *mbb);
virtual ~FastISel();
protected:
- FastISel(MachineBasicBlock *mbb, MachineFunction *mf,
- const TargetInstrInfo *tii)
- : MBB(mbb), MF(mf), TII(tii) {}
+ explicit FastISel(MachineFunction &mf);
/// FastEmit_r - This method is called by target-independent code
/// to request that an instruction with the given type and opcode
class SDValue;
class SelectionDAG;
class TargetData;
- class TargetInstrInfo;
class TargetMachine;
class TargetRegisterClass;
class TargetSubtarget;
/// createFastISel - This method returns a target specific FastISel object,
/// or null if the target does not support "fast" ISel.
- virtual FastISel *createFastISel(MachineBasicBlock *,
- MachineFunction *,
- const TargetInstrInfo *) { return 0; }
+ virtual FastISel *createFastISel(MachineFunction &) { return 0; }
//===--------------------------------------------------------------------===//
// Inline Asm Support hooks
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/Target/TargetInstrInfo.h"
+#include "llvm/Target/TargetMachine.h"
using namespace llvm;
/// SelectBinaryOp - Select and emit code for a binary operator instruction,
BasicBlock::iterator
FastISel::SelectInstructions(BasicBlock::iterator Begin,
BasicBlock::iterator End,
- DenseMap<const Value*, unsigned> &ValueMap) {
+ DenseMap<const Value*, unsigned> &ValueMap,
+ MachineBasicBlock *mbb) {
+ MBB = mbb;
BasicBlock::iterator I = Begin;
for (; I != End; ++I) {
if (BI->isUnconditional()) {
MachineFunction::iterator NextMBB =
next(MachineFunction::iterator(MBB));
- if (NextMBB != MF->end() &&
+ if (NextMBB != MF.end() &&
NextMBB->getBasicBlock() == BI->getSuccessor(0)) {
MBB->addSuccessor(NextMBB);
break;
return I;
}
+FastISel::FastISel(MachineFunction &mf)
+ : MF(mf), MRI(mf.getRegInfo()), TII(*mf.getTarget().getInstrInfo()) {
+}
+
FastISel::~FastISel() {}
unsigned FastISel::FastEmit_(MVT::SimpleValueType, ISD::NodeType) {
unsigned FastISel::FastEmitInst_(unsigned MachineInstOpcode,
const TargetRegisterClass* RC) {
- MachineRegisterInfo &MRI = MF->getRegInfo();
unsigned ResultReg = MRI.createVirtualRegister(RC);
- const TargetInstrDesc &II = TII->get(MachineInstOpcode);
+ const TargetInstrDesc &II = TII.get(MachineInstOpcode);
- MachineInstr *MI = BuildMI(*MF, II, ResultReg);
+ MachineInstr *MI = BuildMI(MF, II, ResultReg);
MBB->push_back(MI);
return ResultReg;
}
unsigned FastISel::FastEmitInst_r(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0) {
- MachineRegisterInfo &MRI = MF->getRegInfo();
unsigned ResultReg = MRI.createVirtualRegister(RC);
- const TargetInstrDesc &II = TII->get(MachineInstOpcode);
+ const TargetInstrDesc &II = TII.get(MachineInstOpcode);
- MachineInstr *MI = BuildMI(*MF, II, ResultReg).addReg(Op0);
+ MachineInstr *MI = BuildMI(MF, II, ResultReg).addReg(Op0);
MBB->push_back(MI);
return ResultReg;
}
unsigned FastISel::FastEmitInst_rr(unsigned MachineInstOpcode,
const TargetRegisterClass *RC,
unsigned Op0, unsigned Op1) {
- MachineRegisterInfo &MRI = MF->getRegInfo();
unsigned ResultReg = MRI.createVirtualRegister(RC);
- const TargetInstrDesc &II = TII->get(MachineInstOpcode);
+ const TargetInstrDesc &II = TII.get(MachineInstOpcode);
- MachineInstr *MI = BuildMI(*MF, II, ResultReg).addReg(Op0).addReg(Op1);
+ MachineInstr *MI = BuildMI(MF, II, ResultReg).addReg(Op0).addReg(Op1);
MBB->push_back(MI);
return ResultReg;
}
!BB->isLandingPad() &&
isa<BranchInst>(LLVMBB->getTerminator()) &&
cast<BranchInst>(LLVMBB->getTerminator())->isUnconditional()) {
- if (FastISel *F = TLI.createFastISel(BB, &FuncInfo.MF,
- TLI.getTargetMachine().getInstrInfo())) {
- Begin = F->SelectInstructions(Begin, LLVMBB->end(), FuncInfo.ValueMap);
+ if (FastISel *F = TLI.createFastISel(FuncInfo.MF)) {
+ Begin = F->SelectInstructions(Begin, LLVMBB->end(),
+ FuncInfo.ValueMap, BB);
// Clean up the FastISel object. TODO: Reorganize what data is
// stored in the FastISel class itself and what is merely passed
namespace llvm {
class FastISel;
-class MachineBasicBlock;
class MachineFunction;
-class TargetInstrInfo;
namespace X86 {
-FastISel *createFastISel(MachineBasicBlock *mbb, MachineFunction *mf,
- const TargetInstrInfo *tii);
+FastISel *createFastISel(MachineFunction &mf);
} // namespace X86
return false;
}
-FastISel *X86TargetLowering::createFastISel(MachineBasicBlock *mbb,
- MachineFunction *mf,
- const TargetInstrInfo *tii) {
- return X86::createFastISel(mbb, mf, tii);
+FastISel *X86TargetLowering::createFastISel(MachineFunction &mf) {
+ return X86::createFastISel(mf);
}
/// createFastISel - This method returns a target specific FastISel object,
/// or null if the target does not support "fast" ISel.
- virtual FastISel *createFastISel(MachineBasicBlock *mbb,
- MachineFunction *mf,
- const TargetInstrInfo *tii);
+ virtual FastISel *createFastISel(MachineFunction &mf);
private:
/// Subtarget - Keep a pointer to the X86Subtarget around so that we can
OS << ");\n";
}
OS << "public:\n";
- OS << " FastISel(MachineBasicBlock *mbb, MachineFunction *mf, ";
- OS << "const TargetInstrInfo *tii) : llvm::FastISel(mbb, mf, tii) {}\n";
+ OS << " explicit FastISel(MachineFunction &mf) : llvm::FastISel(mf) {}\n";
OS << "};\n";
OS << "\n";
// Define the target FastISel creation function.
OS << "llvm::FastISel *" << InstNS
- << "createFastISel(MachineBasicBlock *mbb, MachineFunction *mf, ";
- OS << "const TargetInstrInfo *tii) {\n";
- OS << " return new " << InstNS << "FastISel(mbb, mf, tii);\n";
+ << "createFastISel(MachineFunction &mf) {\n";
+ OS << " return new " << InstNS << "FastISel(mf);\n";
OS << "}\n";
OS << "\n";