diff mbox

Make SRA produce integer replacements for enumeration types

Message ID 20110906173939.GC21263@virgil.arch.suse.de
State New
Headers show

Commit Message

Martin Jambor Sept. 6, 2011, 5:39 p.m. UTC
Hi,

the patch below makes SRA produce intere type replacements when it
currently produces enumeration type ones because this then may cause
VRP to assume wrong bounds (PR 49911).

I do not know how to create a testcase for the PR this should solve
because I could not reproduce it on yesterday's trunk checkout.

The patch is against trunk, where it successfully passes bootstrap and
testing on x86_64-linux, but applies well also to 4.6 and 4.5 branches
and there has been a request to commit them there as well so I'd like
to do so (after testing it on them which I have not done yet).

OK?

Thanks,

Martin


2011-09-05  Martin Jambor  <mjambor@suse.cz>

	PR tree-optimization/49911
	* tree-sra.c (analyze_access_subtree): Change type of to-be-replaced
	enumerations to the corresponding plain integer type.

Comments

Richard Biener Sept. 7, 2011, 8:08 a.m. UTC | #1
On Tue, 6 Sep 2011, Martin Jambor wrote:

> Hi,
> 
> the patch below makes SRA produce intere type replacements when it
> currently produces enumeration type ones because this then may cause
> VRP to assume wrong bounds (PR 49911).
> 
> I do not know how to create a testcase for the PR this should solve
> because I could not reproduce it on yesterday's trunk checkout.
> 
> The patch is against trunk, where it successfully passes bootstrap and
> testing on x86_64-linux, but applies well also to 4.6 and 4.5 branches
> and there has been a request to commit them there as well so I'd like
> to do so (after testing it on them which I have not done yet).
> 
> OK?

Ok.  Can you add the testcase from the PR?

Thanks,
Richard.

> Thanks,
> 
> Martin
> 
> 
> 2011-09-05  Martin Jambor  <mjambor@suse.cz>
> 
> 	PR tree-optimization/49911
> 	* tree-sra.c (analyze_access_subtree): Change type of to-be-replaced
> 	enumerations to the corresponding plain integer type.
> 
> Index: src/gcc/tree-sra.c
> ===================================================================
> --- src.orig/gcc/tree-sra.c
> +++ src/gcc/tree-sra.c
> @@ -2075,13 +2075,25 @@ analyze_access_subtree (struct access *r
>  	  || ((root->grp_scalar_read || root->grp_assignment_read)
>  	      && (root->grp_scalar_write || root->grp_assignment_write))))
>      {
> +      bool new_integer_type;
> +      if (TREE_CODE (root->type) == ENUMERAL_TYPE)
> +	{
> +	  tree rt = root->type;
> +	  root->type = build_nonstandard_integer_type (TYPE_PRECISION (rt),
> +						       TYPE_UNSIGNED (rt));
> +	  new_integer_type = true;
> +	}
> +      else
> +	new_integer_type = false;
> +
>        if (dump_file && (dump_flags & TDF_DETAILS))
>  	{
>  	  fprintf (dump_file, "Marking ");
>  	  print_generic_expr (dump_file, root->base, 0);
> -	  fprintf (dump_file, " offset: %u, size: %u: ",
> +	  fprintf (dump_file, " offset: %u, size: %u ",
>  		   (unsigned) root->offset, (unsigned) root->size);
> -	  fprintf (dump_file, " to be replaced.\n");
> +	  fprintf (dump_file, " to be replaced%s.\n",
> +		   new_integer_type ? " with an integer": "");
>  	}
>  
>        root->grp_to_be_replaced = 1;
> 
>
diff mbox

Patch

Index: src/gcc/tree-sra.c
===================================================================
--- src.orig/gcc/tree-sra.c
+++ src/gcc/tree-sra.c
@@ -2075,13 +2075,25 @@  analyze_access_subtree (struct access *r
 	  || ((root->grp_scalar_read || root->grp_assignment_read)
 	      && (root->grp_scalar_write || root->grp_assignment_write))))
     {
+      bool new_integer_type;
+      if (TREE_CODE (root->type) == ENUMERAL_TYPE)
+	{
+	  tree rt = root->type;
+	  root->type = build_nonstandard_integer_type (TYPE_PRECISION (rt),
+						       TYPE_UNSIGNED (rt));
+	  new_integer_type = true;
+	}
+      else
+	new_integer_type = false;
+
       if (dump_file && (dump_flags & TDF_DETAILS))
 	{
 	  fprintf (dump_file, "Marking ");
 	  print_generic_expr (dump_file, root->base, 0);
-	  fprintf (dump_file, " offset: %u, size: %u: ",
+	  fprintf (dump_file, " offset: %u, size: %u ",
 		   (unsigned) root->offset, (unsigned) root->size);
-	  fprintf (dump_file, " to be replaced.\n");
+	  fprintf (dump_file, " to be replaced%s.\n",
+		   new_integer_type ? " with an integer": "");
 	}
 
       root->grp_to_be_replaced = 1;