LLVM for openEuler 优化选项列表

LLVM for openEuler 支持通过 -mllvm 驱动的自定义优化选项,由于基于鲲鹏架构优化,使能自定义优化选项通常需要指定鲲鹏架构,如 -mcpu=tsv110

-mllvm -profile-summary-cutoff-hot-icp=<num>

LLVM 的 Indirect Call Promotion (ICP) 优化通过反馈信息将间接函数调用优化为直接函数调用,增加潜在的内联优化机会,并降低函数调用开销。该选项用于设置 ICP 优化阈值,从而解决软件规模过大时优化阈值过高的问题。

当前语言支持 C/C++,后端支持 AArch64。

-mllvm -loop-versioning-overlap=<true|false>

通过识别内存拷贝时源指针和目标指针特征,增加运行时检查对内存拷贝方式进行特化优化(如生成 memset、memmove 等)。默认开启,依赖开源选项 -mllvm -enable-loop-versioning-licm 的能力。

当前语言支持 C/C++,后端支持 AArch64。

-mllvm -indirect-load-prefetch=<true|false>

-mllvm -outer-loop-prefetch=<true|false>

-mllvm -random-access-prefetch-only=<true|false>

-mllvm -disable-direct-prefetch=<true|false>

-mllvm -indirect-prefetch-skip-intermediate=<true|false>

提升编译器预取能力,识别应用中多层间接嵌套访存场景,自动计算实际访存地址并插入数据预取指令,降低数据缓存未命中的概率,主要包括:

  • 间接内存访问预取

  • Crc哈希间接内存访问

选项关系如下表所示

inner loop direct load prefetchinner loop indirect load prefetchouter loop direct load prefetchouter loop indirect load prefetch
default
indirect-load-prefetch
outer-loop-prefetch
indirect-load-prefetch,outer-loop-prefetch
indirect-load-prefetch,outer-loop-prefetch,random-access-prefetch-only√(hash indirect load type only)√ (hash indirect load type only)
indirect-load-prefetch,outer-loop-prefetch,disable-direct-prefetch
indirect-load-prefetch,outer-loop-prefetch,indirect-prefetch-skip-intermediate√ (exclude B[i] prefetch in A[B[i]])√ (exclude B[i] prefetch in A[B[i]])

当前语言支持 C/C++,后端支持 AArch64。

-mllvm -enable-aggressive-inline=<true|false>

不考虑源码中的 __attribute__((noinline)) 限制,强制将该类函数视为普通函数来判断是否进行 inline 优化,设置为 true 开启该优化,默认关闭。

当前语言支持 C/C++,后端支持 AArch64。

-mllvm -aarch64-ldp-stp-noq=<true|false>

禁止在鲲鹏 tsv110 后端下生成 stp/ldp q1, q2, addr 形式的指令,此形式的指令性能较差。设置为 true 开启该优化,默认开启。

当前语言支持 C/C++,后端仅支持 tsv110。

-fno-plt

传统动态库函数调用需通过 PLT (过程链接表)跳转,导致额外的内存访问和跳转指令。使能该选项后优化为直接使用 GOT (全局偏移表)中的函数地址调用,消除 PLT 跳转开销。

当前语言支持 C/C++。

LLVM for openEuler 功能选项列表

-fgcc-compatible

开启 LLVM for openEuler 对 GCC 编译器的兼容性特性,包括但不限于对编译器不识别的 GCC 功能性选项的告警严重程度降级至 warning。