This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Patch to set sizes and smaller types for mode/rtx arrays
- From: "Kaveh R. Ghazi" <ghazi at caip dot rutgers dot edu>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 16 Dec 2001 21:59:04 -0500 (EST)
- Subject: 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