窥孔优化窥孔优化是一种优化编译器技术,在编译的后面阶段,寻找编译器生成的特定的指令序列,将该序列替换成性能更好的等效指令序列。该算法的可视范围极小,往往只能同时窥看几条指令,故名曰窥孔优化(指其犹如通过窥孔观察程序)。被优化掉的这少量指令序列被称为窥视孔或窗口。[1] 例如:
1965年William Marshall McKeeman提出窥孔优化一词。[2] 替换规则窥孔优化中常用的技术:[3]
还可以有其他类型的窥视孔优化。 例子用较快的指令替换较慢的指令以下为Java字节码 ... aload 1 aload 1 mul ... 可以替换为 ... aload 1 dup mul ... 与大多数窥孔优化一样,这种优化对指令的效率做出了某些假设。例如,在这种情况下,假设 删除冗余代码另一个例子是消除冗余load stores. a = b + c; d = a + e; 直接实现为 MOV b, R0 ; Copy b to the register
ADD c, R0 ; Add c to the register, the register is now b+c
MOV R0, a ; Copy the register to a
MOV a, R0 ; Copy a to the register
ADD e, R0 ; Add e to the register, the register is now a+e [(b+c)+e]
MOV R0, d ; Copy the register to d
但可以优化为 MOV b, R0 ; Copy b to the register
ADD c, R0 ; Add c to the register, which is now b+c (a)
MOV R0, a ; Copy the register to a
ADD e, R0 ; Add e to the register, which is now b+c+e [(a)+e]
MOV R0, d ; Copy the register to d
删除冗余栈指令如果编译器在调用子例程之前将寄存器保存在栈上并在返回时恢复它们,则对子例程的连续调用可能会产生冗余栈指令。 假设编译器为每个过程调用生成以下Z80指令: PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR
POP HL
POP DE
POP BC
POP AF
如果有两个连续的子例程调用,它们将如下所示: PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR1
POP HL
POP DE
POP BC
POP AF
PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR2
POP HL
POP DE
POP BC
POP AF
对于相同的寄存器,POP regs 后跟 PUSH 的序列通常是多余的。在冗余的情况下,窥孔优化将删除这些指令。在示例中,这将导致另一个冗余的 POP/PUSH 对出现在窥视孔中,并且这些将依次被删除。假设子程序 _ADDR2 不依赖于先前的寄存器值,则删除上例中的所有冗余代码最终将留下以下代码: PUSH AF
PUSH BC
PUSH DE
PUSH HL
CALL _ADDR1
CALL _ADDR2
POP HL
POP DE
POP BC
POP AF
实现参见参考文献
外部链接 |
Index:
pl ar de en es fr it arz nl ja pt ceb sv uk vi war zh ru af ast az bg zh-min-nan bn be ca cs cy da et el eo eu fa gl ko hi hr id he ka la lv lt hu mk ms min no nn ce uz kk ro simple sk sl sr sh fi ta tt th tg azb tr ur zh-yue hy my ace als am an hyw ban bjn map-bms ba be-tarask bcl bpy bar bs br cv nv eml hif fo fy ga gd gu hak ha hsb io ig ilo ia ie os is jv kn ht ku ckb ky mrj lb lij li lmo mai mg ml zh-classical mr xmf mzn cdo mn nap new ne frr oc mhr or as pa pnb ps pms nds crh qu sa sah sco sq scn si sd szl su sw tl shn te bug vec vo wa wuu yi yo diq bat-smg zu lad kbd ang smn ab roa-rup frp arc gn av ay bh bi bo bxr cbk-zam co za dag ary se pdc dv dsb myv ext fur gv gag inh ki glk gan guw xal haw rw kbp pam csb kw km kv koi kg gom ks gcr lo lbe ltg lez nia ln jbo lg mt mi tw mwl mdf mnw nqo fj nah na nds-nl nrm nov om pi pag pap pfl pcd krc kaa ksh rm rue sm sat sc trv stq nso sn cu so srn kab roa-tara tet tpi to chr tum tk tyv udm ug vep fiu-vro vls wo xh zea ty ak bm ch ny ee ff got iu ik kl mad cr pih ami pwn pnt dz rmy rn sg st tn ss ti din chy ts kcg ve