This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

map_fog.i - missing jump chaining optimization


I think I understand the 2nd part of the map_fog.i code size increase.

When Jan Hubicka killed jump_optimize in this patch:

http://gcc.gnu.org/ml/gcc-patches/2001-07/msg00993.html

...we lost an important optimization:

          /* See if this jump goes to another jump and redirect if so.  */
          nlabbel = follow_jumps (JUMP_LABEL (insn));
          if (nlabel != JUMP_LABEL (insn)) {
            changed_flag = redirect_jump (insn, nlabel, 1);
            if (changed_flag)
              printf("redirect_jump(insn, nlabel, 1) modified insn %d\n",
INSN_UID(insn));
            changed |= changed_flag;
          }

This one optimization is invoked 97 times during my testcase:

redirect_jump(insn, nlabel, 1) modified insn 238
redirect_jump(insn, nlabel, 1) modified insn 259
redirect_jump(insn, nlabel, 1) modified insn 280
redirect_jump(insn, nlabel, 1) modified insn 476
redirect_jump(insn, nlabel, 1) modified insn 497
redirect_jump(insn, nlabel, 1) modified insn 518
redirect_jump(insn, nlabel, 1) modified insn 714
redirect_jump(insn, nlabel, 1) modified insn 735
redirect_jump(insn, nlabel, 1) modified insn 756
redirect_jump(insn, nlabel, 1) modified insn 952
redirect_jump(insn, nlabel, 1) modified insn 973
redirect_jump(insn, nlabel, 1) modified insn 994
redirect_jump(insn, nlabel, 1) modified insn 1190
redirect_jump(insn, nlabel, 1) modified insn 1211
redirect_jump(insn, nlabel, 1) modified insn 1232
redirect_jump(insn, nlabel, 1) modified insn 1428
redirect_jump(insn, nlabel, 1) modified insn 1449
redirect_jump(insn, nlabel, 1) modified insn 1470
redirect_jump(insn, nlabel, 1) modified insn 1666
redirect_jump(insn, nlabel, 1) modified insn 1687
redirect_jump(insn, nlabel, 1) modified insn 1708
redirect_jump(insn, nlabel, 1) modified insn 1904
redirect_jump(insn, nlabel, 1) modified insn 1925
redirect_jump(insn, nlabel, 1) modified insn 1946
redirect_jump(insn, nlabel, 1) modified insn 2142
redirect_jump(insn, nlabel, 1) modified insn 2163
redirect_jump(insn, nlabel, 1) modified insn 2184
redirect_jump(insn, nlabel, 1) modified insn 2380
redirect_jump(insn, nlabel, 1) modified insn 2401
redirect_jump(insn, nlabel, 1) modified insn 2422
redirect_jump(insn, nlabel, 1) modified insn 2618
redirect_jump(insn, nlabel, 1) modified insn 2639
redirect_jump(insn, nlabel, 1) modified insn 2660
redirect_jump(insn, nlabel, 1) modified insn 2856
redirect_jump(insn, nlabel, 1) modified insn 2877
redirect_jump(insn, nlabel, 1) modified insn 2898
redirect_jump(insn, nlabel, 1) modified insn 3094
redirect_jump(insn, nlabel, 1) modified insn 3115
redirect_jump(insn, nlabel, 1) modified insn 3136
redirect_jump(insn, nlabel, 1) modified insn 3332
redirect_jump(insn, nlabel, 1) modified insn 3353
redirect_jump(insn, nlabel, 1) modified insn 3374
redirect_jump(insn, nlabel, 1) modified insn 3570
redirect_jump(insn, nlabel, 1) modified insn 3591
redirect_jump(insn, nlabel, 1) modified insn 3612
redirect_jump(insn, nlabel, 1) modified insn 3808
redirect_jump(insn, nlabel, 1) modified insn 3829
redirect_jump(insn, nlabel, 1) modified insn 3850
redirect_jump(insn, nlabel, 1) modified insn 4047
redirect_jump(insn, nlabel, 1) modified insn 4068
redirect_jump(insn, nlabel, 1) modified insn 4089
redirect_jump(insn, nlabel, 1) modified insn 4287
redirect_jump(insn, nlabel, 1) modified insn 4308
redirect_jump(insn, nlabel, 1) modified insn 4329
redirect_jump(insn, nlabel, 1) modified insn 4527
redirect_jump(insn, nlabel, 1) modified insn 4548
redirect_jump(insn, nlabel, 1) modified insn 4569
redirect_jump(insn, nlabel, 1) modified insn 4767
redirect_jump(insn, nlabel, 1) modified insn 4788
redirect_jump(insn, nlabel, 1) modified insn 4809
redirect_jump(insn, nlabel, 1) modified insn 5007
redirect_jump(insn, nlabel, 1) modified insn 5028
redirect_jump(insn, nlabel, 1) modified insn 5049
redirect_jump(insn, nlabel, 1) modified insn 5247
redirect_jump(insn, nlabel, 1) modified insn 5268
redirect_jump(insn, nlabel, 1) modified insn 5289
redirect_jump(insn, nlabel, 1) modified insn 5487
redirect_jump(insn, nlabel, 1) modified insn 5508
redirect_jump(insn, nlabel, 1) modified insn 5529
redirect_jump(insn, nlabel, 1) modified insn 5727
redirect_jump(insn, nlabel, 1) modified insn 5748
redirect_jump(insn, nlabel, 1) modified insn 5769
redirect_jump(insn, nlabel, 1) modified insn 5967
redirect_jump(insn, nlabel, 1) modified insn 5988
redirect_jump(insn, nlabel, 1) modified insn 6009
redirect_jump(insn, nlabel, 1) modified insn 6207
redirect_jump(insn, nlabel, 1) modified insn 6228
redirect_jump(insn, nlabel, 1) modified insn 6249
redirect_jump(insn, nlabel, 1) modified insn 6447
redirect_jump(insn, nlabel, 1) modified insn 6468
redirect_jump(insn, nlabel, 1) modified insn 6489
redirect_jump(insn, nlabel, 1) modified insn 6687
redirect_jump(insn, nlabel, 1) modified insn 6708
redirect_jump(insn, nlabel, 1) modified insn 6729
redirect_jump(insn, nlabel, 1) modified insn 6927
redirect_jump(insn, nlabel, 1) modified insn 6948
redirect_jump(insn, nlabel, 1) modified insn 6969
redirect_jump(insn, nlabel, 1) modified insn 7167
redirect_jump(insn, nlabel, 1) modified insn 7188
redirect_jump(insn, nlabel, 1) modified insn 7209
redirect_jump(insn, nlabel, 1) modified insn 7407
redirect_jump(insn, nlabel, 1) modified insn 7428
redirect_jump(insn, nlabel, 1) modified insn 7449
redirect_jump(insn, nlabel, 1) modified insn 7647
redirect_jump(insn, nlabel, 1) modified insn 7668
redirect_jump(insn, nlabel, 1) modified insn 7689
redirect_jump(insn, nlabel, 1) modified insn 54

The previously mentioned chunk of code modifies this insn sequence:

(jump_insn 7689 7688 7691 (set (pc)
        (if_then_else (eq (reg:SI 18 t)
                (const_int 0 [0x0]))
            (label_ref 7692)
            (pc))) -1 (nil)
    (nil))

(insn 7691 7689 7692 (set (reg:SI 3207)
        (const_int 255 [0xff])) -1 (nil)
    (nil))

(code_label 7692 7691 7693 324 "" "" [0 uses])

(jump_insn 7693 7692 7694 (set (pc)
        (label_ref 7698)) -1 (nil)

(barrier 7694 7693 7695)

This optimization modifies insn 7689 to jump directly to label_ref 7698.

This has a nice domino effect:

1. It allows removal of insn 7693,
2. Which allows deletion of barrier 7694,
3. Which suppresses a 32-byte cache alignment from being generated.

So, in total, this optimization saves an average of 18 bytes per
invocation (branch is 2 bytes plus the average alignment padding is
16 bytes) 97 times in this testcase, so it saves about (18 * 97) = 1746
bytes.

Is there any way we can reimplement this valuable optimization?

Toshi


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]