C中的限制限定符与LLVM IR中的noalias属性
restrict qualifier in C vs noalias attribute in LLVM IR
我的问题与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
限定符的问题。
相关文章:
- LLVM 编译:目标的配方 '../lib/IR/Release+Asserts/Intrinsics.gen.tmp' failed
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 如何使用 IRBuilder 更新 LLVM IR 中的全局变量值?
- 编写一个将 LLVM IR 文件作为命令行参数的程序
- 通过命令行参数获取llvm ir文件时面临问题
- LLVM 生成低效的 IR
- 拥有LLVM IR库如何从Ubuntu将其交叉编译到iOS,Android,Windows和Mac?
- 如何发出编译和运行C++函数的 LLVM IR
- 目标代码可以转换回LLVM IR吗?
- LLVM IR Array Move with c++ api
- 从LLVM IR中的寄存器中存储该值
- 如何通过 LLVM IR 检查溢出
- LLVM IR:具有可变基本块目标的分支指令
- 使用 LLVM IR 实现动态类型语言
- 为什么LLVM-IR中没有显示模板函数
- 当给定 IR 文件时,如何使 LLVM 选择输出 IR 文件
- LLVM IR,简单的程序给出segfault
- LLVM:如何将 IR 写入文件并运行它
- Clang在发出LLVM IR时向所有函数添加noinline属性
- IR LLVM形式与程序集