Hello,

A lot of optab_handler checks are against CODE_FOR_nothing, which is
currently a target dependent number, the last value in "enum
insn_code". This made target reinitializing slow, so Richard S.
changed the optab_handler index from insn_code to (insn_code -
CODE_FOR_nothing) to allow the table to be memset to 0 (rather than
filling it with CODE_FOR_nothing in a loop).

I didn't like this solution very much, because of the casting between
int and enum insn_code, and because it didn't solve the problem that
CODE_FOR_nothing is target dependent. Also, comparisons against 0 are
cheaper on probably all targets than comparing against a larger number
(e.g. CODE_FOR_nothing is 2414 on powerpc64, 3013 on arm, and 3852 on
x86_64), and there are a lot of compares against CODE_FOR_nothing.

Therefore I propose this patch as an alternative (and IMHO better)
solution, that changes things such that CODE_FOR_nothing==0.

To achieve this, I introduced a dummy insn in insn_data, so
insn-output.c's insn_data now starts with:

const struct insn_data_d insn_data[] =
{
  /* <internal>:0 */
  {
    "*placeholder_for_nothing",
#if HAVE_DESIGNATED_UNION_INITIALIZERS
    { 0 },
#else
    { 0, 0, 0 },
#endif
    0,
    &operand_data[0],
    0,
    0,
    0,
    0,
    0
  },

Otherwise, there wasn't much to be changed. There was a sort-of bug in
genpeep.c in that it was keeping its own sequence counter, but the
rest is straight-forward.

I get a small cc1 code size reduction:
   text    data     bss     dec     hex filename
14982747         639632 1223416 16845795        1010be3 build-patched/gcc/cc1
14983007         639704 1223416 16846127        1010d2f build-orig/gcc/cc1

I also get a small speedup, but nothing spectacular.

Bootstrapped and tested on powerpc64-unknown-linux-gnu. OK for trunk?

Ciao!
Steven

Attachment: rebase_CODE_FOR_nothing.diff
Description: Binary data

Reply via email to