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

Posted

技术标签:

【中文标题】限制 C 中的限定符与 LLVM IR 中的 noalias 属性【英文标题】:restrict qualifier in C vs noalias attribute in LLVM IR 【发布时间】:2017-03-06 12:32:19 【问题描述】:

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

根据LLVM documentation for noalias

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

restrict 限定符的情况下,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 的语义。是这样吗?

【问题讨论】:

它明确表示它旨在非常相似。特别是如果您深入研究链接,您会发现 noalias 在只读取两个指针时也同样有效。真正的区别在于noalias 对返回值也有意义,C 甚至无法表达。返回类型的限定被删除。 【参考方案1】:

按照 Jens Gustedt 的建议,深入研究链接将我带到AliasAnalysis 页面,该页面声明:

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

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

【讨论】:

以上是关于限制 C 中的限定符与 LLVM IR 中的 noalias 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何从 LLVM IR 打印浮点数?

C++杂谈const限定符与const指针

将 LLVM-IR 转换为类似 C 的语言

LLVM的IR指令及代码生成技术应用详解

如何使 clang 编译为 llvm IR

Impala中 LLVM 的交叉编译、调用过程