Watcom 中的 C 语言优化不佳

Poor C optimization in Watcom

我正在使用 Watcom C 编译器 (wcc) 2.0 版。我在启用了许多优化的情况下编译了这个简单的代码,但生成的 ASM 对我来说似乎非常未优化。

int test(int x) {

    return x ? 1 : 2;
}

以 8086 为目标进行编译,最快的优化 (-otexan)。

wcc test.c -i="C:\Data\Projects\WATCOM/h" -otexan -d2 -bt=dos -fo=.obj -mc

然后反汇编:

wdis test.obj -s > test.dasm

生成的汇编程序如下所示:

...
    return x ? 1 : 2;
02C7  83 7E FA 00            cmp        word ptr -0x6[bp],0x0000
02CB  74 03                  je         L
02CD  E9 02 00               jmp        L
02D0                L:
02D0  EB 07                  jmp        L
02D2                L:
02D2  C7 46 FE 01 00         mov        word ptr -0x2[bp],0x0001
02D7  EB 05                  jmp        L
02D9                L:
02D9  C7 46 FE 02 00         mov        word ptr -0x2[bp],0x0002
02DE                L:
02DE  8B 46 FE               mov        ax,word ptr -0x2[bp]
02E1  89 46 FC               mov        word ptr -0x4[bp],ax
02E4  8B 46 FC               mov        ax,word ptr -0x4[bp]
...

这些跳转在我看来严重未优化。我希望减少不必要的跳跃,并可能将结果直接放入 AX 而无需将其放在 BP 位置那里和后面(最后两行)。

    cmp      word ptr -0x6[bp],0x0000
    jz       L
    mov      ax,0x0001
    jmp      L
L:
    mov      ax,0x0002
L:
    ...

我是不是遗漏了什么? wcc 是否出于某种原因忽略了我的开关?谢谢。

问题出在生成详细调试信息的 -d2 开关上。它可能会插入不必要的行以对应原始 C 文件的行(以便能够在那里放置硬件断点,也许吧?)。我改用 -d1 瞧:

01A0              test_:
01A0  85 C0           test      ax,ax
01A2  74 04           je        L
01A4  B8 01 00        mov       ax,0x0001
01A7  C3              ret
01A8              L:
01A8  B8 02 00        mov       ax,0x0002
01AB  C3              ret