mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-14 15:57:47 +00:00
[GISel] Make constrainSelectedInstRegOperands() available to the legalizer. NFC
https://reviews.llvm.org/D42149 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@322743 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
eb7fd730fa
commit
7c831c8c4a
@ -361,20 +361,6 @@ protected:
|
||||
const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI) const;
|
||||
|
||||
/// Mutate the newly-selected instruction \p I to constrain its (possibly
|
||||
/// generic) virtual register operands to the instruction's register class.
|
||||
/// This could involve inserting COPYs before (for uses) or after (for defs).
|
||||
/// This requires the number of operands to match the instruction description.
|
||||
/// \returns whether operand regclass constraining succeeded.
|
||||
///
|
||||
// FIXME: Not all instructions have the same number of operands. We should
|
||||
// probably expose a constrain helper per operand and let the target selector
|
||||
// constrain individual registers, like fast-isel.
|
||||
bool constrainSelectedInstRegOperands(MachineInstr &I,
|
||||
const TargetInstrInfo &TII,
|
||||
const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI) const;
|
||||
|
||||
bool isOperandImmEqual(const MachineOperand &MO, int64_t Value,
|
||||
const MachineRegisterInfo &MRI) const;
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/CodeGen/GlobalISel/InstructionSelector.h"
|
||||
#include "llvm/CodeGen/GlobalISel/RegisterBankInfo.h"
|
||||
#include "llvm/CodeGen/GlobalISel/Utils.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
|
@ -59,6 +59,19 @@ unsigned constrainOperandRegClass(const MachineFunction &MF,
|
||||
MachineInstr &InsertPt, const MCInstrDesc &II,
|
||||
unsigned Reg, unsigned OpIdx);
|
||||
|
||||
/// Mutate the newly-selected instruction \p I to constrain its (possibly
|
||||
/// generic) virtual register operands to the instruction's register class.
|
||||
/// This could involve inserting COPYs before (for uses) or after (for defs).
|
||||
/// This requires the number of operands to match the instruction description.
|
||||
/// \returns whether operand regclass constraining succeeded.
|
||||
///
|
||||
// FIXME: Not all instructions have the same number of operands. We should
|
||||
// probably expose a constrain helper per operand and let the target selector
|
||||
// constrain individual registers, like fast-isel.
|
||||
bool constrainSelectedInstRegOperands(MachineInstr &I,
|
||||
const TargetInstrInfo &TII,
|
||||
const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI);
|
||||
/// Check whether an instruction \p MI is dead: it only defines dead virtual
|
||||
/// registers, and doesn't have other side effects.
|
||||
bool isTriviallyDead(const MachineInstr &MI, const MachineRegisterInfo &MRI);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H
|
||||
|
||||
#include "llvm/ADT/ArrayRef.h"
|
||||
#include "llvm/CodeGen/GlobalISel/Utils.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
@ -283,6 +284,12 @@ public:
|
||||
MI->copyImplicitOps(*MF, OtherMI);
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool constrainAllUses(const TargetInstrInfo &TII,
|
||||
const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI) const {
|
||||
return constrainSelectedInstRegOperands(*MI, TII, TRI, RBI);
|
||||
}
|
||||
};
|
||||
|
||||
/// Builder interface. Specify how to create the initial instruction itself.
|
||||
|
@ -46,50 +46,6 @@ bool InstructionSelector::constrainOperandRegToRegClass(
|
||||
constrainRegToClass(MRI, TII, RBI, I, I.getOperand(OpIdx).getReg(), RC);
|
||||
}
|
||||
|
||||
bool InstructionSelector::constrainSelectedInstRegOperands(
|
||||
MachineInstr &I, const TargetInstrInfo &TII, const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI) const {
|
||||
MachineBasicBlock &MBB = *I.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
|
||||
for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
|
||||
MachineOperand &MO = I.getOperand(OpI);
|
||||
|
||||
// There's nothing to be done on non-register operands.
|
||||
if (!MO.isReg())
|
||||
continue;
|
||||
|
||||
DEBUG(dbgs() << "Converting operand: " << MO << '\n');
|
||||
assert(MO.isReg() && "Unsupported non-reg operand");
|
||||
|
||||
unsigned Reg = MO.getReg();
|
||||
// Physical registers don't need to be constrained.
|
||||
if (TRI.isPhysicalRegister(Reg))
|
||||
continue;
|
||||
|
||||
// Register operands with a value of 0 (e.g. predicate operands) don't need
|
||||
// to be constrained.
|
||||
if (Reg == 0)
|
||||
continue;
|
||||
|
||||
// If the operand is a vreg, we should constrain its regclass, and only
|
||||
// insert COPYs if that's impossible.
|
||||
// constrainOperandRegClass does that for us.
|
||||
MO.setReg(constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(),
|
||||
Reg, OpI));
|
||||
|
||||
// Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
|
||||
// done.
|
||||
if (MO.isUse()) {
|
||||
int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
|
||||
if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
|
||||
I.tieOperands(DefIdx, OpI);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool InstructionSelector::isOperandImmEqual(
|
||||
const MachineOperand &MO, int64_t Value,
|
||||
const MachineRegisterInfo &MRI) const {
|
||||
|
@ -56,6 +56,51 @@ unsigned llvm::constrainOperandRegClass(
|
||||
return constrainRegToClass(MRI, TII, RBI, InsertPt, Reg, *RegClass);
|
||||
}
|
||||
|
||||
bool llvm::constrainSelectedInstRegOperands(MachineInstr &I,
|
||||
const TargetInstrInfo &TII,
|
||||
const TargetRegisterInfo &TRI,
|
||||
const RegisterBankInfo &RBI) {
|
||||
MachineBasicBlock &MBB = *I.getParent();
|
||||
MachineFunction &MF = *MBB.getParent();
|
||||
MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
|
||||
for (unsigned OpI = 0, OpE = I.getNumExplicitOperands(); OpI != OpE; ++OpI) {
|
||||
MachineOperand &MO = I.getOperand(OpI);
|
||||
|
||||
// There's nothing to be done on non-register operands.
|
||||
if (!MO.isReg())
|
||||
continue;
|
||||
|
||||
DEBUG(dbgs() << "Converting operand: " << MO << '\n');
|
||||
assert(MO.isReg() && "Unsupported non-reg operand");
|
||||
|
||||
unsigned Reg = MO.getReg();
|
||||
// Physical registers don't need to be constrained.
|
||||
if (TRI.isPhysicalRegister(Reg))
|
||||
continue;
|
||||
|
||||
// Register operands with a value of 0 (e.g. predicate operands) don't need
|
||||
// to be constrained.
|
||||
if (Reg == 0)
|
||||
continue;
|
||||
|
||||
// If the operand is a vreg, we should constrain its regclass, and only
|
||||
// insert COPYs if that's impossible.
|
||||
// constrainOperandRegClass does that for us.
|
||||
MO.setReg(constrainOperandRegClass(MF, TRI, MRI, TII, RBI, I, I.getDesc(),
|
||||
Reg, OpI));
|
||||
|
||||
// Tie uses to defs as indicated in MCInstrDesc if this hasn't already been
|
||||
// done.
|
||||
if (MO.isUse()) {
|
||||
int DefIdx = I.getDesc().getOperandConstraint(OpI, MCOI::TIED_TO);
|
||||
if (DefIdx != -1 && !I.isRegTiedToUseOperand(DefIdx))
|
||||
I.tieOperands(DefIdx, OpI);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool llvm::isTriviallyDead(const MachineInstr &MI,
|
||||
const MachineRegisterInfo &MRI) {
|
||||
// If we can move an instruction, we can remove it. Otherwise, it has
|
||||
|
@ -570,11 +570,11 @@ bool AArch64InstructionSelector::selectCompareBranch(
|
||||
else
|
||||
return false;
|
||||
|
||||
auto MIB = BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(CBOpc))
|
||||
.addUse(LHS)
|
||||
.addMBB(DestMBB);
|
||||
BuildMI(*I.getParent(), I, I.getDebugLoc(), TII.get(CBOpc))
|
||||
.addUse(LHS)
|
||||
.addMBB(DestMBB)
|
||||
.constrainAllUses(TII, TRI, RBI);
|
||||
|
||||
constrainSelectedInstRegOperands(*MIB.getInstr(), TII, TRI, RBI);
|
||||
I.eraseFromParent();
|
||||
return true;
|
||||
}
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include "AMDGPURegisterBankInfo.h"
|
||||
#include "AMDGPURegisterInfo.h"
|
||||
#include "AMDGPUSubtarget.h"
|
||||
#include "llvm/CodeGen/GlobalISel/Utils.h"
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstr.h"
|
||||
|
Loading…
x
Reference in New Issue
Block a user