[AArch64] Refactor the scheduling predicates (3/3) (NFC)

Refactor the scheduling predicates based on `MCInstPredicate`.  In this
case, `AArch64InstrInfo::hasExtendedReg()`.

Differential revision: https://reviews.llvm.org/D54822

llvm-svn: 347599
This commit is contained in:
Evandro Menezes 2018-11-26 21:47:46 +00:00
parent 56368c6fa5
commit 6a38a5effe
4 changed files with 31 additions and 52 deletions

View File

@ -1740,33 +1740,6 @@ bool AArch64InstrInfo::expandPostRAPseudo(MachineInstr &MI) const {
return true; return true;
} }
/// Return true if this is this instruction has a non-zero immediate
bool AArch64InstrInfo::hasExtendedReg(const MachineInstr &MI) {
switch (MI.getOpcode()) {
default:
break;
case AArch64::ADDSWrx:
case AArch64::ADDSXrx:
case AArch64::ADDSXrx64:
case AArch64::ADDWrx:
case AArch64::ADDXrx:
case AArch64::ADDXrx64:
case AArch64::SUBSWrx:
case AArch64::SUBSXrx:
case AArch64::SUBSXrx64:
case AArch64::SUBWrx:
case AArch64::SUBXrx:
case AArch64::SUBXrx64:
if (MI.getOperand(3).isImm()) {
unsigned val = MI.getOperand(3).getImm();
return (val != 0);
}
break;
}
return false;
}
// Return true if this instruction simply sets its single destination register // Return true if this instruction simply sets its single destination register
// to zero. This is equivalent to a register rename of the zero-register. // to zero. This is equivalent to a register rename of the zero-register.
bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) { bool AArch64InstrInfo::isGPRZero(const MachineInstr &MI) {

View File

@ -62,10 +62,6 @@ public:
unsigned isStoreToStackSlot(const MachineInstr &MI, unsigned isStoreToStackSlot(const MachineInstr &MI,
int &FrameIndex) const override; int &FrameIndex) const override;
/// Returns true if there is an extendable register and that the extending
/// value is non-zero.
static bool hasExtendedReg(const MachineInstr &MI);
/// Does this instruction set its full destination register to zero? /// Does this instruction set its full destination register to zero?
static bool isGPRZero(const MachineInstr &MI); static bool isGPRZero(const MachineInstr &MI);

View File

@ -28,6 +28,10 @@ def CheckMemScaled : CheckImmOperandSimple<3>;
// Generic predicates. // Generic predicates.
// Identify arithmetic instructions with extend.
def IsArithExtPred : CheckOpcode<[ADDWrx, ADDXrx, ADDXrx64, ADDSWrx, ADDSXrx, ADDSXrx64,
SUBWrx, SUBXrx, SUBXrx64, SUBSWrx, SUBSXrx, SUBSXrx64]>;
// Identify arithmetic instructions with shift. // Identify arithmetic instructions with shift.
def IsArithShiftPred : CheckOpcode<[ADDWrs, ADDXrs, ADDSWrs, ADDSXrs, def IsArithShiftPred : CheckOpcode<[ADDWrs, ADDXrs, ADDSWrs, ADDSXrs,
SUBWrs, SUBXrs, SUBSWrs, SUBSXrs]>; SUBWrs, SUBXrs, SUBSWrs, SUBSXrs]>;
@ -71,6 +75,15 @@ def IsStoreRegOffsetPred : CheckOpcode<[STRBBroW, STRBBroX,
// Target predicates. // Target predicates.
// Identify arithmetic instructions with an extended register.
def RegExtendedFn : TIIPredicate<"hasExtendedReg",
MCOpcodeSwitchStatement<
[MCOpcodeSwitchCase<
IsArithExtPred.ValidOpcodes,
MCReturnStatement<CheckNot<CheckZeroOperand<3>>>>],
MCReturnStatement<FalsePred>>>;
def RegExtendedPred : MCSchedPredicate<RegExtendedFn>;
// Identify arithmetic and logic instructions with a shifted register. // Identify arithmetic and logic instructions with a shifted register.
def RegShiftedFn : TIIPredicate<"hasShiftedReg", def RegShiftedFn : TIIPredicate<"hasShiftedReg",
MCOpcodeSwitchStatement< MCOpcodeSwitchStatement<

View File

@ -50,9 +50,6 @@ def WriteLDIdx : SchedWrite; // Load from a register index (maybe scaled).
def WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled). def WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled).
def ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST. def ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST.
// Predicate for determining when a extendedable register is extended.
def RegExtendedPred : SchedPredicate<[{TII->hasExtendedReg(*MI)}]>;
// Serialized two-level address load. // Serialized two-level address load.
// EXAMPLE: LOADGot // EXAMPLE: LOADGot
def WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>; def WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>;