summaryrefslogtreecommitdiffstats
path: root/gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp')
-rw-r--r--gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp41
1 files changed, 20 insertions, 21 deletions
diff --git a/gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp b/gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
index 4a34e3101cb..e06b57e4183 100644
--- a/gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
+++ b/gnu/llvm/lib/Target/Mips/MipsDelaySlotFiller.cpp
@@ -1,4 +1,4 @@
-//===-- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler ------------------===//
+//===- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler -------------------===//
//
// The LLVM Compiler Infrastructure
//
@@ -14,8 +14,8 @@
#include "MCTargetDesc/MipsMCNaCl.h"
#include "Mips.h"
#include "MipsInstrInfo.h"
+#include "MipsRegisterInfo.h"
#include "MipsSubtarget.h"
-#include "MipsTargetMachine.h"
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/PointerUnion.h"
@@ -34,6 +34,8 @@
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValue.h"
+#include "llvm/CodeGen/TargetRegisterInfo.h"
+#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/Casting.h"
@@ -41,7 +43,6 @@
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Target/TargetMachine.h"
-#include "llvm/Target/TargetRegisterInfo.h"
#include <algorithm>
#include <cassert>
#include <iterator>
@@ -103,9 +104,9 @@ static cl::opt<CompactBranchPolicy> MipsCompactBranchPolicy(
namespace {
- typedef MachineBasicBlock::iterator Iter;
- typedef MachineBasicBlock::reverse_iterator ReverseIter;
- typedef SmallDenseMap<MachineBasicBlock*, MachineInstr*, 2> BB2BrMap;
+ using Iter = MachineBasicBlock::iterator;
+ using ReverseIter = MachineBasicBlock::reverse_iterator;
+ using BB2BrMap = SmallDenseMap<MachineBasicBlock *, MachineInstr *, 2>;
class RegDefsUses {
public:
@@ -186,7 +187,7 @@ namespace {
MemDefsUses(const DataLayout &DL, const MachineFrameInfo *MFI);
private:
- typedef PointerUnion<const Value *, const PseudoSourceValue *> ValueType;
+ using ValueType = PointerUnion<const Value *, const PseudoSourceValue *>;
bool hasHazard_(const MachineInstr &MI) override;
@@ -211,7 +212,7 @@ namespace {
class Filler : public MachineFunctionPass {
public:
- Filler() : MachineFunctionPass(ID), TM(nullptr) {}
+ Filler() : MachineFunctionPass(ID) {}
StringRef getPassName() const override { return "Mips Delay Slot Filler"; }
@@ -290,15 +291,15 @@ namespace {
bool terminateSearch(const MachineInstr &Candidate) const;
- const TargetMachine *TM;
+ const TargetMachine *TM = nullptr;
static char ID;
};
- char Filler::ID = 0;
-
} // end anonymous namespace
+char Filler::ID = 0;
+
static bool hasUnoccupiedSlot(const MachineInstr *MI) {
return MI->hasDelaySlot() && !MI->isBundledWithSucc();
}
@@ -596,21 +597,14 @@ bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
bool InMicroMipsMode = STI.inMicroMipsMode();
const MipsInstrInfo *TII = STI.getInstrInfo();
- if (InMicroMipsMode && STI.hasMips32r6()) {
- // This is microMIPS32r6 or microMIPS64r6 processor. Delay slot for
- // branching instructions is not needed.
- return Changed;
- }
-
for (Iter I = MBB.begin(); I != MBB.end(); ++I) {
if (!hasUnoccupiedSlot(&*I))
continue;
- ++FilledSlots;
- Changed = true;
+ // Delay slot filling is disabled at -O0, or in microMIPS32R6.
+ if (!DisableDelaySlotFiller && (TM->getOptLevel() != CodeGenOpt::None) &&
+ !(InMicroMipsMode && STI.hasMips32r6())) {
- // Delay slot filling is disabled at -O0.
- if (!DisableDelaySlotFiller && (TM->getOptLevel() != CodeGenOpt::None)) {
bool Filled = false;
if (MipsCompactBranchPolicy.getValue() != CB_Always ||
@@ -642,6 +636,8 @@ bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
// if it is in range.
DSI->setDesc(TII->get(getEquivalentCallShort(DSI->getOpcode())));
}
+ ++FilledSlots;
+ Changed = true;
continue;
}
}
@@ -659,12 +655,15 @@ bool Filler::runOnMachineBasicBlock(MachineBasicBlock &MBB) {
(STI.hasMips32r6() && MipsCompactBranchPolicy != CB_Never)) &&
TII->getEquivalentCompactForm(I)) {
I = replaceWithCompactBranch(MBB, I, I->getDebugLoc());
+ Changed = true;
continue;
}
// Bundle the NOP to the instruction with the delay slot.
BuildMI(MBB, std::next(I), I->getDebugLoc(), TII->get(Mips::NOP));
MIBundleBuilder(MBB, I, std::next(I, 2));
+ ++FilledSlots;
+ Changed = true;
}
return Changed;