Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-04-18 Thread H.J. Lu
On Mon, Jan 6, 2014 at 7:20 AM, Jakub Jelinek ja...@redhat.com wrote:
 On Sat, Jan 04, 2014 at 12:37:57AM +0100, Jakub Jelinek wrote:
 That is certainly doable (as attached), but strangely if the patch (that I've
 already committed) is reverted and this one applied, the .text savings are
 much smaller.

 Here are .text and .rodata readelf -WS lines from x86_64 (first 4 pairs) and
 i686 (last 4 pairs) builds, always vanilla trunk before r206312, that plus
 r206312 patch, without r206312 but with attached patch, with both r206312
 and attached patch.  So, for .text size the best is both patches, but
 for .rodata patches just r206312.  I'll try to look at details why this is so
 next week.

 The difference is I think caused by the way gencondition.c works.
 As the array with the conditions is a toplevel array, __builtin_constant_p
 is folded there already during the parsing, after folding the conditions.


For some reason, it triggered:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60887

-- 
H.J.


Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-06 Thread Jakub Jelinek
On Sat, Jan 04, 2014 at 12:37:57AM +0100, Jakub Jelinek wrote:
 That is certainly doable (as attached), but strangely if the patch (that I've
 already committed) is reverted and this one applied, the .text savings are
 much smaller.
 
 Here are .text and .rodata readelf -WS lines from x86_64 (first 4 pairs) and
 i686 (last 4 pairs) builds, always vanilla trunk before r206312, that plus
 r206312 patch, without r206312 but with attached patch, with both r206312
 and attached patch.  So, for .text size the best is both patches, but
 for .rodata patches just r206312.  I'll try to look at details why this is so
 next week.

The difference is I think caused by the way gencondition.c works.
As the array with the conditions is a toplevel array, __builtin_constant_p
is folded there already during the parsing, after folding the conditions.

