[nvptx] Correct pattern for popcountdi2 insn in nvptx.md.

Message ID 00b601d9242e$5fe32ec0$1fa98c40$@nextmovesoftware.com
State Accepted
Headers
Series [nvptx] Correct pattern for popcountdi2 insn in nvptx.md. |

Commit Message

Roger Sayle Jan. 9, 2023, 1:29 p.m. UTC
  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).

This patch has been tested on nvptx-none (hosted on x86_64-pc-linux-gnu)
with make and make -k check with no new failures.  This functionality is
already tested by gcc.target/nvptx/popc-[123].c.  Ok for mainline?


2023-01-09  Roger Sayle  <roger@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.

Thanks in advance,
Roger
--
  

Comments

Thomas Schwinge April 12, 2024, 10:16 p.m. UTC | #1
Hi Roger!

On 2023-01-09T13:29:14+0000, "Roger Sayle" <roger@nextmovesoftware.com> wrote:
> 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).
>
> This patch has been tested on nvptx-none (hosted on x86_64-pc-linux-gnu)
> with make and make -k check with no new failures.  This functionality is
> already tested by gcc.target/nvptx/popc-[123].c.

So I compared '-fdump-rtl-all' and '*.s' of current vs. patched for those
three '*.c' files.  It is expected that I only see '(popcount:SI [DI])'
-> '(truncate:SI (popcount:DI [DI]))', but not any actually observable
change, right?

Shouldn't the current erronuous form trigger a '--enable-checking=rtl'
error?

> Ok for mainline?

OK, thanks.


..., and sorry for the great delay!  The chaos that came upon my group
half a year ago, and resulted in having had to switch employers, has not
exactly helped to allow allocating proper time for better learning GCC
back end.  But, fortunately, we've been able to switch employers!


Grüße
 Thomas


> 2023-01-09  Roger Sayle  <roger@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.
>
> Thanks in advance,
> Roger
> --
>
> diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
> index 740c4de..461540e 100644
> --- a/gcc/config/nvptx/nvptx.md
> +++ b/gcc/config/nvptx/nvptx.md
> @@ -658,11 +658,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
>
  

Patch

diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index 740c4de..461540e 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -658,11 +658,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