0

我正在使用 GCC 版本 4.2.4。下面解释的问题无法在 Gcc 4.6.x 上重现,这是我测试的仅有的两个版本。

我有一个定义枚举的头文件,标题:abc.h

enum test
{
    VALUE_1 = 1,
    VALUE_2 = 2,

    VALUE_MAX = 0xFFFF,
};

这个头文件包含在几个源文件中,每个源文件在编译时创建一个对象 (.o)。并且很少有源文件不引用 abc.h 中的任何枚举。

我看到的问题是,如果我在 abc.h 中添加一个新常量 (VALUE_3),那么不使用任何枚举的对象的二进制 md5sum 也会发生变化。这仅在我应用优化时发生,而不是在编译时发生。

我怀疑它与启用优化的标志 -ftree-vrp 和 -ftree-dominator-opts 有关。将这些标志与 -fno 一起使用仍会导致某些对象发生更改,但会阻止其他少数对象发生更改(使用这些标志进行更改)。

另一个有趣的观察是 md5sum 对于偶数或奇数的枚举是相同的。

任何人都可以帮助我了解后端发生了什么,并且当该特定对象没有实际代码更改时,是否有任何方法可以避免二进制更改以维护 md5sum。

提前致谢。

编辑:

对于一个对象,以下是差异。对于其他对象,也几乎没有其他更改(在 mov 等指令中)。如您所见,仅交换了某些指令中的操作数寄存器。我想了解原因以及如何通过优化来避免它。

# diff test.o.1 test.o.2
1548,1549c1548,1549
<     cmpl    %eax, %ecx
<     jg      .L442
---
>     cmpl    %ecx, %eax
>     jl      .L442
4

1 回答 1

1

有什么方法可以避免二进制更改

要检查 Jonathon Reinhart 的怀疑“它可能与分支预测有关”,您可以尝试该选项-fno-guess-branch-probability

于 2015-02-18T10:51:13.567 回答