Re: [PATCH] Do not use lang_hooks.types.type_for_size in signed_or_unsigned_type_for

2012-03-12 Thread Richard Guenther
On Wed, 7 Mar 2012, Richard Guenther wrote:

 On Wed, 7 Mar 2012, Michael Matz wrote:
 
  Hi,
  
  On Wed, 7 Mar 2012, Richard Guenther wrote:
  
   FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
   \\(char\\)
-\\(unsigned char\\) c  31; 1
   FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
   \\(int\\) 
   \\(12 - \\(unsigned int\\) d\\)  7; 1
   
   because we dump the unsigned type variant differently now.  What do
   people think - adjust the testcase?  Adjust how we pretty-print
   these non-standard integer types?
  
  Adjusting the pretty printer would be nice anyway.  Those unnamed:35 
  thingies hurt my eyes.  Just printing int17 or uint18 would be perfectly 
  fine, with special casing of sizes that match the normal C types for 
  the target in question (so that input 'unsigned char' isn't converted to 
  'uint8' on one and 'uint16' on another target).
 
 Ok, I'll do that (special-casing some precisions via *_TYPE_SIZE).
 I won't touch the unnamed-unsigned-type:35 stuff, for now.

Like so.

Richard.

2012-03-12  Richard Guenther  rguent...@suse.de

* tree.c (signed_or_unsigned_type_for): Use
build_nonstandard_integer_type.
(signed_type_for): Adjust documentation.
(unsigned_type_for): Likewise.
* tree-pretty-print.c (dump_generic_node): Use standard names
for non-standard integer types if available.

Index: gcc/tree.c
===
*** gcc/tree.c.orig 2012-03-12 11:11:36.0 +0100
--- gcc/tree.c  2012-03-12 12:25:37.0 +0100
*** widest_int_cst_value (const_tree x)
*** 10197,10228 
return val;
  }
  
! /* If TYPE is an integral type, return an equivalent type which is
! unsigned iff UNSIGNEDP is true.  If TYPE is not an integral type,
! return TYPE itself.  */
  
  tree
  signed_or_unsigned_type_for (int unsignedp, tree type)
  {
!   tree t = type;
!   if (POINTER_TYPE_P (type))
! {
!   /* If the pointer points to the normal address space, use the
!size_type_node.  Otherwise use an appropriate size for the pointer
!based on the named address space it points to.  */
!   if (!TYPE_ADDR_SPACE (TREE_TYPE (t)))
!   t = size_type_node;
!   else
!   return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
! }
  
!   if (!INTEGRAL_TYPE_P (t) || TYPE_UNSIGNED (t) == unsignedp)
! return t;
  
!   return lang_hooks.types.type_for_size (TYPE_PRECISION (t), unsignedp);
  }
  
! /* Returns unsigned variant of TYPE.  */
  
  tree
  unsigned_type_for (tree type)
--- 10197,10222 
return val;
  }
  
! /* If TYPE is an integral or pointer type, return an integer type with
!the same precision which is unsigned iff UNSIGNEDP is true, or itself
!if TYPE is already an integer type of signedness UNSIGNEDP.  */
  
  tree
  signed_or_unsigned_type_for (int unsignedp, tree type)
  {
!   if (TREE_CODE (type) == INTEGER_TYPE  TYPE_UNSIGNED (type) == unsignedp)
! return type;
  
!   if (!INTEGRAL_TYPE_P (type)
!!POINTER_TYPE_P (type))
! return NULL_TREE;
  
!   return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp);
  }
  
! /* If TYPE is an integral or pointer type, return an integer type with
!the same precision which is unsigned, or itself if TYPE is already an
!unsigned integer type.  */
  
  tree
  unsigned_type_for (tree type)
*** unsigned_type_for (tree type)
*** 10230,10236 
return signed_or_unsigned_type_for (1, type);
  }
  
! /* Returns signed variant of TYPE.  */
  
  tree
  signed_type_for (tree type)
--- 10224,10232 
return signed_or_unsigned_type_for (1, type);
  }
  
! /* If TYPE is an integral or pointer type, return an integer type with
!the same precision which is signed, or itself if TYPE is already a
!signed integer type.  */
  
  tree
  signed_type_for (tree type)
Index: gcc/tree-pretty-print.c
===
*** gcc/tree-pretty-print.c.orig2012-01-30 14:44:40.0 +0100
--- gcc/tree-pretty-print.c 2012-03-12 12:34:01.0 +0100
*** dump_generic_node (pretty_printer *buffe
*** 723,733 
  }
else if (TREE_CODE (node) == INTEGER_TYPE)
  {
!   pp_string (buffer, (TYPE_UNSIGNED (node)
!   ? unnamed-unsigned:
!   : unnamed-signed:));
!   pp_decimal_int (buffer, TYPE_PRECISION (node));
!   pp_string (buffer, );
  }
else if (TREE_CODE (node) == COMPLEX_TYPE)
  {
--- 723,763 
  }
else if (TREE_CODE (node) == INTEGER_TYPE)
  {
!   if (TYPE_PRECISION (node) == CHAR_TYPE_SIZE)
! pp_string (buffer, (TYPE_UNSIGNED (node)
! 

Re: [PATCH] Do not use lang_hooks.types.type_for_size in signed_or_unsigned_type_for

2012-03-07 Thread Michael Matz
Hi,

On Wed, 7 Mar 2012, Richard Guenther wrote:

 FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
 \\(char\\)
  -\\(unsigned char\\) c  31; 1
 FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
 \\(int\\) 
 \\(12 - \\(unsigned int\\) d\\)  7; 1
 
 because we dump the unsigned type variant differently now.  What do
 people think - adjust the testcase?  Adjust how we pretty-print
 these non-standard integer types?

Adjusting the pretty printer would be nice anyway.  Those unnamed:35 
thingies hurt my eyes.  Just printing int17 or uint18 would be perfectly 
fine, with special casing of sizes that match the normal C types for 
the target in question (so that input 'unsigned char' isn't converted to 
'uint8' on one and 'uint16' on another target).


Ciao,
Michael.


Re: [PATCH] Do not use lang_hooks.types.type_for_size in signed_or_unsigned_type_for

2012-03-07 Thread Richard Guenther
On Wed, 7 Mar 2012, Michael Matz wrote:

 Hi,
 
 On Wed, 7 Mar 2012, Richard Guenther wrote:
 
  FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
  \\(char\\)
   -\\(unsigned char\\) c  31; 1
  FAIL: gcc.dg/tree-ssa/pr31261.c scan-tree-dump-times original return 
  \\(int\\) 
  \\(12 - \\(unsigned int\\) d\\)  7; 1
  
  because we dump the unsigned type variant differently now.  What do
  people think - adjust the testcase?  Adjust how we pretty-print
  these non-standard integer types?
 
 Adjusting the pretty printer would be nice anyway.  Those unnamed:35 
 thingies hurt my eyes.  Just printing int17 or uint18 would be perfectly 
 fine, with special casing of sizes that match the normal C types for 
 the target in question (so that input 'unsigned char' isn't converted to 
 'uint8' on one and 'uint16' on another target).

Ok, I'll do that (special-casing some precisions via *_TYPE_SIZE).
I won't touch the unnamed-unsigned-type:35 stuff, for now.

Richard.