diff mbox series

[1/4] RTL: Update `const_double_zero' handling for mode and callable insns

Message ID alpine.LFD.2.21.2101072205360.1637534@eddie.linux-mips.org
State Accepted
Headers show
Series Fixes for `const_double_zero' use + VAX iterator simplification | expand

Commit Message

Maciej W. Rozycki Jan. 8, 2021, 1:50 a.m. UTC
Handle machine mode specification with `const_double_zero' and handle 
the rtx with callable code produced from named insns.  Complementing 
commit 20ab43b5cad6 ("RTL: Add `const_double_zero' syntactic rtx") and 
removing a commit c60d0736dff7 ("PDP11: Use `const_double_zero' to 
express double zero constant") build regression observed with the 
`pdp11-aout' target:

genemit: Internal error: abort in gen_exp, at genemit.c:202
make[2]: *** [Makefile:2427: s-emit] Error 1

where a:

(const_double 0 [0] 0 [0] 0 [0] 0 [0])

rtx coming from:

(parallel [
        (set (reg:CC 16)
            (compare:CC (abs:DF (match_operand:DF 1 ("general_operand") ("0,0")))
                (const_double 0 [0] 0 [0] 0 [0] 0 [0])))
        (set (match_operand:DF 0 ("nonimmediate_operand") ("=fR,Q"))
            (abs:DF (match_dup 1)))
    ])

and ultimately `(const_double_zero)' referred in a named RTL insn cannot 
be interpreted.  Handle the rtx then by supplying the constant 0 double 
operand requested, resulting in the following update to insn-emit.c code 
produced for the `pdp11-aout' target, relative to before the triggering 
commit:

@@ -1514,7 +1514,7 @@ gen_absdf2_cc (rtx operand0 ATTRIBUTE_UN
 	gen_rtx_COMPARE (CCmode,
 	gen_rtx_ABS (DFmode,
 	operand1),
-	const0_rtx)),
+	CONST_DOUBLE_ATOF ("0", VOIDmode))),
 		gen_rtx_SET (operand0,
 	gen_rtx_ABS (DFmode,
 	copy_rtx (operand1)))));
@@ -1555,7 +1555,7 @@ gen_negdf2_cc (rtx operand0 ATTRIBUTE_UN
 	gen_rtx_COMPARE (CCmode,
 	gen_rtx_NEG (DFmode,
 	operand1),
-	const0_rtx)),
+	CONST_DOUBLE_ATOF ("0", VOIDmode))),
 		gen_rtx_SET (operand0,
 	gen_rtx_NEG (DFmode,
 	copy_rtx (operand1)))));
@@ -1790,7 +1790,7 @@ gen_muldf3_cc (rtx operand0 ATTRIBUTE_UN
 	gen_rtx_MULT (DFmode,
 	operand1,
 	operand2),
-	const0_rtx)),
+	CONST_DOUBLE_ATOF ("0", VOIDmode))),
 		gen_rtx_SET (operand0,
 	gen_rtx_MULT (DFmode,
 	copy_rtx (operand1),
@@ -1942,7 +1942,7 @@ gen_divdf3_cc (rtx operand0 ATTRIBUTE_UN
 	gen_rtx_DIV (DFmode,
 	operand1,
 	operand2),
-	const0_rtx)),
+	CONST_DOUBLE_ATOF ("0", VOIDmode))),
 		gen_rtx_SET (operand0,
 	gen_rtx_DIV (DFmode,
 	copy_rtx (operand1),

This does not (yet) remove VOIDmode CONST_DOUBLE use, as it is up to 
individual machine descriptions to choose.

	gcc/
	* genemit.c (gen_exp) <CONST_DOUBLE>: Handle `const_double_zero' 
	rtx.
	* read-rtl.c (rtx_reader::read_rtx_code): Handle machine mode 
	with `const_double_zero'.
	* doc/rtl.texi (Constant Expression Types): Document it.
---
 gcc/doc/rtl.texi |    4 ++--
 gcc/genemit.c    |    8 ++++++++
 gcc/read-rtl.c   |    9 +++++++++
 3 files changed, 19 insertions(+), 2 deletions(-)

gcc-const-double-zero-mode.diff

Comments

Jeff Law Jan. 8, 2021, 8:11 p.m. UTC | #1
On 1/7/21 6:50 PM, Maciej W. Rozycki wrote:
> Handle machine mode specification with `const_double_zero' and handle 
> the rtx with callable code produced from named insns.  Complementing 
> commit 20ab43b5cad6 ("RTL: Add `const_double_zero' syntactic rtx") and 
> removing a commit c60d0736dff7 ("PDP11: Use `const_double_zero' to 
> express double zero constant") build regression observed with the 
> `pdp11-aout' target:
>
> genemit: Internal error: abort in gen_exp, at genemit.c:202
> make[2]: *** [Makefile:2427: s-emit] Error 1
>
> where a:
>
> (const_double 0 [0] 0 [0] 0 [0] 0 [0])
>
> rtx coming from:
>
> (parallel [
>         (set (reg:CC 16)
>             (compare:CC (abs:DF (match_operand:DF 1 ("general_operand") ("0,0")))
>                 (const_double 0 [0] 0 [0] 0 [0] 0 [0])))
>         (set (match_operand:DF 0 ("nonimmediate_operand") ("=fR,Q"))
>             (abs:DF (match_dup 1)))
>     ])
>
> and ultimately `(const_double_zero)' referred in a named RTL insn cannot 
> be interpreted.  Handle the rtx then by supplying the constant 0 double 
> operand requested, resulting in the following update to insn-emit.c code 
> produced for the `pdp11-aout' target, relative to before the triggering 
> commit:
>
> @@ -1514,7 +1514,7 @@ gen_absdf2_cc (rtx operand0 ATTRIBUTE_UN
>  	gen_rtx_COMPARE (CCmode,
>  	gen_rtx_ABS (DFmode,
>  	operand1),
> -	const0_rtx)),
> +	CONST_DOUBLE_ATOF ("0", VOIDmode))),
>  		gen_rtx_SET (operand0,
>  	gen_rtx_ABS (DFmode,
>  	copy_rtx (operand1)))));
> @@ -1555,7 +1555,7 @@ gen_negdf2_cc (rtx operand0 ATTRIBUTE_UN
>  	gen_rtx_COMPARE (CCmode,
>  	gen_rtx_NEG (DFmode,
>  	operand1),
> -	const0_rtx)),
> +	CONST_DOUBLE_ATOF ("0", VOIDmode))),
>  		gen_rtx_SET (operand0,
>  	gen_rtx_NEG (DFmode,
>  	copy_rtx (operand1)))));
> @@ -1790,7 +1790,7 @@ gen_muldf3_cc (rtx operand0 ATTRIBUTE_UN
>  	gen_rtx_MULT (DFmode,
>  	operand1,
>  	operand2),
> -	const0_rtx)),
> +	CONST_DOUBLE_ATOF ("0", VOIDmode))),
>  		gen_rtx_SET (operand0,
>  	gen_rtx_MULT (DFmode,
>  	copy_rtx (operand1),
> @@ -1942,7 +1942,7 @@ gen_divdf3_cc (rtx operand0 ATTRIBUTE_UN
>  	gen_rtx_DIV (DFmode,
>  	operand1,
>  	operand2),
> -	const0_rtx)),
> +	CONST_DOUBLE_ATOF ("0", VOIDmode))),
>  		gen_rtx_SET (operand0,
>  	gen_rtx_DIV (DFmode,
>  	copy_rtx (operand1),
>
> This does not (yet) remove VOIDmode CONST_DOUBLE use, as it is up to 
> individual machine descriptions to choose.
>
> 	gcc/
> 	* genemit.c (gen_exp) <CONST_DOUBLE>: Handle `const_double_zero' 
> 	rtx.
> 	* read-rtl.c (rtx_reader::read_rtx_code): Handle machine mode 
> 	with `const_double_zero'.
> 	* doc/rtl.texi (Constant Expression Types): Document it.
OK
jeff
diff mbox series

Patch

Index: gcc/gcc/doc/rtl.texi
===================================================================
--- gcc.orig/gcc/doc/rtl.texi
+++ gcc/gcc/doc/rtl.texi
@@ -1719,13 +1719,13 @@  of code @code{const_double} and therefor
 provided:
 
 @smallexample
-(const_double_zero)
+(const_double_zero:@var{m})
 @end smallexample
 
 standing for:
 
 @smallexample
-(const_double 0 0 @dots{})
+(const_double:@var{m} 0 0 @dots{})
 @end smallexample
 
 for matching the floating-point value zero, possibly the only useful one.
Index: gcc/gcc/genemit.c
===================================================================
--- gcc.orig/gcc/genemit.c
+++ gcc/gcc/genemit.c
@@ -195,6 +195,14 @@  gen_exp (rtx x, enum rtx_code subroutine
       return;
 
     case CONST_DOUBLE:
+      /* Handle `const_double_zero' rtx.  */
+      if (CONST_DOUBLE_REAL_VALUE (x)->cl == rvc_zero)
+	{
+	  printf ("CONST_DOUBLE_ATOF (\"0\", %smode)",
+		  GET_MODE_NAME (GET_MODE (x)));
+	  return;
+	}
+      /* Fall through.  */
     case CONST_FIXED:
     case CONST_WIDE_INT:
       /* These shouldn't be written in MD files.  Instead, the appropriate
Index: gcc/gcc/read-rtl.c
===================================================================
--- gcc.orig/gcc/read-rtl.c
+++ gcc/gcc/read-rtl.c
@@ -1658,6 +1658,15 @@  rtx_reader::read_rtx_code (const char *c
       return_rtx = rtx_alloc (code);
       memset (return_rtx, 0, RTX_CODE_SIZE (code));
       PUT_CODE (return_rtx, code);
+      c = read_skip_spaces ();
+      if (c == ':')
+	{
+	  file_location loc = read_name (&name);
+	  record_potential_iterator_use (&modes, loc, return_rtx, 0,
+					 name.string);
+	}
+      else
+	unread_char (c);
       return return_rtx;
     }