From: Matt Arsenault Date: Thu, 23 Jun 2016 01:26:16 +0000 (+0000) Subject: AMDGPU: readlane/writelane do not read exec X-Git-Tag: android-x86-7.1-r4~31371 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=8552cfd5cabcfb1e02fdbadbf77cfbd6a48f59b1;p=android-x86%2Fexternal-llvm.git AMDGPU: readlane/writelane do not read exec git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273525 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/AMDGPU/SIInstrInfo.cpp b/lib/Target/AMDGPU/SIInstrInfo.cpp index 05c73f901ec..d23b14c8d6c 100644 --- a/lib/Target/AMDGPU/SIInstrInfo.cpp +++ b/lib/Target/AMDGPU/SIInstrInfo.cpp @@ -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; diff --git a/lib/Target/AMDGPU/SIInstructions.td b/lib/Target/AMDGPU/SIInstructions.td index 23717daaa16..db1038d9fdf 100644 --- a/lib/Target/AMDGPU/SIInstructions.td +++ b/lib/Target/AMDGPU/SIInstructions.td @@ -1586,7 +1586,8 @@ defm V_SUBBREV_U32 : VOP2bInst , "v_subbrev_u32", } // End isCommutable = 1 -let isConvergent = 1 in { +// These are special and do not read the exec mask. +let isConvergent = 1, Uses = [] in { defm V_READLANE_B32 : VOP2SI_3VI_m < vop3 <0x001, 0x289>,