https://gcc.gnu.org/g:72a445d4792bef6ac394f70a49efc227c20f57f6
commit 72a445d4792bef6ac394f70a49efc227c20f57f6 Author: Roger Sayle <ro...@nextmovesoftware.com> Date: Sun May 19 09:49:45 2024 +0100 nvptx: Correct pattern for popcountdi2 insn in nvptx.md. The result of a POPCOUNT operation in RTL should have the same mode as its operand. This corrects the specification of popcount in the nvptx backend, splitting the current generic define_insn into two, one for popcountsi2 and the other for popcountdi2 (the latter with an explicit truncate). 2024-05-19 Roger Sayle <ro...@nextmovesoftware.com> gcc/ChangeLog * config/nvptx/nvptx.md (popcount<mode>2): Split into... (popcountsi2): define_insn handling SImode popcount. (popcountdi2): define_insn handling DImode popcount, with an explicit truncate:SI to produce an SImode result. (cherry picked from commit 1676ef6e91b902f592270e4bcf10b4fc342e200d) Diff: --- gcc/ChangeLog.omp | 7 +++++++ gcc/config/nvptx/nvptx.md | 13 ++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog.omp b/gcc/ChangeLog.omp index 11d36c3c6fc..ac4a30e81c8 100644 --- a/gcc/ChangeLog.omp +++ b/gcc/ChangeLog.omp @@ -1,3 +1,10 @@ +2024-05-19 Roger Sayle <ro...@nextmovesoftware.com> + + * config/nvptx/nvptx.md (popcount<mode>2): Split into... + (popcountsi2): define_insn handling SImode popcount. + (popcountdi2): define_insn handling DImode popcount, with an + explicit truncate:SI to produce an SImode result. + 2024-04-16 Andrew Pinski <quic_apin...@quicinc.com> PR middle-end/23872 diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md index 872f4341899..18033bef699 100644 --- a/gcc/config/nvptx/nvptx.md +++ b/gcc/config/nvptx/nvptx.md @@ -669,11 +669,18 @@ DONE; }) -(define_insn "popcount<mode>2" +(define_insn "popcountsi2" [(set (match_operand:SI 0 "nvptx_register_operand" "=R") - (popcount:SI (match_operand:SDIM 1 "nvptx_register_operand" "R")))] + (popcount:SI (match_operand:SI 1 "nvptx_register_operand" "R")))] "" - "%.\\tpopc.b%T1\\t%0, %1;") + "%.\\tpopc.b32\\t%0, %1;") + +(define_insn "popcountdi2" + [(set (match_operand:SI 0 "nvptx_register_operand" "=R") + (truncate:SI + (popcount:DI (match_operand:DI 1 "nvptx_register_operand" "R"))))] + "" + "%.\\tpopc.b64\\t%0, %1;") ;; Multiplication variants