While adding multiple new optabs over the past week or three, it occurred to me that (1) there are lots of places to update all in sync and (2) the representation size of optabs is huge.
The first issue is somewhat trivially accomplished by moving all optabs knowledge into an optabs.def file. This could have been staged differently to prove no errors in the transcription, but I'm simply going to ask for help reviewing and testing for that. The second issue is addressed by recognizing that the contents of the md file, and thus the set of named patterns, does not change between sub-targets. The only thing that changes is the value of HAVE_foo for any pattern foo. We currently have a very sparse pattern[max_mode] arrays for the optabs. Changing that to a dense mapping of known patterns to a unified pattern array can reduce the dynamic memory requirements by a factor of 10. Splitting away the truely unchanging portions to rodata can reduce the non-sharable data by another factor of 10. I initially thought of using a minimal perfect hash for the dense mapping, but gperf turns out to be irritatingly string oriented and re-implementing a perfect hash algorithm was more than I wanted to do while I didn't know how much memory I could save. So at the moment my "hash function" is a binary search over a table. Some statistics: old sizeof(struct target_optabs): alpha: 225472 ppc64: 396088 i386: 721240 new sizeof(struct target_optabs) + new .rodata alpha: 210 + 3232 ppc64: 502 + 5568 i386: 1009 + 9624 i386 cc1 old: new: .text 9381620 9373204 .rodata 3017472 3031040 .bss 1499552 778144 I've not yet speed tested this, only completed bootstrap + test runs for both x86_64 and ppc64. I've done sanity cross compiles to alpha and mips (the only SWITCHABLE_TARGET). I'll be offline til Tuesday, so I won't commit this until then at least. Hopefully there will be some good feedback on my return. FYI, the patchset is available at git://repo.or.cz/gcc/rth.git rth/opinit r~ Richard Henderson (4): Introduce and use unknown_optab Tidy some include usage + dependencies Introduce and use code_to_optab and optab_to_code functions Reduce the size of optabs representation gcc/Makefile.in | 35 +- gcc/builtins.c | 2 +- gcc/dojump.c | 13 +- gcc/dwarf2out.c | 1 - gcc/genopinit.c | 932 +++++++++++++++++++++----------------------- gcc/ifcvt.c | 4 +- gcc/libfuncs.h | 3 +- gcc/lto-streamer-in.c | 1 - gcc/optabs.c | 709 +++++++--------------------------- gcc/optabs.def | 289 ++++++++++++++ gcc/optabs.h | 958 +++++----------------------------------------- gcc/rtl.h | 7 +- gcc/tree-vect-generic.c | 30 +- gcc/tree-vect-patterns.c | 2 +- gcc/tree-vect-stmts.c | 2 +- 15 files changed, 1020 insertions(+), 1968 deletions(-) create mode 100644 gcc/optabs.def -- 1.7.7.6