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

Reply via email to