Remove TargetMachine from PPCInstrInfo and all dependencies and

replace with the current subtarget.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@210836 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Christopher 2014-06-12 21:48:52 +00:00
parent 5c792faa0e
commit f7ab98c252
5 changed files with 29 additions and 27 deletions

View File

@ -258,8 +258,8 @@ void PPCDispatchGroupSBHazardRecognizer::EmitNoop() {
// 3. Handling of the esoteric cases in "Resource-based Instruction Grouping". // 3. Handling of the esoteric cases in "Resource-based Instruction Grouping".
// //
PPCHazardRecognizer970::PPCHazardRecognizer970(const TargetMachine &TM) PPCHazardRecognizer970::PPCHazardRecognizer970(const ScheduleDAG &DAG)
: TM(TM) { : DAG(DAG) {
EndDispatchGroup(); EndDispatchGroup();
} }
@ -278,7 +278,7 @@ PPCHazardRecognizer970::GetInstrType(unsigned Opcode,
bool &isFirst, bool &isSingle, bool &isFirst, bool &isSingle,
bool &isCracked, bool &isCracked,
bool &isLoad, bool &isStore) { bool &isLoad, bool &isStore) {
const MCInstrDesc &MCID = TM.getInstrInfo()->get(Opcode); const MCInstrDesc &MCID = DAG.TII->get(Opcode);
isLoad = MCID.mayLoad(); isLoad = MCID.mayLoad();
isStore = MCID.mayStore(); isStore = MCID.mayStore();

View File

@ -54,7 +54,7 @@ public:
/// setting the CTR register then branching through it within a dispatch group), /// setting the CTR register then branching through it within a dispatch group),
/// or storing then loading from the same address within a dispatch group. /// or storing then loading from the same address within a dispatch group.
class PPCHazardRecognizer970 : public ScheduleHazardRecognizer { class PPCHazardRecognizer970 : public ScheduleHazardRecognizer {
const TargetMachine &TM; const ScheduleDAG &DAG;
unsigned NumIssued; // Number of insts issued, including advanced cycles. unsigned NumIssued; // Number of insts issued, including advanced cycles.
@ -75,7 +75,7 @@ class PPCHazardRecognizer970 : public ScheduleHazardRecognizer {
unsigned NumStores; unsigned NumStores;
public: public:
PPCHazardRecognizer970(const TargetMachine &TM); PPCHazardRecognizer970(const ScheduleDAG &DAG);
virtual HazardType getHazardType(SUnit *SU, int Stalls) override; virtual HazardType getHazardType(SUnit *SU, int Stalls) override;
virtual void EmitInstruction(SUnit *SU) override; virtual void EmitInstruction(SUnit *SU) override;
virtual void AdvanceCycle() override; virtual void AdvanceCycle() override;

View File

@ -27,6 +27,7 @@
#include "llvm/CodeGen/MachineMemOperand.h" #include "llvm/CodeGen/MachineMemOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h" #include "llvm/CodeGen/PseudoSourceValue.h"
#include "llvm/CodeGen/ScheduleDAG.h"
#include "llvm/CodeGen/SlotIndexes.h" #include "llvm/CodeGen/SlotIndexes.h"
#include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCAsmInfo.h"
#include "llvm/Support/CommandLine.h" #include "llvm/Support/CommandLine.h"
@ -60,9 +61,9 @@ cl::Hidden);
// Pin the vtable to this file. // Pin the vtable to this file.
void PPCInstrInfo::anchor() {} void PPCInstrInfo::anchor() {}
PPCInstrInfo::PPCInstrInfo(PPCTargetMachine &tm) PPCInstrInfo::PPCInstrInfo(PPCSubtarget &STI)
: PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP), : PPCGenInstrInfo(PPC::ADJCALLSTACKDOWN, PPC::ADJCALLSTACKUP),
TM(tm), RI(*TM.getSubtargetImpl()) {} Subtarget(STI), RI(STI) {}
/// CreateTargetHazardRecognizer - Return the hazard recognizer to use for /// CreateTargetHazardRecognizer - Return the hazard recognizer to use for
/// this target when scheduling the DAG. /// this target when scheduling the DAG.
@ -84,7 +85,8 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetHazardRecognizer(
ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer( ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(
const InstrItineraryData *II, const InstrItineraryData *II,
const ScheduleDAG *DAG) const { const ScheduleDAG *DAG) const {
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective(); unsigned Directive =
DAG->TM.getSubtarget<PPCSubtarget>().getDarwinDirective();
if (Directive == PPC::DIR_PWR7) if (Directive == PPC::DIR_PWR7)
return new PPCDispatchGroupSBHazardRecognizer(II, DAG); return new PPCDispatchGroupSBHazardRecognizer(II, DAG);
@ -92,9 +94,9 @@ ScheduleHazardRecognizer *PPCInstrInfo::CreateTargetPostRAHazardRecognizer(
// Most subtargets use a PPC970 recognizer. // Most subtargets use a PPC970 recognizer.
if (Directive != PPC::DIR_440 && Directive != PPC::DIR_A2 && if (Directive != PPC::DIR_440 && Directive != PPC::DIR_A2 &&
Directive != PPC::DIR_E500mc && Directive != PPC::DIR_E5500) { Directive != PPC::DIR_E500mc && Directive != PPC::DIR_E5500) {
assert(TM.getInstrInfo() && "No InstrInfo?"); assert(DAG->TII && "No InstrInfo?");
return new PPCHazardRecognizer970(TM); return new PPCHazardRecognizer970(*DAG);
} }
return new ScoreboardHazardRecognizer(II, DAG); return new ScoreboardHazardRecognizer(II, DAG);
@ -129,7 +131,7 @@ int PPCInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
// On some cores, there is an additional delay between writing to a condition // On some cores, there is an additional delay between writing to a condition
// register, and using it from a branch. // register, and using it from a branch.
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective(); unsigned Directive = Subtarget.getDarwinDirective();
switch (Directive) { switch (Directive) {
default: break; default: break;
case PPC::DIR_7400: case PPC::DIR_7400:
@ -313,7 +315,7 @@ void PPCInstrInfo::insertNoop(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI) const { MachineBasicBlock::iterator MI) const {
// This function is used for scheduling, and the nop wanted here is the type // This function is used for scheduling, and the nop wanted here is the type
// that terminates dispatch groups on the POWER cores. // that terminates dispatch groups on the POWER cores.
unsigned Directive = TM.getSubtarget<PPCSubtarget>().getDarwinDirective(); unsigned Directive = Subtarget.getDarwinDirective();
unsigned Opcode; unsigned Opcode;
switch (Directive) { switch (Directive) {
default: Opcode = PPC::NOP; break; default: Opcode = PPC::NOP; break;
@ -332,7 +334,7 @@ bool PPCInstrInfo::AnalyzeBranch(MachineBasicBlock &MBB,MachineBasicBlock *&TBB,
MachineBasicBlock *&FBB, MachineBasicBlock *&FBB,
SmallVectorImpl<MachineOperand> &Cond, SmallVectorImpl<MachineOperand> &Cond,
bool AllowModify) const { bool AllowModify) const {
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
// If the block has no terminators, it just falls into the block after it. // If the block has no terminators, it just falls into the block after it.
MachineBasicBlock::iterator I = MBB.end(); MachineBasicBlock::iterator I = MBB.end();
@ -538,7 +540,7 @@ PPCInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
assert((Cond.size() == 2 || Cond.size() == 0) && assert((Cond.size() == 2 || Cond.size() == 0) &&
"PPC branch conditions have two components!"); "PPC branch conditions have two components!");
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
// One-way branch. // One-way branch.
if (!FBB) { if (!FBB) {
@ -579,7 +581,7 @@ bool PPCInstrInfo::canInsertSelect(const MachineBasicBlock &MBB,
const SmallVectorImpl<MachineOperand> &Cond, const SmallVectorImpl<MachineOperand> &Cond,
unsigned TrueReg, unsigned FalseReg, unsigned TrueReg, unsigned FalseReg,
int &CondCycles, int &TrueCycles, int &FalseCycles) const { int &CondCycles, int &TrueCycles, int &FalseCycles) const {
if (!TM.getSubtargetImpl()->hasISEL()) if (!Subtarget.hasISEL())
return false; return false;
if (Cond.size() != 2) if (Cond.size() != 2)
@ -623,7 +625,7 @@ void PPCInstrInfo::insertSelect(MachineBasicBlock &MBB,
assert(Cond.size() == 2 && assert(Cond.size() == 2 &&
"PPC branch conditions have two components!"); "PPC branch conditions have two components!");
assert(TM.getSubtargetImpl()->hasISEL() && assert(Subtarget.hasISEL() &&
"Cannot insert select on target without ISEL support"); "Cannot insert select on target without ISEL support");
// Get the register classes. // Get the register classes.
@ -826,7 +828,7 @@ PPCInstrInfo::StoreRegToStackSlot(MachineFunction &MF,
FrameIdx)); FrameIdx));
NonRI = true; NonRI = true;
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) { } else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
assert(TM.getSubtargetImpl()->isDarwin() && assert(Subtarget.isDarwin() &&
"VRSAVE only needs spill/restore on Darwin"); "VRSAVE only needs spill/restore on Darwin");
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::SPILL_VRSAVE)) NewMIs.push_back(addFrameReference(BuildMI(MF, DL, get(PPC::SPILL_VRSAVE))
.addReg(SrcReg, .addReg(SrcReg,
@ -921,7 +923,7 @@ PPCInstrInfo::LoadRegFromStackSlot(MachineFunction &MF, DebugLoc DL,
FrameIdx)); FrameIdx));
NonRI = true; NonRI = true;
} else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) { } else if (PPC::VRSAVERCRegClass.hasSubClassEq(RC)) {
assert(TM.getSubtargetImpl()->isDarwin() && assert(Subtarget.isDarwin() &&
"VRSAVE only needs spill/restore on Darwin"); "VRSAVE only needs spill/restore on Darwin");
NewMIs.push_back(addFrameReference(BuildMI(MF, DL, NewMIs.push_back(addFrameReference(BuildMI(MF, DL,
get(PPC::RESTORE_VRSAVE), get(PPC::RESTORE_VRSAVE),
@ -1035,7 +1037,7 @@ bool PPCInstrInfo::FoldImmediate(MachineInstr *UseMI, MachineInstr *DefMI,
unsigned ZeroReg; unsigned ZeroReg;
if (UseInfo->isLookupPtrRegClass()) { if (UseInfo->isLookupPtrRegClass()) {
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
ZeroReg = isPPC64 ? PPC::ZERO8 : PPC::ZERO; ZeroReg = isPPC64 ? PPC::ZERO8 : PPC::ZERO;
} else { } else {
ZeroReg = UseInfo->RegClass == PPC::G8RC_NOX0RegClassID ? ZeroReg = UseInfo->RegClass == PPC::G8RC_NOX0RegClassID ?
@ -1102,7 +1104,7 @@ bool PPCInstrInfo::PredicateInstruction(
unsigned OpC = MI->getOpcode(); unsigned OpC = MI->getOpcode();
if (OpC == PPC::BLR) { if (OpC == PPC::BLR) {
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) { if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
MI->setDesc(get(Pred[0].getImm() ? MI->setDesc(get(Pred[0].getImm() ?
(isPPC64 ? PPC::BDNZLR8 : PPC::BDNZLR) : (isPPC64 ? PPC::BDNZLR8 : PPC::BDNZLR) :
(isPPC64 ? PPC::BDZLR8 : PPC::BDZLR))); (isPPC64 ? PPC::BDZLR8 : PPC::BDZLR)));
@ -1124,7 +1126,7 @@ bool PPCInstrInfo::PredicateInstruction(
return true; return true;
} else if (OpC == PPC::B) { } else if (OpC == PPC::B) {
if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) { if (Pred[1].getReg() == PPC::CTR8 || Pred[1].getReg() == PPC::CTR) {
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
MI->setDesc(get(Pred[0].getImm() ? MI->setDesc(get(Pred[0].getImm() ?
(isPPC64 ? PPC::BDNZ8 : PPC::BDNZ) : (isPPC64 ? PPC::BDNZ8 : PPC::BDNZ) :
(isPPC64 ? PPC::BDZ8 : PPC::BDZ))); (isPPC64 ? PPC::BDZ8 : PPC::BDZ)));
@ -1162,7 +1164,7 @@ bool PPCInstrInfo::PredicateInstruction(
llvm_unreachable("Cannot predicate bctr[l] on the ctr register"); llvm_unreachable("Cannot predicate bctr[l] on the ctr register");
bool setLR = OpC == PPC::BCTRL || OpC == PPC::BCTRL8; bool setLR = OpC == PPC::BCTRL || OpC == PPC::BCTRL8;
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
if (Pred[0].getImm() == PPC::PRED_BIT_SET) { if (Pred[0].getImm() == PPC::PRED_BIT_SET) {
MI->setDesc(get(isPPC64 ? (setLR ? PPC::BCCTRL8 : PPC::BCCTR8) : MI->setDesc(get(isPPC64 ? (setLR ? PPC::BCCTRL8 : PPC::BCCTR8) :
@ -1323,7 +1325,7 @@ bool PPCInstrInfo::optimizeCompareInstr(MachineInstr *CmpInstr,
// for equality checks (as those don't depend on the sign). On PPC64, // for equality checks (as those don't depend on the sign). On PPC64,
// we are restricted to equality for unsigned 64-bit comparisons and for // we are restricted to equality for unsigned 64-bit comparisons and for
// signed 32-bit comparisons the applicability is more restricted. // signed 32-bit comparisons the applicability is more restricted.
bool isPPC64 = TM.getSubtargetImpl()->isPPC64(); bool isPPC64 = Subtarget.isPPC64();
bool is32BitSignedCompare = OpC == PPC::CMPWI || OpC == PPC::CMPW; bool is32BitSignedCompare = OpC == PPC::CMPWI || OpC == PPC::CMPW;
bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW; bool is32BitUnsignedCompare = OpC == PPC::CMPLWI || OpC == PPC::CMPLW;
bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD; bool is64BitUnsignedCompare = OpC == PPC::CMPLDI || OpC == PPC::CMPLD;

View File

@ -65,7 +65,7 @@ enum PPC970_Unit {
class PPCInstrInfo : public PPCGenInstrInfo { class PPCInstrInfo : public PPCGenInstrInfo {
PPCTargetMachine &TM; PPCSubtarget &Subtarget;
const PPCRegisterInfo RI; const PPCRegisterInfo RI;
bool StoreRegToStackSlot(MachineFunction &MF, bool StoreRegToStackSlot(MachineFunction &MF,
@ -80,7 +80,7 @@ class PPCInstrInfo : public PPCGenInstrInfo {
bool &NonRI, bool &SpillsVRS) const; bool &NonRI, bool &SpillsVRS) const;
virtual void anchor(); virtual void anchor();
public: public:
explicit PPCInstrInfo(PPCTargetMachine &TM); explicit PPCInstrInfo(PPCSubtarget &STI);
/// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info. As
/// such, whenever a client has an instance of instruction info, it should /// such, whenever a client has an instance of instruction info, it should

View File

@ -42,7 +42,7 @@ PPCTargetMachine::PPCTargetMachine(const Target &T, StringRef TT, StringRef CPU,
Reloc::Model RM, CodeModel::Model CM, Reloc::Model RM, CodeModel::Model CM,
CodeGenOpt::Level OL, bool is64Bit) CodeGenOpt::Level OL, bool is64Bit)
: LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL), : LLVMTargetMachine(T, TT, CPU, FS, Options, RM, CM, OL),
Subtarget(TT, CPU, FS, is64Bit, OL), InstrInfo(*this), Subtarget(TT, CPU, FS, is64Bit, OL), InstrInfo(Subtarget),
JITInfo(*this, is64Bit), TLInfo(*this), TSInfo(*this) { JITInfo(*this, is64Bit), TLInfo(*this), TSInfo(*this) {
initAsmInfo(); initAsmInfo();
} }