This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Patch to set sizes and smaller types for mode/rtx arrays


I noticed that many of the arrays in rtl.c unnecessarily use int types
where they could use smaller widths and save some space.  I also
figured that they might as well specify the array sizes which I
suppose would help with bounded pointer checks.

While doing that, I happened to notice that rtx_length[] seemed to
unnecessarily use NUM_RTX_CODES+1 instead of NUM_RTX_CODES as its
size.  I saw no reason for that so I took out the +1.

The solaris2.7 bootstrap is broken (again!) so for testing I had to
force a 2.6 configuration (i.e. no 64-bit) and that seemed to bootstrap
cleanly with and without my patch.  Also no testsuite regressions.

This patch seemed to alter the sign-compare warning profile.  It cured
26 but added 36 for a net gain of 10.  Most of the gains came from
what I describe here:
http://gcc.gnu.org/ml/gcc-bugs/2001-12/msg00675.html

I.e. "unsigned int < unsigned int - unsigned int" doesn't warn,
whereas "unsigned int < unsigned char - unsigned char" does.  I don't
know what to make of that.  Perhaps someone who fully understands the
promotion rules can explain that to me.  (Neil tried but I was too
dense.)


Anyway, with the patch the size of the cc1 executable (and all others
linking with libbackend.a) drop by ~2.5K.

clean/build/gcc/cc1: 17(.interp) + 26364(.hash) + 52608(.dynsym) + 56754(.dynstr) + 32(.SUNW_version) + 36(.rela.got) + 36(.rela.bss) + 1176(.rela.plt) + 2573692(.text) + 28(.init) + 20(.fini) + 296536(.rodata) + 176(.rodata1) + 48(.got) + 1228(.plt) + 176(.dynamic) + 9176(.data) + 8(.ctors) + 8(.dtors) + 4(.eh_frame) + 4(.jcr) + 4(.data.rel.local) + 13(.data1) + 326964(.bss) = 3345108

patch/build/gcc/cc1: 17(.interp) + 26364(.hash) + 52608(.dynsym) + 56754(.dynstr) + 32(.SUNW_version) + 36(.rela.got) + 36(.rela.bss) + 1176(.rela.plt) + 2572092(.text) + 28(.init) + 20(.fini) + 295624(.rodata) + 176(.rodata1) + 48(.got) + 1228(.plt) + 176(.dynamic) + 9176(.data) + 8(.ctors) + 8(.dtors) + 4(.eh_frame) + 4(.jcr) + 4(.data.rel.local) + 13(.data1) + 326964(.bss) = 3342596

Okay to install?

		Thanks,
		--Kaveh


2001-12-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* machmode.h (mode_name, mode_class, mode_size, mode_unit_size,
	mode_bitsize, mode_mask_array, mode_wider_mode): Set array size in
	declaration to NUM_MACHINE_MODES.
	(mode_size, mode_unit_size): Set array type to unsigned char.
	(mode_bitsize): Set array type to unsigned short.

	* rtl.c (rtx_length): Set array type to unsigned char.
	(rtx_length, rtx_name, rtx_format, rtx_class): Set array size to
	NUM_RTX_CODE.
	(mode_bitsize): Set array type to unsigned short.
	(mode_size, mode_unit_size): Set array type to unsigned char.
	(mode_name, mode_class, mode_bitsize, mode_size, mode_unit_size,
	mode_wider_mode, mode_mask_array): Set array size to
	NUM_MACHINE_MODES.

	rtl.h (rtx_length, rtx_name, rtx_format, rtx_class): Set array
	size in declaration to NUM_RTX_CODE.
	
diff -rup orig/egcc-CVS20011216/gcc/machmode.h egcc-CVS20011216/gcc/machmode.h
--- orig/egcc-CVS20011216/gcc/machmode.h	Wed Aug 22 16:30:44 2001
+++ egcc-CVS20011216/gcc/machmode.h	Sun Dec 16 12:28:13 2001
@@ -38,7 +38,7 @@ MAX_MACHINE_MODE };
 
 /* Get the name of mode MODE as a string.  */
 
