该问题参考stackoverflow
该参数含义为:代码中存在溢出并已经考虑,编译器不要对可能溢出的情况进行优化。
例如这段代码,我们可能由于编写失误,认为该函数将永远返回 1。在不带 fwrapv 的情况下,编译器将为我们默认规避掉这种失误,将代码优化为直接返回 1.
而带 fwrapv 的情况下,明确告知编译器我们已经考虑了该情况,请不要进行该优化。则编译器将始终进行 i+1 和 i 的比较。
int gt(int i )
{
return i+1>i;
}
在 loongarch64 平台上进行验证。可以看到,在不带 fwrapv 的情况下,汇编器直接将 1 作为返回值。
而在携带 fwrapv 的情况下,汇编器始终将 i+1 和 i 进行比较,然后将结果返回。
merore@merore-pc:~/wk/test$ gcc -S -Os a.c -o nowrapv.s
merore@merore-pc:~/wk/test$ cat nowrapv.s
gt:
addi.w $r4,$r0,1 # 0x1
jr $r1
merore@merore-pc:~/wk/test$ gcc -S -fwrapv -Os a.c -o wrapv.s
merore@merore-pc:~/wk/test$ cat wrapv.s
gt:
addi.w $r12,$r4,1
slt $r4,$r4,$r12
jr $r1
网友评论