Re: [PATCH] Introduce MODE_SIZE mode attribute
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
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
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
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
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
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
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
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 ---