这个仓库包含了论文"mLOOP: Optimize Loop Unrolling in Compilation with a ML-based Approach"的源代码。 一部分代码参考了仓库
docker环境中包括LLVM-16.0.6和llvm-test-suite仓库,以及编译LLVM所需要库,具体内容在Dockerfile.llvm中。
可使用脚本来构建和运行docker
$ ./utils/create_image.sh
$ ./utils/run_image.sh
Dockerfile.llvm中的这部分内容,完成对Pass的部署,其中patch -p1 < /home/synprof/patches/llvm.patch对LLVM框架中的一部分代码做了修改,修改内容为,完成对Pass的注册,以及在LoopUnrollPass中添加其对循环展开因子的输出。后面则是将Pass的核心代码放入相应文件夹中。
RUN cd llvm-project \
&& patch -p1 < /home/synprof/patches/llvm.patch \
&& cp /home/synprof/patches/*.cpp llvm/lib/Transforms/Scalar/ \
&& cp /home/synprof/patches/*.h llvm/include/llvm/Transforms/Scalar/
包括两部分Pass,一个Pass可以用来搜集循环特征,另一个Pass则是用于预测循环展开因子。
应用两个Pass需要在编译时添加参数,前者对应收集特征的Pass,后者对应预测循环展开因子并应用的Pass
-mllvm -stat-prof-reporter
-mllvm -stat-prof-instrument
以下是一个应用实例
$ /opt/llvm/bin/clang -O3 -mllvm -stat-prof-instrument 1.c -emit-llvm -S -o -