diff mbox

Fix ICEs in simplify_immed_subreg on OImode/XImode subregs (PR target/63910)

Message ID 20141119215709.GM1745@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Nov. 19, 2014, 9:57 p.m. UTC
On Wed, Nov 19, 2014 at 10:38:57AM -0800, Mike Stump wrote:
> On Nov 19, 2014, at 4:24 AM, Richard Biener <rguenther@suse.de> wrote:
> > On Wed, 19 Nov 2014, Jakub Jelinek wrote:
> >> For TARGET_SUPPORTS_WIDE_INT == 0 should be hopefully ok.  Not sure
> >> about TARGET_SUPPORTS_WIDE_INT != 0, can it express any generic_wide_int, or
> >> is it still bound to wide_int (i.e. MAX_BITSIZE_MODE_ANY_INT rounded up)
> >> precision?  Mike?
> > 
> > It can represent any - well, the RTX at least.  Code then using
> > "simple" wide_int may wreck then though.
> 
> So, my worry is this…  once you start in on adding support here or there
> for int modes wider than the largest supported int mode, you create a
> never ending maintenance nightmare with complex rules that one will never
> be able to keep straight.  There needs to be a single line or two, that
> explains the rules that we all agree to, then it will always be clear what
> the rule is.  The largest supported int mode is: x, has a nice, simple,
> easy to explain aspect to it.

Well, at least for TARGET_SUPPORTS_WIDE_INT == 0 my patch would always
create CONST_INTs or CONST_DOUBLEs, which all fit into
MAX_BITSIZE_MODE_ANY_INT bits, CONST_INTs are modeless, so in what wider
mode you use them doesn't matter.  For TARGET_SUPPORTS_WIDE_INT != 0
we could certainly cap it similarly, if wi::min_precision (r, SIGNED) >
MAX_BITSIZE_MODE_ANY_INT we could return NULL_RTX.

Though, following patch is just fine for me too, I don't think it will
make a significant difference:



	Jakub

Comments

Mike Stump Nov. 19, 2014, 10:23 p.m. UTC | #1
On Nov 19, 2014, at 1:57 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Though, following patch is just fine for me too, I don't think it will
> make a significant difference:

This version is fine by me.

> --- gcc/simplify-rtx.c	2014-11-19 15:39:24.073113107 +0100
> +++ gcc/simplify-rtx.c	2014-11-19 22:55:44.201464253 +0100
> @@ -5504,6 +5504,8 @@ simplify_immed_subreg (machine_mode oute
> 	    HOST_WIDE_INT tmp[MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT];
> 	    wide_int r;
> 
> +	    if (GET_MODE_PRECISION (outer_submode) > MAX_BITSIZE_MODE_ANY_INT)
> +	      return NULL_RTX;
> 	    for (u = 0; u < units; u++)
> 	      {
> 		unsigned HOST_WIDE_INT buf = 0;
> @@ -5515,10 +5517,13 @@ simplify_immed_subreg (machine_mode oute
> 		tmp[u] = buf;
> 		base += HOST_BITS_PER_WIDE_INT;
> 	      }
> -	    gcc_assert (GET_MODE_PRECISION (outer_submode)
> -			<= MAX_BITSIZE_MODE_ANY_INT);
> 	    r = wide_int::from_array (tmp, units,
> 				      GET_MODE_PRECISION (outer_submode));
> +#if TARGET_SUPPORTS_WIDE_INT == 0
> +	    /* Make sure r will fit into CONST_INT or CONST_DOUBLE.  */
> +	    if (wi::min_precision (r, SIGNED) > HOST_BITS_PER_DOUBLE_INT)
> +	      return NULL_RTX;
> +#endif
diff mbox

Patch

--- gcc/simplify-rtx.c	2014-11-19 15:39:24.073113107 +0100
+++ gcc/simplify-rtx.c	2014-11-19 22:55:44.201464253 +0100
@@ -5504,6 +5504,8 @@  simplify_immed_subreg (machine_mode oute
 	    HOST_WIDE_INT tmp[MAX_BITSIZE_MODE_ANY_INT / HOST_BITS_PER_WIDE_INT];
 	    wide_int r;
 
+	    if (GET_MODE_PRECISION (outer_submode) > MAX_BITSIZE_MODE_ANY_INT)
+	      return NULL_RTX;
 	    for (u = 0; u < units; u++)
 	      {
 		unsigned HOST_WIDE_INT buf = 0;
@@ -5515,10 +5517,13 @@  simplify_immed_subreg (machine_mode oute
 		tmp[u] = buf;
 		base += HOST_BITS_PER_WIDE_INT;
 	      }
-	    gcc_assert (GET_MODE_PRECISION (outer_submode)
-			<= MAX_BITSIZE_MODE_ANY_INT);
 	    r = wide_int::from_array (tmp, units,
 				      GET_MODE_PRECISION (outer_submode));
+#if TARGET_SUPPORTS_WIDE_INT == 0
+	    /* Make sure r will fit into CONST_INT or CONST_DOUBLE.  */
+	    if (wi::min_precision (r, SIGNED) > HOST_BITS_PER_DOUBLE_INT)
+	      return NULL_RTX;
+#endif
 	    elems[elem] = immed_wide_int_const (r, outer_submode);
 	  }
 	  break;