小编Tie*_*ies的帖子

GCC/Clang 是否应该通过一组限制条件指针来优化这种冗余负载?

我正在研究通过将 C99限制类型限定符添加到数组的类型参数来允许编译器进行的优化。

例如,考虑下面的函数f

int f(int* restrict a[2]) {
    *(a[0]) = 10;
    *(a[1]) = 11;
    return *(a[0]);
}
Run Code Online (Sandbox Code Playgroud)

它采用一个由指向整数的限制指针组成的二元素数组a作为参数。该函数存储10到对象a[0]指向和11对象a[1]指向。a[0]最后,它返回该对象指向的值。

因为指针a[0]a[1]是限制限定的,所以我假设编译器有足够的信息来执行典型的优化,即不再次加载a[0],而是直接返回(因为如果程序已定义行为,则10写入a[1]不能更改对象指向a[0])。

因此,如果优化发生在“C 代码级别”,则该函数将变为:

int f(int* restrict a[2]) {
    *(a[0]) = 10;
    *(a[1]) = 11;
    return 10;
}
Run Code Online (Sandbox Code Playgroud)

然而,GCC 和 Clang(我尝试了几个版本,其中最新的是 Godbolt)都没有执行此优化(当使用 -O3 编译时)。

GCC13.2 发出的 X86 程序集是

f:
        mov     rax, QWORD PTR [rdi]
        mov …
Run Code Online (Sandbox Code Playgroud)

c gcc clang restrict-qualifier

5
推荐指数
1
解决办法
190
查看次数

标签 统计

c ×1

clang ×1

gcc ×1

restrict-qualifier ×1