首页 > 解决方案 > 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?

标签: compiler-constructionllvm

解决方案


事实证明,主要区别在于必须使用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_profkindID


推荐阅读