diff mbox

dump_case_nodes: Treat unsigned as unsigned, don't ICE

Message ID dee35fc1b743c339e0562b674324d7d4d9c7a33a.1400608417.git.segher@kernel.crashing.org
State New
Headers show

Commit Message

Segher Boessenkool May 20, 2014, 5:58 p.m. UTC
The current code converts every tree to signed hwi; this ICEs with
values not representable as shwi, like 9999999999999999999ULL in
pr34154.c (and if it didn't ICE, it would print the wrong value).

This fixes it.  Bootstrapped and tested on powerpc64-linux.  Okay
to apply?


Segher


2014-05-20  Segher Boessenkool  <segher@kernel.crashing.org>

gcc/
	* stmt.c (dump_case_nodes): Don't convert values to HOST_WIDE_INT
	before printing.

---
 gcc/stmt.c | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

Comments

Mike Stump May 20, 2014, 8:40 p.m. UTC | #1
On May 20, 2014, at 10:58 AM, Segher Boessenkool <segher@kernel.crashing.org> wrote:
> The current code converts every tree to signed hwi; this ICEs with
> values not representable as shwi, like 9999999999999999999ULL

Looks nice to me…  Looks like the type of change I would have done for wide-int, if I had tripped on this.
Segher Boessenkool May 24, 2014, 2:25 p.m. UTC | #2
Ping?

On Tue, May 20, 2014 at 10:58:27AM -0700, Segher Boessenkool wrote:
> The current code converts every tree to signed hwi; this ICEs with
> values not representable as shwi, like 9999999999999999999ULL in
> pr34154.c (and if it didn't ICE, it would print the wrong value).
> 
> This fixes it.  Bootstrapped and tested on powerpc64-linux.  Okay
> to apply?
> 
> 
> Segher
> 
> 
> 2014-05-20  Segher Boessenkool  <segher@kernel.crashing.org>
> 
> gcc/
> 	* stmt.c (dump_case_nodes): Don't convert values to HOST_WIDE_INT
> 	before printing.
> 
> ---
>  gcc/stmt.c | 18 +++++++-----------
>  1 file changed, 7 insertions(+), 11 deletions(-)
> 
> diff --git a/gcc/stmt.c b/gcc/stmt.c
> index 163d495..722d34f 100644
> --- a/gcc/stmt.c
> +++ b/gcc/stmt.c
> @@ -774,24 +774,20 @@ static void
>  dump_case_nodes (FILE *f, struct case_node *root,
>  		 int indent_step, int indent_level)
>  {
> -  HOST_WIDE_INT low, high;
> -
>    if (root == 0)
>      return;
>    indent_level++;
>  
>    dump_case_nodes (f, root->left, indent_step, indent_level);
>  
> -  low = tree_to_shwi (root->low);
> -  high = tree_to_shwi (root->high);
> -
>    fputs (";; ", f);
> -  if (high == low)
> -    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC,
> -	     indent_step * indent_level, "", low);
> -  else
> -    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC " ... " HOST_WIDE_INT_PRINT_DEC,
> -	     indent_step * indent_level, "", low, high);
> +  fprintf (f, "%*s", indent_step * indent_level, "");
> +  print_dec (root->low, f, TYPE_SIGN (TREE_TYPE (root->low)));
> +  if (!tree_int_cst_equal (root->low, root->high))
> +    {
> +      fprintf (f, " ... ");
> +      print_dec (root->high, f, TYPE_SIGN (TREE_TYPE (root->high)));
> +    }
>    fputs ("\n", f);
>  
>    dump_case_nodes (f, root->right, indent_step, indent_level);
> -- 
> 1.8.1.4
Steven Bosscher May 24, 2014, 4:49 p.m. UTC | #3
On Sat, May 24, 2014 at 4:25 PM, Segher Boessenkool wrote:
> Ping?

OK.

Ciao!
Steven





> On Tue, May 20, 2014 at 10:58:27AM -0700, Segher Boessenkool wrote:
>> The current code converts every tree to signed hwi; this ICEs with
>> values not representable as shwi, like 9999999999999999999ULL in
>> pr34154.c (and if it didn't ICE, it would print the wrong value).
>>
>> This fixes it.  Bootstrapped and tested on powerpc64-linux.  Okay
>> to apply?
>>
>>
>> Segher
>>
>>
>> 2014-05-20  Segher Boessenkool  <segher@kernel.crashing.org>
>>
>> gcc/
>>       * stmt.c (dump_case_nodes): Don't convert values to HOST_WIDE_INT
>>       before printing.
>>
>> ---
>>  gcc/stmt.c | 18 +++++++-----------
>>  1 file changed, 7 insertions(+), 11 deletions(-)
>>
>> diff --git a/gcc/stmt.c b/gcc/stmt.c
>> index 163d495..722d34f 100644
>> --- a/gcc/stmt.c
>> +++ b/gcc/stmt.c
>> @@ -774,24 +774,20 @@ static void
>>  dump_case_nodes (FILE *f, struct case_node *root,
>>                int indent_step, int indent_level)
>>  {
>> -  HOST_WIDE_INT low, high;
>> -
>>    if (root == 0)
>>      return;
>>    indent_level++;
>>
>>    dump_case_nodes (f, root->left, indent_step, indent_level);
>>
>> -  low = tree_to_shwi (root->low);
>> -  high = tree_to_shwi (root->high);
>> -
>>    fputs (";; ", f);
>> -  if (high == low)
>> -    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC,
>> -          indent_step * indent_level, "", low);
>> -  else
>> -    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC " ... " HOST_WIDE_INT_PRINT_DEC,
>> -          indent_step * indent_level, "", low, high);
>> +  fprintf (f, "%*s", indent_step * indent_level, "");
>> +  print_dec (root->low, f, TYPE_SIGN (TREE_TYPE (root->low)));
>> +  if (!tree_int_cst_equal (root->low, root->high))
>> +    {
>> +      fprintf (f, " ... ");
>> +      print_dec (root->high, f, TYPE_SIGN (TREE_TYPE (root->high)));
>> +    }
>>    fputs ("\n", f);
>>
>>    dump_case_nodes (f, root->right, indent_step, indent_level);
>> --
>> 1.8.1.4
diff mbox

Patch

diff --git a/gcc/stmt.c b/gcc/stmt.c
index 163d495..722d34f 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -774,24 +774,20 @@  static void
 dump_case_nodes (FILE *f, struct case_node *root,
 		 int indent_step, int indent_level)
 {
-  HOST_WIDE_INT low, high;
-
   if (root == 0)
     return;
   indent_level++;
 
   dump_case_nodes (f, root->left, indent_step, indent_level);
 
-  low = tree_to_shwi (root->low);
-  high = tree_to_shwi (root->high);
-
   fputs (";; ", f);
-  if (high == low)
-    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC,
-	     indent_step * indent_level, "", low);
-  else
-    fprintf (f, "%*s" HOST_WIDE_INT_PRINT_DEC " ... " HOST_WIDE_INT_PRINT_DEC,
-	     indent_step * indent_level, "", low, high);
+  fprintf (f, "%*s", indent_step * indent_level, "");
+  print_dec (root->low, f, TYPE_SIGN (TREE_TYPE (root->low)));
+  if (!tree_int_cst_equal (root->low, root->high))
+    {
+      fprintf (f, " ... ");
+      print_dec (root->high, f, TYPE_SIGN (TREE_TYPE (root->high)));
+    }
   fputs ("\n", f);
 
   dump_case_nodes (f, root->right, indent_step, indent_level);