If I (manually for now) move the build/gencondmd.c insn_conditions array
instead of main and remove static const keywords, I get undefined references
when linking build/gencondmd, on x86_64 about the:
`default_target_flag_state'
`flag_unsafe_math_optimizations'
`insn'
`ix86_arch_features'
`ix86_fpmath'
`ix86_isa_flags'
`ix86_stack_protector_guard'
`operands'
`reload_completed'
`reload_in_progress'
`target_flags'
symbols.

Jakub


[PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Jakub Jelinek
Hi!

I've noticed that especially with the AVX512F introduction we use
GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
the problem with that is GET_MODE_SIZE isn't a compile time constant,
needs to read mode_size array (non-const) at runtime.

This patch attempts to decrease the enormous .text/.rodata growth from AVX512F
introduction a little bit and improve generated code, by making
GET_MODE_SIZE (MODEmode) compile time constants, thus all the
GET_MODE_SIZE (MODEmode) == 64 and similar tests can fold into
false/true.  The patch saves ~ 110KB of .text (both x86_64 and i686)
and ~ 50KB of .rodata (x86_64) or ~ 27KB of .rodata (i686).

The disadvantage is that the mode attribute duplicates insn-modes.c,
but I guess the listed modes aren't going to change their sizes ever
on this target, and if some mode isn't listed and used in some mode
iterator, one would get syntax errors from insn-*.[ch] and so it wouldn't be
hard to add it.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2014-01-03  Jakub Jelinek  ja...@redhat.com

* config/i386/i386.md (MODE_SIZE): New mode attribute.
(push splitter): Use P:MODE_SIZE instead of
GET_MODE_SIZE (P:MODEmode).
(lea splitter): Use MODE_SIZE instead of GET_MODE_SIZE (MODEmode).
(mov -1, reg peephole2): Likewise.
* config/i386/sse.md (*movmode_internal,
sse_storeussemodesuffixavxsizesuffix,
sse2_avx_avx512f_storedqumode, sse_andnotmode3,
*codemode3, *andnotmode3mask_name,
mask_codeforcodemode3mask_name): Likewise.
* config/i386/subst.md (mask_mode512bit_condition,
sd_mask_mode512bit_condition): Likewise.

--- gcc/config/i386/i386.md.jj  2013-12-27 19:24:33.0 +0100
+++ gcc/config/i386/i386.md 2014-01-02 20:08:16.911851795 +0100
@@ -914,6 +914,20 @@ (define_mode_iterator SWIM248 [(HI TARG
 (define_mode_iterator DWI [(DI !TARGET_64BIT)
   (TI TARGET_64BIT)])
 
+;; GET_MODE_SIZE for selected modes.  As GET_MODE_SIZE is not
+;; compile time constant, it is faster to use MODE_SIZE than
+;; GET_MODE_SIZE (MODEmode).  For XFmode which depends on
+;; command line options just use GET_MODE_SIZE macro.
+(define_mode_attr MODE_SIZE [(QI 1) (HI 2) (SI 4) (DI 8) (TI 16)
+(SF 4) (DF 8) (XF GET_MODE_SIZE (XFmode))
+(V16QI 16) (V32QI 32) (V64QI 64)
+(V8HI 16) (V16HI 32) (V32HI 64)
+(V4SI 16) (V8SI 32) (V16SI 64)
+(V2DI 16) (V4DI 32) (V8DI 64)
+(V1TI 16) (V2TI 32) (V4TI 64)
+(V2DF 16) (V4DF 32) (V8DF 64)
+(V4SF 16) (V8SF 32) (V16SF 64)])
+
 ;; Double word integer modes as mode attribute.
 (define_mode_attr DWI [(QI HI) (HI SI) (SI DI) (DI TI)])
 (define_mode_attr dwi [(QI hi) (HI si) (SI di) (DI ti)])
@@ -2734,7 +2748,7 @@ (define_split
   reload_completed
   [(set (reg:P SP_REG) (plus:P (reg:P SP_REG) (match_dup 2)))
(set (mem:SF (reg:P SP_REG)) (match_dup 1))]
-  operands[2] = GEN_INT (-GET_MODE_SIZE (P:MODEmode));)
+  operands[2] = GEN_INT (-P:MODE_SIZE);)
 
 (define_split
   [(set (match_operand:SF 0 push_operand)
@@ -5770,7 +5784,7 @@ (define_split
   enum machine_mode mode = MODEmode;
   rtx pat;
 
-  if (GET_MODE_SIZE (mode)  GET_MODE_SIZE (SImode))
+  if (MODE_SIZE  GET_MODE_SIZE (SImode))
 { 
   mode = SImode; 
   operands[0] = gen_lowpart (mode, operands[0]);
@@ -17403,7 +17417,7 @@ (define_peephole2
   [(parallel [(set (match_dup 0) (const_int -1))
  (clobber (reg:CC FLAGS_REG))])]
 {
-  if (GET_MODE_SIZE (MODEmode)  GET_MODE_SIZE (SImode))
+  if (MODE_SIZE  GET_MODE_SIZE (SImode))
 operands[0] = gen_lowpart (SImode, operands[0]);
 })
 
--- gcc/config/i386/sse.md.jj   2014-01-01 00:52:56.0 +0100
+++ gcc/config/i386/sse.md  2014-01-02 20:11:49.723916127 +0100
@@ -669,7 +669,7 @@ (define_insn *movmode_internal
   /* There is no evex-encoded vmov* for sizes smaller than 64-bytes
 in avx512f, so we need to use workarounds, to access sse registers
 16-31, which are evex-only.  */
-  if (TARGET_AVX512F  GET_MODE_SIZE (MODEmode)  64
+  if (TARGET_AVX512F  MODE_SIZE  64
   ((REG_P (operands[0])
EXT_REX_SSE_REGNO_P (REGNO (operands[0])))
  || (REG_P (operands[1])
@@ -677,18 +677,18 @@ (define_insn *movmode_internal
{
  if (memory_operand (operands[0], MODEmode))
{
- if (GET_MODE_SIZE (MODEmode) == 32)
+ if (MODE_SIZE == 32)
return vextractshuffletype64x4\t{$0x0, %g1, %0|%0, %g1, 
0x0};
- else if (GET_MODE_SIZE (MODEmode) == 16)
+ else if (MODE_SIZE == 16)
return vextractshuffletype32x4\t{$0x0, %g1, %0|%0, %g1, 
0x0};
  else
gcc_unreachable ();
}
 

Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Uros Bizjak
On Fri, Jan 3, 2014 at 9:48 AM, Jakub Jelinek ja...@redhat.com wrote:

 I've noticed that especially with the AVX512F introduction we use
 GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
 the problem with that is GET_MODE_SIZE isn't a compile time constant,
 needs to read mode_size array (non-const) at runtime.

 This patch attempts to decrease the enormous .text/.rodata growth from AVX512F
 introduction a little bit and improve generated code, by making
 GET_MODE_SIZE (MODEmode) compile time constants, thus all the
 GET_MODE_SIZE (MODEmode) == 64 and similar tests can fold into
 false/true.  The patch saves ~ 110KB of .text (both x86_64 and i686)
 and ~ 50KB of .rodata (x86_64) or ~ 27KB of .rodata (i686).

 The disadvantage is that the mode attribute duplicates insn-modes.c,
 but I guess the listed modes aren't going to change their sizes ever
 on this target, and if some mode isn't listed and used in some mode
 iterator, one would get syntax errors from insn-*.[ch] and so it wouldn't be
 hard to add it.

This should be tolerable, at least for gains, shown above. OTOH, we
already have some attributes (e.g. ssescalarnum, ssescalarsize) that
use the same approach and the sky didn't fall down.

 Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

 2014-01-03  Jakub Jelinek  ja...@redhat.com

 * config/i386/i386.md (MODE_SIZE): New mode attribute.
 (push splitter): Use P:MODE_SIZE instead of
 GET_MODE_SIZE (P:MODEmode).
 (lea splitter): Use MODE_SIZE instead of GET_MODE_SIZE (MODEmode).
 (mov -1, reg peephole2): Likewise.
 * config/i386/sse.md (*movmode_internal,
 sse_storeussemodesuffixavxsizesuffix,
 sse2_avx_avx512f_storedqumode, sse_andnotmode3,
 *codemode3, *andnotmode3mask_name,
 mask_codeforcodemode3mask_name): Likewise.
 * config/i386/subst.md (mask_mode512bit_condition,
 sd_mask_mode512bit_condition): Likewise.

OK for mainline.

Thanks,
Uros.


Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Joseph S. Myers
On Fri, 3 Jan 2014, Jakub Jelinek wrote:

 I've noticed that especially with the AVX512F introduction we use
 GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
 the problem with that is GET_MODE_SIZE isn't a compile time constant,
 needs to read mode_size array (non-const) at runtime.

It would seem better to me for genmodes to generate appropriate macro / 
inline function definitions that can be used by GET_MODE_SIZE (along the 
lines of (__builtin_constant_p (MODE)  !mode_size_variable (MODE) ? 
get_mode_size_constant (MODE) : (unsigned short) mode_size[MODE]), where 
mode_size_variable and get_mode_size_constant are always_inline functions 
generated by genmodes) - that way all targets are covered automatically, 
without needing such duplication of mode sizes.  (Of course such 
optimizations wouldn't apply for a first-stage compiler bootstrapped by a 
compiler not supporting __builtin_constant_p, but lack of optimization in 
the first stage of a bootstrap is not a particular concern.)

-- 
Joseph S. Myers
jos...@codesourcery.com


Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Jakub Jelinek
On Fri, Jan 03, 2014 at 03:39:11PM +, Joseph S. Myers wrote:
 On Fri, 3 Jan 2014, Jakub Jelinek wrote:
 
  I've noticed that especially with the AVX512F introduction we use
  GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
  the problem with that is GET_MODE_SIZE isn't a compile time constant,
  needs to read mode_size array (non-const) at runtime.
 
 It would seem better to me for genmodes to generate appropriate macro / 
 inline function definitions that can be used by GET_MODE_SIZE (along the 
 lines of (__builtin_constant_p (MODE)  !mode_size_variable (MODE) ? 
 get_mode_size_constant (MODE) : (unsigned short) mode_size[MODE]), where 
 mode_size_variable and get_mode_size_constant are always_inline functions 
 generated by genmodes) - that way all targets are covered automatically, 
 without needing such duplication of mode sizes.  (Of course such 
 optimizations wouldn't apply for a first-stage compiler bootstrapped by a 
 compiler not supporting __builtin_constant_p, but lack of optimization in 
 the first stage of a bootstrap is not a particular concern.)

That is certainly doable (as attached), but strangely if the patch (that I've
already committed) is reverted and this one applied, the .text savings are
much smaller.

Here are .text and .rodata readelf -WS lines from x86_64 (first 4 pairs) and
i686 (last 4 pairs) builds, always vanilla trunk before r206312, that plus
r206312 patch, without r206312 but with attached patch, with both r206312
and attached patch.  So, for .text size the best is both patches, but
for .rodata patches just r206312.  I'll try to look at details why this is so
next week.

  [12] .text PROGBITS004f4b00 0f4b00 1131704 00  AX 
 0   0 16
  [14] .rodata   PROGBITS01626240 1226240 4093b4 00   A 
 0   0 64
  [12] .text PROGBITS004f20a0 0f20a0 11156e4 00  AX 
 0   0 16
  [14] .rodata   PROGBITS016077c0 12077c0 3fcbb4 00   A 
 0   0 64
  [12] .text PROGBITS004f4c60 0f4c60 112b8b4 00  AX 
 0   0 16
  [14] .rodata   PROGBITS01620540 1220540 40b134 00   A 
 0   0 64
  [12] .text PROGBITS004f2200 0f2200 1113eb4 00  AX 
 0   0 16
  [14] .rodata   PROGBITS016060c0 12060c0 3fea74 00   A 
 0   0 64
  [12] .text PROGBITS0811d750 0d5750 12b4464 00  AX  0   0 
16
  [14] .rodata   PROGBITS093d1c00 1389c00 2d8094 00   A  0   0 
64
  [12] .text PROGBITS0811b150 0d3150 12996a4 00  AX  0   0 
16
  [14] .rodata   PROGBITS093b4840 136c840 2d1354 00   A  0   0 
64
  [12] .text PROGBITS0811d840 0d5840 12aa1e4 00  AX  0   0 
16
  [14] .rodata   PROGBITS093c7a40 137fa40 2d8b94 00   A  0   0 
64
  [12] .text PROGBITS0811b240 0d3240 1292914 00  AX  0   0 
16
  [14] .rodata   PROGBITS093adb80 1365b80 2d1f94 00   A  0   0 
64

2014-01-04  Jakub Jelinek  ja...@redhat.com

* genmodes.c (struct mode_data): Add need_bytesize_adj field.
(blank_mdoe): Initialize it.
(emit_mode_size_inline, emit_mode_nunits_inline,
emit_mode_inner_inline): New functions.
(emit_insn_modes_h): Call them and surround their output with
#if GCC_VERSION = 4001 ... #endif.
* machmode.h (GET_MODE_SIZE, GET_MODE_NUNITS, GET_MODE_INNER):
For GCC_VERSION = 4001 use mode_*_inline routines instead of
mode_* arrays if the argument is __builtin_constant_p.
* lower-subreg.c (dump_choices): Make sure GET_MODE_SIZE argument
is enum machine_mode.
fortran/
* trans-types.c (gfc_init_kinds): Make sure GET_MODE_BITSIZE
argument is enum machine_mode.

--- gcc/lower-subreg.c.jj   2013-12-10 18:18:39.077943292 +0100
+++ gcc/lower-subreg.c  2014-01-03 18:35:00.510418999 +0100
@@ -1371,7 +1371,7 @@ dump_choices (bool speed_p, const char *
   fprintf (dump_file, Choices when optimizing for %s:\n, description);
 
   for (i = 0; i  MAX_MACHINE_MODE; i++)
-if (GET_MODE_SIZE (i)  UNITS_PER_WORD)
+if (GET_MODE_SIZE ((enum machine_mode) i)  UNITS_PER_WORD)
   fprintf (dump_file,   %s mode %s for copy lowering.\n,
   choices[speed_p].move_modes_to_split[i]
   ? Splitting
--- gcc/fortran/trans-types.c.jj2013-11-21 22:24:18.790939654 +0100
+++ gcc/fortran/trans-types.c   2014-01-03 18:35:00.534418997 +0100
@@ -373,7 +373,7 @@ gfc_init_kinds (void)
   /* The middle end doesn't support constants larger than 2*HWI.
 Perhaps the target hook shouldn't have accepted these either,
 but just to be safe...  */
-  bitsize = GET_MODE_BITSIZE (mode);
+  bitsize = GET_MODE_BITSIZE ((enum machine_mode) mode);
   if (bitsize  2*HOST_BITS_PER_WIDE_INT)
continue;
 
--- gcc/machmode.h.jj   2013-11-29 18:22:15.671594951 +0100

Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Andrew Pinski
On Fri, Jan 3, 2014 at 3:37 PM, Jakub Jelinek ja...@redhat.com wrote:
 On Fri, Jan 03, 2014 at 03:39:11PM +, Joseph S. Myers wrote:
 On Fri, 3 Jan 2014, Jakub Jelinek wrote:

  I've noticed that especially with the AVX512F introduction we use
  GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
  the problem with that is GET_MODE_SIZE isn't a compile time constant,
  needs to read mode_size array (non-const) at runtime.

 It would seem better to me for genmodes to generate appropriate macro /
 inline function definitions that can be used by GET_MODE_SIZE (along the
 lines of (__builtin_constant_p (MODE)  !mode_size_variable (MODE) ?
 get_mode_size_constant (MODE) : (unsigned short) mode_size[MODE]), where
 mode_size_variable and get_mode_size_constant are always_inline functions
 generated by genmodes) - that way all targets are covered automatically,
 without needing such duplication of mode sizes.  (Of course such
 optimizations wouldn't apply for a first-stage compiler bootstrapped by a
 compiler not supporting __builtin_constant_p, but lack of optimization in
 the first stage of a bootstrap is not a particular concern.)

 That is certainly doable (as attached), but strangely if the patch (that I've
 already committed) is reverted and this one applied, the .text savings are
 much smaller.

 Here are .text and .rodata readelf -WS lines from x86_64 (first 4 pairs) and
 i686 (last 4 pairs) builds, always vanilla trunk before r206312, that plus
 r206312 patch, without r206312 but with attached patch, with both r206312
 and attached patch.  So, for .text size the best is both patches, but
 for .rodata patches just r206312.  I'll try to look at details why this is so
 next week.

   [12] .text PROGBITS004f4b00 0f4b00 1131704 00  
 AX  0   0 16
   [14] .rodata   PROGBITS01626240 1226240 4093b4 00   
 A  0   0 64
   [12] .text PROGBITS004f20a0 0f20a0 11156e4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS016077c0 12077c0 3fcbb4 00   
 A  0   0 64
   [12] .text PROGBITS004f4c60 0f4c60 112b8b4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS01620540 1220540 40b134 00   
 A  0   0 64
   [12] .text PROGBITS004f2200 0f2200 1113eb4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS016060c0 12060c0 3fea74 00   
 A  0   0 64
   [12] .text PROGBITS0811d750 0d5750 12b4464 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093d1c00 1389c00 2d8094 00   A  0   
 0 64
   [12] .text PROGBITS0811b150 0d3150 12996a4 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093b4840 136c840 2d1354 00   A  0   
 0 64
   [12] .text PROGBITS0811d840 0d5840 12aa1e4 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093c7a40 137fa40 2d8b94 00   A  0   
 0 64
   [12] .text PROGBITS0811b240 0d3240 1292914 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093adb80 1365b80 2d1f94 00   A  0   
 0 64

 2014-01-04  Jakub Jelinek  ja...@redhat.com

 * genmodes.c (struct mode_data): Add need_bytesize_adj field.
 (blank_mdoe): Initialize it.
 (emit_mode_size_inline, emit_mode_nunits_inline,
 emit_mode_inner_inline): New functions.
 (emit_insn_modes_h): Call them and surround their output with
 #if GCC_VERSION = 4001 ... #endif.
 * machmode.h (GET_MODE_SIZE, GET_MODE_NUNITS, GET_MODE_INNER):
 For GCC_VERSION = 4001 use mode_*_inline routines instead of
 mode_* arrays if the argument is __builtin_constant_p.
 * lower-subreg.c (dump_choices): Make sure GET_MODE_SIZE argument
 is enum machine_mode.
 fortran/
 * trans-types.c (gfc_init_kinds): Make sure GET_MODE_BITSIZE
 argument is enum machine_mode.

It turns out Jorn filed a bug about this exact issue (back in 2008).
See bug 36109.


Thanks,
Andrew Pinski



 --- gcc/lower-subreg.c.jj   2013-12-10 18:18:39.077943292 +0100
 +++ gcc/lower-subreg.c  2014-01-03 18:35:00.510418999 +0100
 @@ -1371,7 +1371,7 @@ dump_choices (bool speed_p, const char *
fprintf (dump_file, Choices when optimizing for %s:\n, description);

for (i = 0; i  MAX_MACHINE_MODE; i++)
 -if (GET_MODE_SIZE (i)  UNITS_PER_WORD)
 +if (GET_MODE_SIZE ((enum machine_mode) i)  UNITS_PER_WORD)
fprintf (dump_file,   %s mode %s for copy lowering.\n,
choices[speed_p].move_modes_to_split[i]
? Splitting
 --- gcc/fortran/trans-types.c.jj2013-11-21 22:24:18.790939654 +0100
 +++ gcc/fortran/trans-types.c   2014-01-03 18:35:00.534418997 +0100
 @@ -373,7 +373,7 @@ gfc_init_kinds (void)
/* The middle end doesn't support constants larger than 2*HWI.
  Perhaps the target hook shouldn't have accepted these either,
  but just to be 

Re: [PATCH] Introduce MODE_SIZE mode attribute

2014-01-03 Thread Andrew Pinski
On Fri, Jan 3, 2014 at 6:27 PM, Andrew Pinski pins...@gmail.com wrote:
 On Fri, Jan 3, 2014 at 3:37 PM, Jakub Jelinek ja...@redhat.com wrote:
 On Fri, Jan 03, 2014 at 03:39:11PM +, Joseph S. Myers wrote:
 On Fri, 3 Jan 2014, Jakub Jelinek wrote:

  I've noticed that especially with the AVX512F introduction we use
  GET_MODE_SIZE (MODEmode) quite heavily in the i386 *.md files, and
  the problem with that is GET_MODE_SIZE isn't a compile time constant,
  needs to read mode_size array (non-const) at runtime.

 It would seem better to me for genmodes to generate appropriate macro /
 inline function definitions that can be used by GET_MODE_SIZE (along the
 lines of (__builtin_constant_p (MODE)  !mode_size_variable (MODE) ?
 get_mode_size_constant (MODE) : (unsigned short) mode_size[MODE]), where
 mode_size_variable and get_mode_size_constant are always_inline functions
 generated by genmodes) - that way all targets are covered automatically,
 without needing such duplication of mode sizes.  (Of course such
 optimizations wouldn't apply for a first-stage compiler bootstrapped by a
 compiler not supporting __builtin_constant_p, but lack of optimization in
 the first stage of a bootstrap is not a particular concern.)

 That is certainly doable (as attached), but strangely if the patch (that I've
 already committed) is reverted and this one applied, the .text savings are
 much smaller.

 Here are .text and .rodata readelf -WS lines from x86_64 (first 4 pairs) and
 i686 (last 4 pairs) builds, always vanilla trunk before r206312, that plus
 r206312 patch, without r206312 but with attached patch, with both r206312
 and attached patch.  So, for .text size the best is both patches, but
 for .rodata patches just r206312.  I'll try to look at details why this is so
 next week.

   [12] .text PROGBITS004f4b00 0f4b00 1131704 00  
 AX  0   0 16
   [14] .rodata   PROGBITS01626240 1226240 4093b4 00  
  A  0   0 64
   [12] .text PROGBITS004f20a0 0f20a0 11156e4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS016077c0 12077c0 3fcbb4 00  
  A  0   0 64
   [12] .text PROGBITS004f4c60 0f4c60 112b8b4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS01620540 1220540 40b134 00  
  A  0   0 64
   [12] .text PROGBITS004f2200 0f2200 1113eb4 00  
 AX  0   0 16
   [14] .rodata   PROGBITS016060c0 12060c0 3fea74 00  
  A  0   0 64
   [12] .text PROGBITS0811d750 0d5750 12b4464 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093d1c00 1389c00 2d8094 00   A  0   
 0 64
   [12] .text PROGBITS0811b150 0d3150 12996a4 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093b4840 136c840 2d1354 00   A  0   
 0 64
   [12] .text PROGBITS0811d840 0d5840 12aa1e4 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093c7a40 137fa40 2d8b94 00   A  0   
 0 64
   [12] .text PROGBITS0811b240 0d3240 1292914 00  AX  0   
 0 16
   [14] .rodata   PROGBITS093adb80 1365b80 2d1f94 00   A  0   
 0 64

 2014-01-04  Jakub Jelinek  ja...@redhat.com

 * genmodes.c (struct mode_data): Add need_bytesize_adj field.
 (blank_mdoe): Initialize it.
 (emit_mode_size_inline, emit_mode_nunits_inline,
 emit_mode_inner_inline): New functions.
 (emit_insn_modes_h): Call them and surround their output with
 #if GCC_VERSION = 4001 ... #endif.
 * machmode.h (GET_MODE_SIZE, GET_MODE_NUNITS, GET_MODE_INNER):
 For GCC_VERSION = 4001 use mode_*_inline routines instead of
 mode_* arrays if the argument is __builtin_constant_p.
 * lower-subreg.c (dump_choices): Make sure GET_MODE_SIZE argument
 is enum machine_mode.
 fortran/
 * trans-types.c (gfc_init_kinds): Make sure GET_MODE_BITSIZE
 argument is enum machine_mode.

 It turns out Jorn filed a bug about this exact issue (back in 2008).
 See bug 36109.

Also Kazu filed a similar thing about TREE_CODE_LENGTH and
TREE_CODE_CLASS, see bug 14840; I attached a patch but I never got
around to seeing if it improves compile time speed either.  It
definitely showed up in fold-const.c code at one point.

Thanks,
Andrew Pinski



 Thanks,
 Andrew Pinski



 --- gcc/lower-subreg.c.jj   2013-12-10 18:18:39.077943292 +0100
 +++ gcc/lower-subreg.c  2014-01-03 18:35:00.510418999 +0100
 @@ -1371,7 +1371,7 @@ dump_choices (bool speed_p, const char *
fprintf (dump_file, Choices when optimizing for %s:\n, description);

for (i = 0; i  MAX_MACHINE_MODE; i++)
 -if (GET_MODE_SIZE (i)  UNITS_PER_WORD)
 +if (GET_MODE_SIZE ((enum machine_mode) i)  UNITS_PER_WORD)
fprintf (dump_file,   %s mode %s for copy lowering.\n,
choices[speed_p].move_modes_to_split[i]
? Splitting
 ---