35 "Errata workaround pass",
false,
false)
47 while (
I ==
MBB->end()) {
48 if (
MBB->getFallThrough() ==
nullptr)
50 MBB =
MBB->getFallThrough();
53 }
while (
I->isMetaInstruction() ||
I->isInlineAsm());
60 BuildMI(*
I->getParent(),
I,
I->getDebugLoc(),
TII->get(SP::NOP));
64 if (
I->getNumOperands() == 0)
67 if (!
I->getOperand(0).isReg())
70 unsigned reg =
I->getOperand(0).getReg();
79 switch (
I->getOpcode()) {
90 switch (
I->getOpcode()) {
108 switch (
I->getOpcode()) {
126 if (
MI->mayStore() ||
MI->mayLoad())
148 switch (
I->getOpcode()) {
181 if (
I->isBranch() &&
I->getOperand(0).isMBB()) {
185 while (
MI != TargetMBB->
end() &&
MI->isMetaInstruction())
188 if (
MI == TargetMBB->
end())
210 while (
I !=
MBB.end() &&
I->isMetaInstruction())
225 if (
I->getOpcode() != SP::BCOND &&
I->getOpcode() != SP::BCONDA)
231 while (
MI != TargetMBB->
end() &&
MI->isMetaInstruction())
234 if (
MI == TargetMBB->
end())
260 unsigned dstReg =
I->getOperand(0).getReg();
266 if (
MI->isBranch()) {
273 unsigned fpFound = 0;
274 for (
unsigned i = 0; i < 4; i++) {
282 if (
MI->readsRegister(dstReg,
TRI))
314 unsigned Opcode =
MBBI->getOpcode();
315 if (Opcode >= SP::LDDArr && Opcode <= SP::LDrr) {
327 if (!(ST->insertNOPLoad() || ST->fixTN0009() || ST->fixTN0010() ||
328 ST->fixTN0012() || ST->fixTN0013()))
334 if (ST->insertNOPLoad())
341 for (
auto &
MBB : MF) {
342 for (
auto &
I :
MBB) {
343 if (ST->fixTN0009()) {
MachineBasicBlock MachineBasicBlock::iterator MBBI
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
const HexagonInstrInfo * TII
static bool isDivSqrt(MachineBasicBlock::iterator I)
static bool isFloat(MachineBasicBlock::iterator I)
static bool checkSeqTN0010First(MachineBasicBlock &MBB, const TargetInstrInfo *TII)
static bool checkSeqTN0010(MachineBasicBlock::iterator I, const TargetInstrInfo *TII)
static bool insertNOPLoad(MachineBasicBlock &MBB, const TargetInstrInfo *TII)
static bool isAtomic(MachineBasicBlock::iterator I)
static bool runErrataWorkaroundOnMachineFunction(MachineFunction &MF)
static bool checkSeqTN0009A(MachineBasicBlock::iterator I, const TargetInstrInfo *TII)
static bool checkSeqTN0013(MachineBasicBlock::iterator I, const TargetInstrInfo *TII, const TargetRegisterInfo *TRI)
static void insertNop(MachineBasicBlock::iterator I, const TargetInstrInfo *TII)
static bool checkSeqTN0012(MachineBasicBlock::iterator I, const TargetInstrInfo *TII)
static bool checkSeqTN0009B(MachineBasicBlock::iterator I, const TargetInstrInfo *TII)
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
Represents analyses that only rely on functions' control flow.
MachineInstrBundleIterator< MachineInstr > iterator
MachineFunctionPass(char &ID)
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const MachineBasicBlock & front() const
static LLVM_ABI PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
SparcErrataWorkaroundLegacy()
PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Pass manager infrastructure for declaring and invalidating analyses.
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
void initializeSparcErrataWorkaroundLegacyPass(PassRegistry &)