compiler-construction - Setting branch weight metadata in LLVM IR
问题描述
I'm trying to get my head around how metadata works in LLVM and how to set profiling metadata to specify branch weights, going by these docs for BranchInst
specifically: https://llvm.org/docs/BranchWeightMetadata.html
Using the C API, my understanding of how metadata works leads me to believe this is how you would achieve this:
LLVMMetadataRef branch_weights = LLVMMDStringInContext2(LLVMGetGlobalContext(), "branch_weights", 14);
LLVMMetadataRef weight1 = LLVMMDStringInContext2(LLVMGetGlobalContext(), "0", 1);
LLVMMetadataRef weight2 = LLVMMDStringInContext2(LLVMGetGlobalContext(), "100", 3);
LLVMMetadataRef mds[] = {branch_weights, weight1, weight2};
LLVMMetadataRef metadata = LLVMMDNodeInContext2(LLVMGetGlobalContext(), mds, 3);
LLVMValueRef metadata_value = LLVMMetadataAsValue(LLVMGetGlobalContext(), metadata);
But this gives the following in the IR:
!0 = !{!"branch_weights", !"0", !"100"}
When according to the docs linked above, I want this:
!0 = metadata !{
metadata !"branch_weights",
i32 <TRUE_BRANCH_WEIGHT>,
i32 <FALSE_BRANCH_WEIGHT>
}
How can I achieve the above format in metadata, preferably with the C API, ensuring it's the MD_prof
kind as mentioned in the docs?
解决方案
事实证明,主要区别在于必须使用LLVMValueAsMetadata
整数而不是字符串来获取权重,然后必须指定prof
字段kindID
,给出:
LLVMMetadataRef branch_weights = LLVMMDStringInContext2(LLVMGetGlobalContext(), branch, 14);
LLVMMetadataRef weight1 = LLVMValueAsMetadata(LLVMConstInt(LLVMIntType(32), 0, 0));
LLVMMetadataRef weight2 = LLVMValueAsMetadata(LLVMConstInt(LLVMIntType(32), 100, 0));
LLVMMetadataRef mds[] = {branch_weights, weight1, weight2};
LLVMMetadataRef metadata = LLVMMDNodeInContext2(LLVMGetGlobalContext(), mds, 3);
LLVMValueRef metadata_value = LLVMMetadataAsValue(LLVMGetGlobalContext(), metadata);
LLVMSetMetadata(<branch instruction here>, LLVMGetMDKindID("prof", 4), metadata_value);
这给出了!0 = !{!"branch_weights", i32 0, i32 100}
尽管与文档中的内容略有不同的格式仍然通过,并且由于参数的原因opt -verify
,应该将其解析为节点。MD_prof
kindID
推荐阅读
- python - 能否将 Power BI 报表服务器报表的结果用作 C#、Python 或 PowerShell 程序中的数据源?
- node.js - 为什么调用其他纱线脚本时我的纱线脚本很慢?
- r - 跨嵌套列表的元素(或不同级别)获取汇总估计
- javascript - 可以像复选框一样选择的图像
- node.js - 如何删除具有“_”或“.”的字段?
- python - 如何通过按键订购字典并逐行打印?
- kubernetes - LXD 与生产集群 (Kubernetes) 中的经典 VM
- python - 如何使用 Keras 重新缩放表示为 NumPy 数组的图像?
- python - 如何同时使用 & 和 | pandas .loc() 函数中的运算符?
- ios - 为什么我的 Xcode 10.1 Playground 没有运行代码?