mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-21 12:38:45 +00:00
Remove the target hook TargetInstrInfo::BlockHasNoFallThrough in favor of
MachineBasicBlock::canFallThrough(), which is target-independent and more thorough. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@90634 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
735985fbbe
commit
864e2efce2
@ -465,14 +465,6 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// BlockHasNoFallThrough - Return true if the specified block does not
|
|
||||||
/// fall-through into its successor block. This is primarily used when a
|
|
||||||
/// branch is unanalyzable. It is useful for things like unconditional
|
|
||||||
/// indirect branches (jump tables).
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ReverseBranchCondition - Reverses the branch condition of the specified
|
/// ReverseBranchCondition - Reverses the branch condition of the specified
|
||||||
/// condition list, returning false on success and true if it cannot be
|
/// condition list, returning false on success and true if it cannot be
|
||||||
/// reversed.
|
/// reversed.
|
||||||
|
@ -1140,7 +1140,7 @@ ReoptimizeBlock:
|
|||||||
// falls through into MBB and we can't understand the prior block's branch
|
// falls through into MBB and we can't understand the prior block's branch
|
||||||
// condition.
|
// condition.
|
||||||
if (MBB->empty()) {
|
if (MBB->empty()) {
|
||||||
bool PredHasNoFallThrough = TII->BlockHasNoFallThrough(PrevBB);
|
bool PredHasNoFallThrough = !PrevBB.canFallThrough();
|
||||||
if (PredHasNoFallThrough || !PriorUnAnalyzable ||
|
if (PredHasNoFallThrough || !PriorUnAnalyzable ||
|
||||||
!PrevBB.isSuccessor(MBB)) {
|
!PrevBB.isSuccessor(MBB)) {
|
||||||
// If the prior block falls through into us, turn it into an
|
// If the prior block falls through into us, turn it into an
|
||||||
|
@ -376,15 +376,6 @@ MachineVerifier::visitMachineBasicBlockBefore(const MachineBasicBlock *MBB) {
|
|||||||
report("MBB doesn't fall through but is empty!", MBB);
|
report("MBB doesn't fall through but is empty!", MBB);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (TII->BlockHasNoFallThrough(*MBB)) {
|
|
||||||
if (MBB->empty()) {
|
|
||||||
report("TargetInstrInfo says the block has no fall through, but the "
|
|
||||||
"block is empty!", MBB);
|
|
||||||
} else if (!MBB->back().getDesc().isBarrier()) {
|
|
||||||
report("TargetInstrInfo says the block has no fall through, but the "
|
|
||||||
"block does not end in a barrier!", MBB);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// Block is last in function.
|
// Block is last in function.
|
||||||
if (MBB->empty()) {
|
if (MBB->empty()) {
|
||||||
|
@ -190,9 +190,6 @@ public:
|
|||||||
// if there is not such an opcode.
|
// if there is not such an opcode.
|
||||||
virtual unsigned getUnindexedOpcode(unsigned Opc) const =0;
|
virtual unsigned getUnindexedOpcode(unsigned Opc) const =0;
|
||||||
|
|
||||||
// Return true if the block does not fall through.
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const =0;
|
|
||||||
|
|
||||||
virtual MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI,
|
virtual MachineInstr *convertToThreeAddress(MachineFunction::iterator &MFI,
|
||||||
MachineBasicBlock::iterator &MBBI,
|
MachineBasicBlock::iterator &MBBI,
|
||||||
LiveVariables *LV) const;
|
LiveVariables *LV) const;
|
||||||
|
@ -60,25 +60,6 @@ unsigned ARMInstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ARMInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case ARM::BX_RET: // Return.
|
|
||||||
case ARM::LDM_RET:
|
|
||||||
case ARM::B:
|
|
||||||
case ARM::BRIND:
|
|
||||||
case ARM::BR_JTr: // Jumptable branch.
|
|
||||||
case ARM::BR_JTm: // Jumptable branch through mem.
|
|
||||||
case ARM::BR_JTadd: // Jumptable branch add to pc.
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ARMInstrInfo::
|
void ARMInstrInfo::
|
||||||
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig,
|
unsigned DestReg, unsigned SubIdx, const MachineInstr *Orig,
|
||||||
|
@ -32,9 +32,6 @@ public:
|
|||||||
// if there is not such an opcode.
|
// if there is not such an opcode.
|
||||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||||
|
|
||||||
// Return true if the block does not fall through.
|
|
||||||
bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
|
|
||||||
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
void reMaterialize(MachineBasicBlock &MBB, MachineBasicBlock::iterator MI,
|
||||||
unsigned DestReg, unsigned SubIdx,
|
unsigned DestReg, unsigned SubIdx,
|
||||||
const MachineInstr *Orig,
|
const MachineInstr *Orig,
|
||||||
|
@ -32,25 +32,6 @@ unsigned Thumb1InstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
Thumb1InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case ARM::tBX_RET:
|
|
||||||
case ARM::tBX_RET_vararg:
|
|
||||||
case ARM::tPOP_RET:
|
|
||||||
case ARM::tB:
|
|
||||||
case ARM::tBRIND:
|
|
||||||
case ARM::tBR_JTr:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Thumb1InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
bool Thumb1InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
|
@ -31,9 +31,6 @@ public:
|
|||||||
// if there is not such an opcode.
|
// if there is not such an opcode.
|
||||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||||
|
|
||||||
// Return true if the block does not fall through.
|
|
||||||
bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
|
|
||||||
/// 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
|
||||||
/// always be able to get register info as well (through this method).
|
/// always be able to get register info as well (through this method).
|
||||||
|
@ -35,30 +35,6 @@ unsigned Thumb2InstrInfo::getUnindexedOpcode(unsigned Opc) const {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
Thumb2InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case ARM::t2LDM_RET:
|
|
||||||
case ARM::t2B: // Uncond branch.
|
|
||||||
case ARM::t2BR_JT: // Jumptable branch.
|
|
||||||
case ARM::t2TBB: // Table branch byte.
|
|
||||||
case ARM::t2TBH: // Table branch halfword.
|
|
||||||
case ARM::tBR_JTr: // Jumptable branch (16-bit version).
|
|
||||||
case ARM::tBX_RET:
|
|
||||||
case ARM::tBX_RET_vararg:
|
|
||||||
case ARM::tPOP_RET:
|
|
||||||
case ARM::tB:
|
|
||||||
case ARM::tBRIND:
|
|
||||||
return true;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Thumb2InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
Thumb2InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
|
@ -31,9 +31,6 @@ public:
|
|||||||
// if there is not such an opcode.
|
// if there is not such an opcode.
|
||||||
unsigned getUnindexedOpcode(unsigned Opc) const;
|
unsigned getUnindexedOpcode(unsigned Opc) const;
|
||||||
|
|
||||||
// Return true if the block does not fall through.
|
|
||||||
bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
|
|
||||||
bool copyRegToReg(MachineBasicBlock &MBB,
|
bool copyRegToReg(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator I,
|
MachineBasicBlock::iterator I,
|
||||||
unsigned DestReg, unsigned SrcReg,
|
unsigned DestReg, unsigned SrcReg,
|
||||||
|
@ -392,18 +392,6 @@ void AlphaInstrInfo::insertNoop(MachineBasicBlock &MBB,
|
|||||||
.addReg(Alpha::R31);
|
.addReg(Alpha::R31);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AlphaInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case Alpha::RETDAG: // Return.
|
|
||||||
case Alpha::RETDAGp:
|
|
||||||
case Alpha::BR: // Uncond branch.
|
|
||||||
case Alpha::JMP: // Indirect branch.
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bool AlphaInstrInfo::
|
bool AlphaInstrInfo::
|
||||||
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
||||||
assert(Cond.size() == 2 && "Invalid Alpha branch opcode!");
|
assert(Cond.size() == 2 && "Invalid Alpha branch opcode!");
|
||||||
|
@ -78,7 +78,6 @@ public:
|
|||||||
unsigned RemoveBranch(MachineBasicBlock &MBB) const;
|
unsigned RemoveBranch(MachineBasicBlock &MBB) const;
|
||||||
void insertNoop(MachineBasicBlock &MBB,
|
void insertNoop(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator MI) const;
|
MachineBasicBlock::iterator MI) const;
|
||||||
bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
/// getGlobalBaseReg - Return a virtual register initialized with the
|
/// getGlobalBaseReg - Return a virtual register initialized with the
|
||||||
|
@ -580,10 +580,6 @@ SPUInstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
SPUInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
return (!MBB.empty() && isUncondBranch(&MBB.back()));
|
|
||||||
}
|
|
||||||
//! Reverses a branch's condition, returning false on success.
|
//! Reverses a branch's condition, returning false on success.
|
||||||
bool
|
bool
|
||||||
SPUInstrInfo::ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond)
|
SPUInstrInfo::ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond)
|
||||||
|
@ -79,9 +79,6 @@ namespace llvm {
|
|||||||
bool canFoldMemoryOperand(const MachineInstr *MI,
|
bool canFoldMemoryOperand(const MachineInstr *MI,
|
||||||
const SmallVectorImpl<unsigned> &Ops) const;
|
const SmallVectorImpl<unsigned> &Ops) const;
|
||||||
|
|
||||||
//! Return true if the specified block does not fall through
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
|
|
||||||
//! Reverses a branch's condition, returning false on success.
|
//! Reverses a branch's condition, returning false on success.
|
||||||
virtual
|
virtual
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
|
@ -219,17 +219,6 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MSP430InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB)const{
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case MSP430::RET: // Return.
|
|
||||||
case MSP430::JMP: // Uncond branch.
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MSP430InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
|
bool MSP430InstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
|
||||||
const TargetInstrDesc &TID = MI->getDesc();
|
const TargetInstrDesc &TID = MI->getDesc();
|
||||||
if (!TID.isTerminator()) return false;
|
if (!TID.isTerminator()) return false;
|
||||||
|
@ -61,7 +61,6 @@ public:
|
|||||||
|
|
||||||
// Branch folding goodness
|
// Branch folding goodness
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
bool isUnpredicatedTerminator(const MachineInstr *MI) const;
|
bool isUnpredicatedTerminator(const MachineInstr *MI) const;
|
||||||
bool AnalyzeBranch(MachineBasicBlock &MBB,
|
bool AnalyzeBranch(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock *&TBB, MachineBasicBlock *&FBB,
|
MachineBasicBlock *&TBB, MachineBasicBlock *&FBB,
|
||||||
|
@ -590,22 +590,6 @@ RemoveBranch(MachineBasicBlock &MBB) const
|
|||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// BlockHasNoFallThrough - Analyze if MachineBasicBlock does not
|
|
||||||
/// fall-through into its successor block.
|
|
||||||
bool MipsInstrInfo::
|
|
||||||
BlockHasNoFallThrough(const MachineBasicBlock &MBB) const
|
|
||||||
{
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case Mips::RET: // Return.
|
|
||||||
case Mips::JR: // Indirect branch.
|
|
||||||
case Mips::J: // Uncond branch.
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ReverseBranchCondition - Return the inverse opcode of the
|
/// ReverseBranchCondition - Return the inverse opcode of the
|
||||||
/// specified Branch instruction.
|
/// specified Branch instruction.
|
||||||
bool MipsInstrInfo::
|
bool MipsInstrInfo::
|
||||||
|
@ -232,7 +232,6 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
virtual
|
virtual
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
|
@ -740,18 +740,6 @@ bool PPCInstrInfo::canFoldMemoryOperand(const MachineInstr *MI,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PPCInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case PPC::BLR: // Return.
|
|
||||||
case PPC::B: // Uncond branch.
|
|
||||||
case PPC::BCTR: // Indirect branch.
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool PPCInstrInfo::
|
bool PPCInstrInfo::
|
||||||
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
||||||
assert(Cond.size() == 2 && "Invalid PPC branch opcode!");
|
assert(Cond.size() == 2 && "Invalid PPC branch opcode!");
|
||||||
|
@ -143,7 +143,6 @@ public:
|
|||||||
virtual bool canFoldMemoryOperand(const MachineInstr *MI,
|
virtual bool canFoldMemoryOperand(const MachineInstr *MI,
|
||||||
const SmallVectorImpl<unsigned> &Ops) const;
|
const SmallVectorImpl<unsigned> &Ops) const;
|
||||||
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
virtual
|
virtual
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
|
@ -402,18 +402,6 @@ ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SystemZInstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB)const{
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case SystemZ::RET: // Return.
|
|
||||||
case SystemZ::JMP: // Uncond branch.
|
|
||||||
case SystemZ::JMPr: // Indirect branch.
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SystemZInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
|
bool SystemZInstrInfo::isUnpredicatedTerminator(const MachineInstr *MI) const {
|
||||||
const TargetInstrDesc &TID = MI->getDesc();
|
const TargetInstrDesc &TID = MI->getDesc();
|
||||||
if (!TID.isTerminator()) return false;
|
if (!TID.isTerminator()) return false;
|
||||||
|
@ -89,7 +89,6 @@ public:
|
|||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
|
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const;
|
virtual bool isUnpredicatedTerminator(const MachineInstr *MI) const;
|
||||||
virtual bool AnalyzeBranch(MachineBasicBlock &MBB,
|
virtual bool AnalyzeBranch(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock *&TBB,
|
MachineBasicBlock *&TBB,
|
||||||
|
@ -2719,27 +2719,6 @@ unsigned X86InstrInfo::getOpcodeAfterMemoryUnfold(unsigned Opc,
|
|||||||
return I->second.first;
|
return I->second.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool X86InstrInfo::BlockHasNoFallThrough(const MachineBasicBlock &MBB) const {
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case X86::TCRETURNri:
|
|
||||||
case X86::TCRETURNdi:
|
|
||||||
case X86::RET: // Return.
|
|
||||||
case X86::RETI:
|
|
||||||
case X86::TAILJMPd:
|
|
||||||
case X86::TAILJMPr:
|
|
||||||
case X86::TAILJMPm:
|
|
||||||
case X86::JMP: // Uncond branch.
|
|
||||||
case X86::JMP32r: // Indirect branch.
|
|
||||||
case X86::JMP64r: // Indirect branch (64-bit).
|
|
||||||
case X86::JMP32m: // Indirect branch through mem.
|
|
||||||
case X86::JMP64m: // Indirect branch through mem (64-bit).
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool X86InstrInfo::
|
bool X86InstrInfo::
|
||||||
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const {
|
||||||
assert(Cond.size() == 1 && "Invalid X86 branch condition!");
|
assert(Cond.size() == 1 && "Invalid X86 branch condition!");
|
||||||
|
@ -600,7 +600,6 @@ public:
|
|||||||
bool UnfoldLoad, bool UnfoldStore,
|
bool UnfoldLoad, bool UnfoldStore,
|
||||||
unsigned *LoadRegIndex = 0) const;
|
unsigned *LoadRegIndex = 0) const;
|
||||||
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
virtual
|
virtual
|
||||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
|
|
||||||
|
@ -453,26 +453,6 @@ bool XCoreInstrInfo::restoreCalleeSavedRegisters(MachineBasicBlock &MBB,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// BlockHasNoFallThrough - Analyse if MachineBasicBlock does not
|
|
||||||
/// fall-through into its successor block.
|
|
||||||
bool XCoreInstrInfo::
|
|
||||||
BlockHasNoFallThrough(const MachineBasicBlock &MBB) const
|
|
||||||
{
|
|
||||||
if (MBB.empty()) return false;
|
|
||||||
|
|
||||||
switch (MBB.back().getOpcode()) {
|
|
||||||
case XCore::RETSP_u6: // Return.
|
|
||||||
case XCore::RETSP_lu6:
|
|
||||||
case XCore::BAU_1r: // Indirect branch.
|
|
||||||
case XCore::BRFU_u6: // Uncond branch.
|
|
||||||
case XCore::BRFU_lu6:
|
|
||||||
case XCore::BRBU_u6:
|
|
||||||
case XCore::BRBU_lu6:
|
|
||||||
return true;
|
|
||||||
default: return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ReverseBranchCondition - Return the inverse opcode of the
|
/// ReverseBranchCondition - Return the inverse opcode of the
|
||||||
/// specified Branch instruction.
|
/// specified Branch instruction.
|
||||||
bool XCoreInstrInfo::
|
bool XCoreInstrInfo::
|
||||||
|
@ -87,8 +87,6 @@ public:
|
|||||||
MachineBasicBlock::iterator MI,
|
MachineBasicBlock::iterator MI,
|
||||||
const std::vector<CalleeSavedInfo> &CSI) const;
|
const std::vector<CalleeSavedInfo> &CSI) const;
|
||||||
|
|
||||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
|
||||||
|
|
||||||
virtual bool ReverseBranchCondition(
|
virtual bool ReverseBranchCondition(
|
||||||
SmallVectorImpl<MachineOperand> &Cond) const;
|
SmallVectorImpl<MachineOperand> &Cond) const;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user