On 17-06-19 14:35, Alexander Monakov wrote:
> On Mon, 17 Jun 2019, Tom de Vries wrote:
> 
>> Hi Alexander,
>>
>> any comments?
> 
> A couple suggestions (see below), but no serious concerns from my side.
> 
>> --- a/gcc/config/nvptx/nvptx.c
>> +++ b/gcc/config/nvptx/nvptx.c
>> @@ -112,6 +112,17 @@ enum nvptx_data_area
>>    DATA_AREA_MAX
>>  };
>>  
>> +rtx
>> +gen_set_softstack_insn (rtx op)
>> +{
> 
> Here it might be appropriate to have something like
> 
>   gcc_assert (GET_MODE (op) == Pmode);
> 
> because failure to supply a Pmode operand indicates a bug in the caller and
> it may be desirable to catch it here; doesn't make sense to allow restoring
> stack pointer from a 32-bit register with a 64-bit address space.
> 
> Likewise for other instances of this 'if (... DImode) ... else if (... 
> SImode) ...'
> pattern in the patch.
> 

Good point, implemented.

>> +  if (GET_MODE (op) == DImode)
>> +    return gen_set_softstack_insn_di (op);
>> +  else if (GET_MODE (op) == SImode)
>> +    return gen_set_softstack_insn_si (op);
>> +  else
>> +    gcc_unreachable ();
>> +}
>> +
>>  /*  We record the data area in the target symbol flags.  */
>>  #define SYMBOL_DATA_AREA(SYM) \
>>    (nvptx_data_area)((SYMBOL_REF_FLAGS (SYM) >> SYMBOL_FLAG_MACH_DEP_SHIFT) \
>> diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
>> index 3ed5296db96..1a676b942b2 100644
>> --- a/gcc/config/nvptx/nvptx.md
>> +++ b/gcc/config/nvptx/nvptx.md
>> @@ -1071,8 +1071,8 @@
>>    DONE;
>>  })
>>  
>> -(define_insn "set_softstack_insn"
>> -  [(unspec [(match_operand 0 "nvptx_register_operand" "R")]
>> +(define_insn "set_softstack_insn_<mode>"
>> +  [(unspec [(match_operand:P 0 "nvptx_register_operand" "R")]
> 
> A purely cosmetic issue, but I'll mention it for completeness: the '_insn'
> suffix is unnecessary with the '_<mode>' suffix added. This is how e.g. the
> i386 backend deals with a similar issue, they have 'stack_protect_test' expand
> and 'stack_protect_test_<mode>' insns.

Updated accordingly, and committed as attached.

Thanks,
- Tom
[nvptx] Fix missing mode warnings in nvptx.md, omp part

Fix these warnings:
...
gcc/config/nvptx/nvptx.md:1074:1: warning: operand 0 missing mode?
gcc/config/nvptx/nvptx.md:1240:1: warning: operand 0 missing mode?
gcc/config/nvptx/nvptx.md:1240:1: warning: operand 1 missing mode?
gcc/config/nvptx/nvptx.md:1240:1: warning: operand 2 missing mode?
gcc/config/nvptx/nvptx.md:1268:1: warning: operand 0 missing mode?
...

Build and reg-tested on x86_64 with nvptx accelerator.

2019-06-17  Tom de Vries  <tdevr...@suse.de>

	* config/nvptx/nvptx-protos.h (gen_set_softstack_insn): Declare.
	* config/nvptx/nvptx.c (gen_set_softstack_insn): New function.
	* config/nvptx/nvptx.md (define_insn "set_softstack_insn"): Rename to
	...
	(define_insn "set_softstack_<mode>"): ... this.  Use P iterator on
	match_operand 0.
	(define_insn "omp_simt_enter_insn"): Rename to ...
	(define_insn "omp_simt_enter_<mode>"): ... this.  Use P iterator on
	match_operand 0, 1 and 2, as well as the unspec_volatile result.
	(define_expand "omp_simt_enter): Use gen_omp_simt_enter_di and
	gen_omp_simt_enter_si.
	(define_expand "omp_simt_exit"): New.
	(define_insn "omp_simt_exit"): Rename to ...
	(define_insn "omp_simt_exit_<mode>"): ... this.  Use P iterator on
	match_operand 0.

---
 gcc/config/nvptx/nvptx-protos.h |  1 +
 gcc/config/nvptx/nvptx.c        | 12 ++++++++++++
 gcc/config/nvptx/nvptx.md       | 38 +++++++++++++++++++++++++++++---------
 3 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/gcc/config/nvptx/nvptx-protos.h b/gcc/config/nvptx/nvptx-protos.h
index be09a15e49c..061897a3921 100644
--- a/gcc/config/nvptx/nvptx-protos.h
+++ b/gcc/config/nvptx/nvptx-protos.h
@@ -57,5 +57,6 @@ extern const char *nvptx_output_set_softstack (unsigned);
 extern const char *nvptx_output_simt_enter (rtx, rtx, rtx);
 extern const char *nvptx_output_simt_exit (rtx);
 extern const char *nvptx_output_red_partition (rtx, rtx);
+extern rtx gen_set_softstack_insn (rtx);
 #endif
 #endif
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index c53a1ae9f26..aa4a67fbead 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -112,6 +112,18 @@ enum nvptx_data_area
   DATA_AREA_MAX
 };
 
+rtx
+gen_set_softstack_insn (rtx op)
+{
+  gcc_assert (GET_MODE (op) == Pmode);
+  if (GET_MODE (op) == DImode)
+    return gen_set_softstack_di (op);
+  else if (GET_MODE (op) == SImode)
+    return gen_set_softstack_si (op);
+  else
+    gcc_unreachable ();
+}
+
 /*  We record the data area in the target symbol flags.  */
 #define SYMBOL_DATA_AREA(SYM) \
   (nvptx_data_area)((SYMBOL_REF_FLAGS (SYM) >> SYMBOL_FLAG_MACH_DEP_SHIFT) \
diff --git a/gcc/config/nvptx/nvptx.md b/gcc/config/nvptx/nvptx.md
index 3ed5296db96..84c0ea45431 100644
--- a/gcc/config/nvptx/nvptx.md
+++ b/gcc/config/nvptx/nvptx.md
@@ -1071,8 +1071,8 @@
   DONE;
 })
 
-(define_insn "set_softstack_insn"
-  [(unspec [(match_operand 0 "nvptx_register_operand" "R")]
+(define_insn "set_softstack_<mode>"
+  [(unspec [(match_operand:P 0 "nvptx_register_operand" "R")]
 	   UNSPEC_SET_SOFTSTACK)]
   "TARGET_SOFT_STACK"
 {
@@ -1237,10 +1237,10 @@
 
 ;; Patterns for OpenMP SIMD-via-SIMT lowering
 
-(define_insn "omp_simt_enter_insn"
-  [(set (match_operand 0 "nvptx_register_operand" "=R")
-	(unspec_volatile [(match_operand 1 "nvptx_nonmemory_operand" "Ri")
-			    (match_operand 2 "nvptx_nonmemory_operand" "Ri")]
+(define_insn "omp_simt_enter_<mode>"
+  [(set (match_operand:P 0 "nvptx_register_operand" "=R")
+	(unspec_volatile:P [(match_operand:P 1 "nvptx_nonmemory_operand" "Ri")
+			    (match_operand:P 2 "nvptx_nonmemory_operand" "Ri")]
 			   UNSPECV_SIMT_ENTER))]
   ""
 {
@@ -1261,12 +1261,32 @@
   cfun->machine->simt_stack_align = MAX (UINTVAL (operands[2]),
 					 cfun->machine->simt_stack_align);
   cfun->machine->has_simtreg = true;
-  emit_insn (gen_omp_simt_enter_insn (operands[0], operands[1], operands[2]));
+  gcc_assert (GET_MODE (operands[0]) == Pmode);
+  if (GET_MODE (operands[0]) == DImode)
+    emit_insn (gen_omp_simt_enter_di (operands[0], operands[1], operands[2]));
+  else if (GET_MODE (operands[0]) == SImode)
+    emit_insn (gen_omp_simt_enter_si (operands[0], operands[1], operands[2]));
+  else
+    gcc_unreachable ();
+  DONE;
+})
+
+(define_expand "omp_simt_exit"
+  [(match_operand 0 "nvptx_register_operand" "R")]
+  ""
+{
+  gcc_assert (GET_MODE (operands[0]) == Pmode);
+  if (GET_MODE (operands[0]) == DImode)
+    emit_insn (gen_omp_simt_exit_di (operands[0]));
+  else if (GET_MODE (operands[0]) == SImode)
+    emit_insn (gen_omp_simt_exit_si (operands[0]));
+  else
+    gcc_unreachable ();
   DONE;
 })
 
-(define_insn "omp_simt_exit"
-  [(unspec_volatile [(match_operand 0 "nvptx_register_operand" "R")]
+(define_insn "omp_simt_exit_<mode>"
+  [(unspec_volatile [(match_operand:P 0 "nvptx_register_operand" "R")]
 		    UNSPECV_SIMT_EXIT)]
   ""
 {

Reply via email to