SDCC 生成不必要的除以零

SDCC generates unnecessary division by zero

我正在使用 SDCC 为 STM8 微控制器进行编译。编译以下文件会导致看似不必要的 div 指令 - 这在 STM8 上非常慢。

char a[1];
char b;

void foo() __interrupt(1) {
    char c = a[0];
    b = c >> 0;
}

void main() {
}

使用 sdcc -mstm8 file.c 编译产生以下程序集:

_foo:
    clr a
    div x, a
    ld  a, _a+0
    ld  _b+0, a
    iret

函数似乎按预期工作,但我不明白为什么需要前两条指令。

看起来这是编译器某处的错误,因为如果 b = c >> 0 更改为 b = c << 0b = c + 0b = a[0]... 则不会发生这种情况。在优化和未优化的代码上都会观察到该行为。但是,如果您针对大小 (--opt-code-size) 进行优化,则只有 div 存在,不会发出 clr 指令。您可能想要 report that to the developers

Demo on Compiler Explorer