forked from OSchip/llvm-project
AMDGPU: readlane/writelane do not read exec
llvm-svn: 273525
This commit is contained in:
parent
cb6dae22e2
commit
529cf25e60
|
@ -1631,6 +1631,29 @@ static unsigned findImplicitSGPRRead(const MachineInstr &MI) {
|
|||
return AMDGPU::NoRegister;
|
||||
}
|
||||
|
||||
static bool shouldReadExec(const MachineInstr &MI) {
|
||||
if (SIInstrInfo::isVALU(MI)) {
|
||||
switch (MI.getOpcode()) {
|
||||
case AMDGPU::V_READLANE_B32:
|
||||
case AMDGPU::V_READLANE_B32_si:
|
||||
case AMDGPU::V_READLANE_B32_vi:
|
||||
case AMDGPU::V_WRITELANE_B32:
|
||||
case AMDGPU::V_WRITELANE_B32_si:
|
||||
case AMDGPU::V_WRITELANE_B32_vi:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
if (SIInstrInfo::isGenericOpcode(MI.getOpcode()) ||
|
||||
SIInstrInfo::isSALU(MI) ||
|
||||
SIInstrInfo::isSMRD(MI))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SIInstrInfo::verifyInstruction(const MachineInstr *MI,
|
||||
StringRef &ErrInfo) const {
|
||||
uint16_t Opcode = MI->getOpcode();
|
||||
|
@ -1751,7 +1774,7 @@ bool SIInstrInfo::verifyInstruction(const MachineInstr *MI,
|
|||
|
||||
// Make sure we aren't losing exec uses in the td files. This mostly requires
|
||||
// being careful when using let Uses to try to add other use registers.
|
||||
if (!isGenericOpcode(Opcode) && !isSALU(Opcode) && !isSMRD(Opcode)) {
|
||||
if (shouldReadExec(*MI)) {
|
||||
if (!MI->hasRegisterImplicitUseOperand(AMDGPU::EXEC)) {
|
||||
ErrInfo = "VALU instruction does not implicitly read exec mask";
|
||||
return false;
|
||||
|
|
|
@ -1586,7 +1586,8 @@ defm V_SUBBREV_U32 : VOP2bInst <vop2<0x2a, 0x1e>, "v_subbrev_u32",
|
|||
|
||||
} // End isCommutable = 1
|
||||
|
||||
let isConvergent = 1 in {
|
||||
// These are special and do not read the exec mask.
|
||||
let isConvergent = 1, Uses = []<Register> in {
|
||||
|
||||
defm V_READLANE_B32 : VOP2SI_3VI_m <
|
||||
vop3 <0x001, 0x289>,
|
||||
|
|
Loading…
Reference in New Issue