forked from OSchip/llvm-project
[M68k][MIR](2/8) Changes in the target-independent MIR part
- Add new callback in `TargetInstrInfo` -- `isPCRelRegisterOperandLegal` -- to query whether pc-rel register MachineOperand is legal. - Add new function to search DebugLoc in a reverse ordering Authors: myhsu, m4yers, glaubitz Differential Revision: https://reviews.llvm.org/D88386
This commit is contained in:
parent
503343191e
commit
6dcc325ce0
|
@ -895,6 +895,14 @@ public:
|
|||
return findDebugLoc(MBBI.getInstrIterator());
|
||||
}
|
||||
|
||||
/// Has exact same behavior as @ref findDebugLoc (it also
|
||||
/// searches from the first to the last MI of this MBB) except
|
||||
/// that this takes reverse iterator.
|
||||
DebugLoc rfindDebugLoc(reverse_instr_iterator MBBI);
|
||||
DebugLoc rfindDebugLoc(reverse_iterator MBBI) {
|
||||
return rfindDebugLoc(MBBI.getInstrIterator());
|
||||
}
|
||||
|
||||
/// Find the previous valid DebugLoc preceding MBBI, skipping and DBG_VALUE
|
||||
/// instructions. Return UnknownLoc if there is none.
|
||||
DebugLoc findPrevDebugLoc(instr_iterator MBBI);
|
||||
|
@ -902,6 +910,14 @@ public:
|
|||
return findPrevDebugLoc(MBBI.getInstrIterator());
|
||||
}
|
||||
|
||||
/// Has exact same behavior as @ref findPrevDebugLoc (it also
|
||||
/// searches from the last to the first MI of this MBB) except
|
||||
/// that this takes reverse iterator.
|
||||
DebugLoc rfindPrevDebugLoc(reverse_instr_iterator MBBI);
|
||||
DebugLoc rfindPrevDebugLoc(reverse_iterator MBBI) {
|
||||
return rfindPrevDebugLoc(MBBI.getInstrIterator());
|
||||
}
|
||||
|
||||
/// Find and return the merged DebugLoc of the branch instructions of the
|
||||
/// block. Return UnknownLoc if there is none.
|
||||
DebugLoc findBranchDebugLoc();
|
||||
|
|
|
@ -951,6 +951,19 @@ public:
|
|||
llvm_unreachable("Target didn't implement TargetInstrInfo::copyPhysReg!");
|
||||
}
|
||||
|
||||
/// Allow targets to tell MachineVerifier whether a specific register
|
||||
/// MachineOperand can be used as part of PC-relative addressing.
|
||||
/// PC-relative addressing modes in many CISC architectures contain
|
||||
/// (non-PC) registers as offsets or scaling values, which inherently
|
||||
/// tags the corresponding MachineOperand with OPERAND_PCREL.
|
||||
///
|
||||
/// @param MO The MachineOperand in question. MO.isReg() should always
|
||||
/// be true.
|
||||
/// @return Whether this operand is allowed to be used PC-relatively.
|
||||
virtual bool isPCRelRegisterOperandLegal(const MachineOperand &MO) const {
|
||||
return false;
|
||||
}
|
||||
|
||||
protected:
|
||||
/// Target-dependent implementation for IsCopyInstr.
|
||||
/// If the specific machine instruction is a instruction that moves/copies
|
||||
|
|
|
@ -1401,6 +1401,14 @@ MachineBasicBlock::findDebugLoc(instr_iterator MBBI) {
|
|||
return {};
|
||||
}
|
||||
|
||||
DebugLoc MachineBasicBlock::rfindDebugLoc(reverse_instr_iterator MBBI) {
|
||||
// Skip debug declarations, we don't want a DebugLoc from them.
|
||||
MBBI = skipDebugInstructionsBackward(MBBI, instr_rbegin());
|
||||
if (!MBBI->isDebugInstr())
|
||||
return MBBI->getDebugLoc();
|
||||
return {};
|
||||
}
|
||||
|
||||
/// Find the previous valid DebugLoc preceding MBBI, skipping and DBG_VALUE
|
||||
/// instructions. Return UnknownLoc if there is none.
|
||||
DebugLoc MachineBasicBlock::findPrevDebugLoc(instr_iterator MBBI) {
|
||||
|
@ -1411,6 +1419,16 @@ DebugLoc MachineBasicBlock::findPrevDebugLoc(instr_iterator MBBI) {
|
|||
return {};
|
||||
}
|
||||
|
||||
DebugLoc MachineBasicBlock::rfindPrevDebugLoc(reverse_instr_iterator MBBI) {
|
||||
if (MBBI == instr_rend())
|
||||
return {};
|
||||
// Skip debug declarations, we don't want a DebugLoc from them.
|
||||
MBBI = next_nodbg(MBBI, instr_rend());
|
||||
if (MBBI != instr_rend())
|
||||
return MBBI->getDebugLoc();
|
||||
return {};
|
||||
}
|
||||
|
||||
/// Find and return the merged DebugLoc of the branch instructions of the block.
|
||||
/// Return UnknownLoc if there is none.
|
||||
DebugLoc
|
||||
|
|
|
@ -1762,9 +1762,12 @@ MachineVerifier::visitMachineOperand(const MachineOperand *MO, unsigned MONum) {
|
|||
if (MCOI.OperandType == MCOI::OPERAND_REGISTER &&
|
||||
!MO->isReg() && !MO->isFI())
|
||||
report("Expected a register operand.", MO, MONum);
|
||||
if ((MCOI.OperandType == MCOI::OPERAND_IMMEDIATE ||
|
||||
MCOI.OperandType == MCOI::OPERAND_PCREL) && MO->isReg())
|
||||
report("Expected a non-register operand.", MO, MONum);
|
||||
if (MO->isReg()) {
|
||||
if (MCOI.OperandType == MCOI::OPERAND_IMMEDIATE ||
|
||||
(MCOI.OperandType == MCOI::OPERAND_PCREL &&
|
||||
!TII->isPCRelRegisterOperandLegal(*MO)))
|
||||
report("Expected a non-register operand.", MO, MONum);
|
||||
}
|
||||
}
|
||||
|
||||
int TiedTo = MCID.getOperandConstraint(MONum, MCOI::TIED_TO);
|
||||
|
|
Loading…
Reference in New Issue