本次任务要求你亲自动手实现一些 LLVM IR 上的优化算法,以提高代码的性能。
-
启用复活
任务 3 的标准答案输出,即 clang 在 O0 优化级别下生成的 LLVM IR 文件。
-
禁用复活
任务 0 的标准答案输出,即 clang 预处理后的测例源代码文件。
文本格式的 LLVM IR(.ll 文件),其语义必须与输入相同,但运行性能越高越好。
评测后,每个测例目录下会生成以下文件:
-
score.txt评测的得分详情。
-
anwser.ll标准答案,即
clang -S -emit-llvm的输出。 -
output.ll你的答案(如果 task3 程序正常运行)。
-
anwser.exe标准答案
answer.ll进一步编译出的可执行文件。 -
output.exe你的
output.ll进一步编译出的可执行文件(如果成功)。 -
answer.compileclang 在编译
answer.ll过程中的输出。 -
output.compileclang 在编译
output.ll过程中的输出。 -
answer.out和answer.err运行
answer.exe时的标准输出(cout)和标准错误输出(cerr)。 -
output.out和output.err运行
output.exe时的标准输出(cout)和标准错误输出(cerr)。
基础代码演示了 LLVM AnalysisPass 和 TransformPass 的实现以及使用,包括:
-
StaticCallCounter这是一个 AnalysisPass,用于统计每个函数在模块中被调用的次数。
-
StaticCallCounterPrinter这是一个 AnalysisPass,用于打印前述 StaticCallCounter 的结果。
结果被打印到标准错误输出(
llvm::errs()),CTest 默认会将输出保存到构建目录(build)下的Testing目录中,运行测试后到该目录下寻找后缀为.log的日志文件查看输出。 -
ConstantFolding这是一个 TransformPass,用于将操作数全部为常数的指令直接替换为结果,以避免在输出程序中重复计算。