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 << 0
、b = c + 0
、b = a[0]
... 则不会发生这种情况。在优化和未优化的代码上都会观察到该行为。但是,如果您针对大小 (--opt-code-size
) 进行优化,则只有 div
存在,不会发出 clr
指令。您可能想要 report that to the developers
我正在使用 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 << 0
、b = c + 0
、b = a[0]
... 则不会发生这种情况。在优化和未优化的代码上都会观察到该行为。但是,如果您针对大小 (--opt-code-size
) 进行优化,则只有 div
存在,不会发出 clr
指令。您可能想要 report that to the developers