在LLVM IR中限制C vs noalias属性中的限定符

Kik*_*dez 6 c c++ llvm-ir

我的问题与C 语言中限制限定符的不同语义和LLVM中的noalias属性有关,当它们用作函数参数时.

根据noordiasLLVM文档:

这表示在执行函数期间,通过不基于参数或返回值的指针值,也不会访问基于参数或返回值通过指针值访问的对象.

限制限定符的情况下,C11的草案(例3,第124页,第6.7.3.1节)给出了两个限制参数之间存在别名的示例,只要它们只读取数据就可以了:

void h(int n, int * restrict p, int * restrict q, int * restrict r) {
    int i;
    for (i = 0; i < n; i++)
        p[i] = q[i] + r[i];
}
Run Code Online (Sandbox Code Playgroud)

对我来说,似乎上面给出的例子不能满足noalias的语义.是这样的吗?

Kik*_*dez 1

正如 Jens Gustedt 所建议的,深入研究链接将我带到了AliasAnalysis页面,其中指出:

\n\n
\n

最明显的例子是两个指针指向不重叠的内存范围。另一种情况是两个指针仅用于读取内存。另一种情况是,当在通过一个指针的访问和通过另一个指针的访问之间释放和重新分配内存时,在这种情况下,存在依赖性,但它是由释放和重新分配介导的。

\n
\n\n

这就解决了问题:noalias属性相当于restrict函数参数中的 C 限定符。

\n