This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
map_fog.i - missing jump chaining optimization
- From: tm <tm at mail dot kloo dot net>
- To: gcc-patches at gcc dot gnu dot org, tm at kloo dot net
- Cc: joern dot rennecke at superh dot com, shumpei dot kawasaki at hsa dot hitachi dot com
- Date: Wed, 31 Jul 2002 17:35:27 -0700 (PDT)
- Subject: 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