[PATCH] D94746: [AMDGPU] Move kill lowering to WQM pass and add live mask tracking

Jay Foad via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 27 05:36:08 PST 2021


foad added inline comments.


================
Comment at: llvm/lib/Target/AMDGPU/SIWholeQuadMode.cpp:693
+  case ISD::SETEQ:
+    Opcode = AMDGPU::V_CMP_LG_F32_e64;
+    break;
----------------
critson wrote:
> foad wrote:
> > I still don't trust this table! I think the "O" predicates should map to "N" opcodes e.g. SETOLT -> V_CMP_NLT as explained above.
> Are you expecting the table to look like this?
> ```
>   case ISD::SETEQ:
>     Opcode = AMDGPU::V_CMP_LG_F32_e64;
>     break;
>   case ISD::SETGT:
>     Opcode = AMDGPU::V_CMP_GE_F32_e64;
>     break;
>   case ISD::SETGE:
>     Opcode = AMDGPU::V_CMP_GT_F32_e64;
>     break;
>   case ISD::SETLT:
>     Opcode = AMDGPU::V_CMP_LE_F32_e64;
>     break;
>   case ISD::SETLE:
>     Opcode = AMDGPU::V_CMP_LT_F32_e64;
>     break;
>   case ISD::SETNE:
>     Opcode = AMDGPU::V_CMP_EQ_F32_e64;
>     break;
>   case ISD::SETO:
>     Opcode = AMDGPU::V_CMP_O_F32_e64;
>     break;
>   case ISD::SETUO:
>     Opcode = AMDGPU::V_CMP_U_F32_e64;
>     break;
>   case ISD::SETOEQ:
>   case ISD::SETUEQ:
>     Opcode = AMDGPU::V_CMP_NEQ_F32_e64;
>     break;
>   case ISD::SETOGT:
>   case ISD::SETUGT:
>     Opcode = AMDGPU::V_CMP_NLT_F32_e64;
>     break;
>   case ISD::SETOGE:
>   case ISD::SETUGE:
>     Opcode = AMDGPU::V_CMP_NLE_F32_e64;
>     break;
>   case ISD::SETOLT:
>   case ISD::SETULT:
>     Opcode = AMDGPU::V_CMP_NGT_F32_e64;
>     break;
>   case ISD::SETOLE:
>   case ISD::SETULE:
>     Opcode = AMDGPU::V_CMP_NGE_F32_e64;
>     break;
>   case ISD::SETONE:
>   case ISD::SETUNE:
>     Opcode = AMDGPU::V_CMP_NLG_F32_e64;
>     break;
> ```
> 
> I am still testing, but I am unsure if VulkanCTS or game shaders can tell the differences.
No I'm expecting it to look like this:
```
case ISD::SETOEQ:
case ISD::SETEQ:
  Opcode = AMDGPU::V_CMP_NEQ_F32_e64;
  break;
case ISD::SETOGT:
case ISD::SETGT:
  Opcode = AMDGPU::V_CMP_NLT_F32_e64;
  break;
case ISD::SETOGE:
case ISD::SETGE:
  Opcode = AMDGPU::V_CMP_NLE_F32_e64;
  break;
case ISD::SETOLT:
case ISD::SETLT:
  Opcode = AMDGPU::V_CMP_NGT_F32_e64;
  break;
case ISD::SETOLE:
case ISD::SETLE:
  Opcode = AMDGPU::V_CMP_NGE_F32_e64;
  break;
case ISD::SETONE:
  Opcode = AMDGPU::V_CMP_NLG_F32_e64;
  break;
case ISD::SETO:
  Opcode = AMDGPU::V_CMP_U_F32_e64;
  break;
case ISD::SETUO:
  Opcode = AMDGPU::V_CMP_O_F32_e64;
  break;
case ISD::SETUEQ:
  Opcode = AMDGPU::V_CMP_LG_F32_e64;
  break;
case ISD::SETUGT:
  Opcode = AMDGPU::V_CMP_GE_F32_e64;
  break;
case ISD::SETUGE:
  Opcode = AMDGPU::V_CMP_GT_F32_e64;
  break;
case ISD::SETULT:
  Opcode = AMDGPU::V_CMP_LE_F32_e64;
  break;
case ISD::SETULE:
  Opcode = AMDGPU::V_CMP_LT_F32_e64;
  break;
case ISD::SETUNE:
case ISD::SETNE:
  Opcode = AMDGPU::V_CMP_EQ_F32_e64;
  break;
```
E.g. SETOGT --(swap operands)--> SETOLT --(invert)-->SETUGE which is V_CMP_NLT.

(Though as mentioned previously, SETEQ is undefined on NaNs, so it doesn't matter whether it behaves the same as SETOEQ or the same as SETUEQ. And likewise for all the others that don't have an explicit O or U.)


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D94746/new/

https://reviews.llvm.org/D94746



More information about the llvm-commits mailing list