我的问题与C语言中 restrict 限定符的不同语义以及LLVM中用作函数参数时的 noalias 属性有关。
根据LLVM documentation for noalias:
这表示在执行函数期间,通过不基于参数或返回值的指针值,也不会访问基于参数或返回值通过指针值访问的对象。
如果是限制限定符,C11 (Example 3, page124, sect. 6.7.3.1)的草稿会在两个 restrict 参数之间存在别名的示例,这样就可以了因为他们只读数据:
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];
}
对我来说,似乎上面给出的例子不符合 noalias 的语义。是这种情况吗?
答案 0 :(得分:0)
正如Jens Gustedt所建议的那样,深入了解这些链接会让我进入AliasAnalysis页面,该页面指出:
最明显的例子是两个指针指向非重叠的内存范围。另一个是当两个指针只用于读取内存时。另一个是当内存被释放并在通过一个指针访问之间重新分配并通过另一个指针进行访问时 - 在这种情况下,存在依赖性,但它由自由和重新分配调解。
这解决了这个问题:noalias
属性等同于函数参数中的C restrict
限定符。