-extern const char * const mode_name[];
+extern const char * const mode_name[NUM_MACHINE_MODES];
 #define GET_MODE_NAME(MODE)		(mode_name[(int) (MODE)])
 
 enum mode_class { MODE_RANDOM, MODE_INT, MODE_FLOAT, MODE_PARTIAL_INT, MODE_CC,
@@ -49,7 +49,7 @@ enum mode_class { MODE_RANDOM, MODE_INT,
 /* Get the general kind of object that mode MODE represents
    (integer, floating, complex, etc.)  */
 
-extern const enum mode_class mode_class[];
+extern const enum mode_class mode_class[NUM_MACHINE_MODES];
 #define GET_MODE_CLASS(MODE)		(mode_class[(int) (MODE)])
 
 /* Nonzero if MODE is an integral mode.  */
@@ -77,12 +77,12 @@ extern const enum mode_class mode_class[
 
 /* Get the size in bytes of an object of mode MODE.  */
 
-extern const unsigned int mode_size[];
+extern const unsigned char mode_size[NUM_MACHINE_MODES];
 #define GET_MODE_SIZE(MODE)		(mode_size[(int) (MODE)])
 
 /* Get the size in bytes of the basic parts of an object of mode MODE.  */
 
-extern const unsigned int mode_unit_size[];
+extern const unsigned char mode_unit_size[NUM_MACHINE_MODES];
 #define GET_MODE_UNIT_SIZE(MODE)	(mode_unit_size[(int) (MODE)])
 
 /* Get the number of units in the object.  */
@@ -93,7 +93,7 @@ extern const unsigned int mode_unit_size
 
 /* Get the size in bits of an object of mode MODE.  */
 
-extern const unsigned int mode_bitsize[];
+extern const unsigned short mode_bitsize[NUM_MACHINE_MODES];
 #define GET_MODE_BITSIZE(MODE)  (mode_bitsize[(int) (MODE)])
 
 #endif /* not HAVE_MACHINE_MODES */
@@ -103,7 +103,7 @@ extern const unsigned int mode_bitsize[]
 /* Get a bitmask containing 1 for all bits in a word
    that fit within mode MODE.  */
 
-extern const unsigned HOST_WIDE_INT mode_mask_array[];
+extern const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES];
 
 #define GET_MODE_MASK(MODE) mode_mask_array[(int) (MODE)]
 
@@ -114,7 +114,7 @@ extern const unsigned HOST_WIDE_INT mode
 
 /* Get the next wider natural mode (eg, QI -> HI -> SI -> DI -> TI).  */
 
-extern const unsigned char mode_wider_mode[];
+extern const unsigned char mode_wider_mode[NUM_MACHINE_MODES];
 #define GET_MODE_WIDER_MODE(MODE)	((enum machine_mode)mode_wider_mode[(int) (MODE)])
 
 /* Return the mode for data of a given size SIZE and mode class CLASS.
diff -rup orig/egcc-CVS20011216/gcc/rtl.c egcc-CVS20011216/gcc/rtl.c
--- orig/egcc-CVS20011216/gcc/rtl.c	Sat Dec  8 06:19:08 2001
+++ egcc-CVS20011216/gcc/rtl.c	Sun Dec 16 13:00:10 2001
@@ -96,7 +96,7 @@ Software Foundation, 59 Temple Place - S
 
 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   sizeof FORMAT - 1 ,
 
-const int rtx_length[NUM_RTX_CODE + 1] = {
+const unsigned char rtx_length[NUM_RTX_CODE] = {
 #include "rtl.def"
 };
 
@@ -106,7 +106,7 @@ const int rtx_length[NUM_RTX_CODE + 1] =
 
 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   NAME ,
 
-const char * const rtx_name[] = {
+const char * const rtx_name[NUM_RTX_CODE] = {
 #include "rtl.def"		/* rtl expressions are documented here */
 };
 
@@ -117,7 +117,7 @@ const char * const rtx_name[] = {
 
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  NAME,
 
-const char * const mode_name[] = {
+const char * const mode_name[NUM_MACHINE_MODES] = {
 #include "machmode.def"
 };
 
@@ -127,7 +127,7 @@ const char * const mode_name[] = {
 
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  CLASS,
 
-const enum mode_class mode_class[] = {
+const enum mode_class mode_class[NUM_MACHINE_MODES] = {
 #include "machmode.def"
 };
 
@@ -138,7 +138,7 @@ const enum mode_class mode_class[] = {
 
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  BITSIZE,
 
-const unsigned int mode_bitsize[] = {
+const unsigned short mode_bitsize[NUM_MACHINE_MODES] = {
 #include "machmode.def"
 };
 
@@ -149,7 +149,7 @@ const unsigned int mode_bitsize[] = {
 
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  SIZE,
 
-const unsigned int mode_size[] = {
+const unsigned char mode_size[NUM_MACHINE_MODES] = {
 #include "machmode.def"
 };
 
@@ -160,7 +160,7 @@ const unsigned int mode_size[] = {
 
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  UNIT,
 
-const unsigned int mode_unit_size[] = {
+const unsigned char mode_unit_size[NUM_MACHINE_MODES] = {
 #include "machmode.def"		/* machine modes are documented here */
 };
 
@@ -173,7 +173,7 @@ const unsigned int mode_unit_size[] = {
 #define DEF_MACHMODE(SYM, NAME, CLASS, BITSIZE, SIZE, UNIT, WIDER)  \
   (unsigned char) WIDER,
 
-const unsigned char mode_wider_mode[] = {
+const unsigned char mode_wider_mode[NUM_MACHINE_MODES] = {
 #include "machmode.def"		/* machine modes are documented here */
 };
 
@@ -184,7 +184,7 @@ const unsigned char mode_wider_mode[] = 
 
 /* Indexed by machine mode, gives mask of significant bits in mode.  */
 
-const unsigned HOST_WIDE_INT mode_mask_array[] = {
+const unsigned HOST_WIDE_INT mode_mask_array[NUM_MACHINE_MODES] = {
 #include "machmode.def"
 };
 
@@ -214,7 +214,7 @@ const enum machine_mode class_narrowest_
    rtx's of that code.  The sequence is a C string in which
    each character describes one operand.  */
 
-const char * const rtx_format[] = {
+const char * const rtx_format[NUM_RTX_CODE] = {
   /* "*" undefined.
          can cause a warning message
      "0" field is unused (or used in a phase-dependent manner)
@@ -249,7 +249,7 @@ const char * const rtx_format[] = {
 /* Indexed by rtx code, gives a character representing the "class" of
    that rtx code.  See rtl.def for documentation on the defined classes.  */
 
-const char rtx_class[] = {
+const char rtx_class[NUM_RTX_CODE] = {
 #define DEF_RTL_EXPR(ENUM, NAME, FORMAT, CLASS)   CLASS,
 #include "rtl.def"		/* rtl expressions are defined here */
 #undef DEF_RTL_EXPR
diff -rup orig/egcc-CVS20011216/gcc/rtl.h egcc-CVS20011216/gcc/rtl.h
--- orig/egcc-CVS20011216/gcc/rtl.h	Thu Dec 13 07:30:18 2001
+++ egcc-CVS20011216/gcc/rtl.h	Sun Dec 16 13:00:01 2001
@@ -51,16 +51,16 @@ enum rtx_code  {
 #define NUM_RTX_CODE ((int)LAST_AND_UNUSED_RTX_CODE)
 				/* The cast here, saves many elsewhere.  */
 
-extern const int rtx_length[];
+extern const unsigned char rtx_length[NUM_RTX_CODE];
 #define GET_RTX_LENGTH(CODE)		(rtx_length[(int) (CODE)])
 
-extern const char * const rtx_name[];
+extern const char * const rtx_name[NUM_RTX_CODE];
 #define GET_RTX_NAME(CODE)		(rtx_name[(int) (CODE)])
 
-extern const char * const rtx_format[];
+extern const char * const rtx_format[NUM_RTX_CODE];
 #define GET_RTX_FORMAT(CODE)		(rtx_format[(int) (CODE)])
 
-extern const char rtx_class[];
+extern const char rtx_class[NUM_RTX_CODE];
 #define GET_RTX_CLASS(CODE)		(rtx_class[(int) (CODE)])
 
 /* The flags and bitfields of an ADDR_DIFF_VEC.  BASE is the base label


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]