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

restrict qualifier in C vs noalias attribute in LLVM IR

本文关键字:IR LLVM 中的 noalias 属性      更新时间:2023-10-16

我的问题与C中的restrict限定符和LLVM中的noalias属性在用作函数参数时的不同语义有关。

根据的LLVM文档noalias:

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

对于restrict限定符,C11草案(例3,page124,节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的语义。是这样吗?

正如Jens Gustedt所建议的那样,深入研究链接将我带到了AliasAnalysis页面,上面写着:

最明显的例子是两个指针指向不重叠的内存范围。另一种情况是这两个指针只用于读取内存。另一种是在通过一个指针访问和通过另一个指针访问之间释放和重新分配内存——在这种情况下,存在依赖关系,但它是通过释放和重新分配来调解的。

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