自定义优化选项
毕昇编译器支持通过-mllvm驱动的自定义优化选项,由于基于鲲鹏架构优化,使能自定义优化选项需要指定鲲鹏架构,如-mcpu=tsv110。
-mllvm -force-customized-pipeline=<true|false>
强制使用自定义的pass顺序。设为true开启该优化,默认关闭。
-mllvm -sad-pattern-recognition=<true|false>
对差值的绝对值求和运算(sum += abs(a[i] - b[i]))进行优化,生成更简单高效的运算序列。设为true开启该优化,默认开启。
-mllvm -instcombine-ctz-array=<true|false>
实现对De Bruijn序列查表计算的优化。设为true开启该优化,默认开启。
-mllvm -aarch64-loopcond-opt=<true|false>
减少某些条件下的循环条件判断中的冗余指令,生成更优的代码。设为true开启该优化,默认开启。
-mllvm -aarch64-hadd-generation=<true|false>
对于矢量化的运算 (x[i] + y[i] + 1) >> 1,使用一条ARM NEON指令URHADD完成运算,从而生成更优的代码。设为true开启该优化,默认开启。
-mllvm -enable-loop-split=<true|false>
使能循环拆分优化,可以将符合条件的一个循环拆分成多个循环从而有助于实现冗余循环删除等优化。设为true开启该优化,默认开启。
-mllvm -enable-mem-chk-simplification=<true|false>
LLVM循环矢量化常常需要生成运行时检查,此优化致力于简化运行时检查的逻辑,从而生成更优的循环矢量化代码。设为true开启该优化,默认开启。
-mllvm -aarch64-ldp-stp-noq=<true|false>
禁止生成stp/ldp q1, q2, addr形式的指令,此形式的指令性能较差。设为true开启该优化,默认开启。
-mllvm -enable-func-arg-analysis=<true|false>
增强LLVM的值域分析能力,使LLVM的function specialization优化可以覆盖更多的函数场景。设为true开启该优化,默认开启。
-mllvm -enable-modest-vectorization-unrolling-factors=<true|false>
使得步长较小的循环更容易被矢量化。设为true开启该优化,默认开启。
-mllvm -instcombine-shrink-vector-element=<true|false>
通过提高矢量化指令的并行度,消除矢量化过程中生成的标量中间值,达到增强循环矢量化的效果。设为true开启该优化,默认开启。
-mllvm -instcombine-reorder-sum-of-reduce-add=<true|false>
通过更改reduction操作的顺序生成更优的reduction代码。设为true开启该优化,默认开启。
-mllvm -replace-fortran-mem-alloc=<true|false>
在fortran代码中,对于已知大小的内存分配(如数组),使用栈内存代替堆内存,从而提升性能。设为true开启该优化,默认开启。
![](/doc_center/source/zh/kunpengdevkithistory/bisheng/hist-bisheng/public_sys-resources/notice_3.0-zh-cn.png)
此优化生效的内存大小由-mllvm -max-fortran-heap-to-stack-size=<Int number>指定,默认为4096。
-mllvm -enable-pg-math-call-simplification=<true|false>
优化fortran多个数学库函数调用,提升fortran数学函数调用的性能。设为true开启该优化,默认开启。
-mllvm -instcombine-gep-common=<true|false>
优化多维数组在复杂场景下(如嵌套多层循环)的元素地址计算,减小寄存器压力,提高程序性能。设为true开启该优化,默认开启。
-mllvm -enable-sroa-after-unroll=<true|false>
使能循环展开后添加SROA的功能,减少访存操作,将变量保存在寄存器中。设为true开启该优化,默认开启。
-mllvm -disable-recursive-bonus=<true|false>
使递归函数中的函数调用更容易被inline,可以给调用频繁的递归函数带来更好的性能。设为true关闭该功能,默认为false,使能inline操作。
-mllvm -disable-recip-sqrt-opt=<true|false>
在fastmath场景下,对 A = (C / sqrt(Y)); B = A * A 的形式进行优化,使用更少的指令完成运算。设为true关闭该优化,默认false,使能该优化。
-mllvm -disable-loop-aware-reassociation=<true|false>
在Reassociate Pass中增加循环感知,将一些操作限制在循环边界内,避免因循环内部的指令数量增加导致的性能下降。设为true关闭该优化,默认false,使能该优化。
-mllvm -enable-gzipcrc32=<true|false>
识别代码中的crc32计算逻辑,使用处理器内置指令进行替代以加速计算。设为true开启该优化,false关闭优化,默认关闭。
![](/doc_center/source/zh/kunpengdevkithistory/bisheng/hist-bisheng/public_sys-resources/caution_3.0-zh-cn.png)
若开启本选项:
- 需确保是AARCH64架构
- 需确保优化等级为O3
- 需添加链接选项 -lclang_rt.irlib -L <install_path>/lib/clang/15.0.4/lib/aarch64-unknown-linux-gnu
若<install_path>/lib/clang/15.0.4/lib/aarch64-unknown-linux-gnu/clang_rt.irlib文件不存在,请勿开启本选项
-mllvm -enable-aes=<true|false>
识别代码中的aes计算逻辑,使用处理器内置指令进行替代以加速计算。设为true开启该优化,false关闭优化,默认关闭。
![](/doc_center/source/zh/kunpengdevkithistory/bisheng/hist-bisheng/public_sys-resources/caution_3.0-zh-cn.png)
若开启本选项:
- 需确保是AARCH64架构
- 需确保优化等级为O3
- 需添加链接选项 -lclang_rt.irlib -L <install_path>/lib/clang/15.0.4/lib/aarch64-unknown-linux-gnu
若<install_path>/lib/clang/15.0.4/lib/aarch64-unknown-linux-gnu/clang_rt.irlib文件不存在,请勿开启本选项
-mllvm -enable-plle=<true|false>
O3时,识别循环分支中不必要的load指令并删除。设为true开启该优化,false关闭优化,默认关闭。
开启本选项后,下方两选项才会使能。
- -mllvm -plle-hotpathcost-threshold=<unsigned> 控制循环中热点路径的cost阈值
- -mllvm -plle-bf-lowerbound=<unsigned> 用于筛选符合条件的分支概率,该值应在0到100之间
-mllvm -enable-merge-reversed-icmps=<true|false>
O3时,合并反向的连续的整数比较(要求 target 是小端序的)。设为true开启该优化,false关闭优化,默认关闭。
-Hx,70,0x20000000
O1/O2/O3时毕昇编译器使能了flang1阶段内联minloc和maxloc,内联后,函数调用成为简单的for-loop,在LLVM中可以进一步优化。使用本选项可以禁用内联功能,行为与O0一致。
-mllvm -update-iv-scev
在Induction variable users pass 更新 SCEV 分析的结果以暴露更多的优化机会。该选项默认开启,可能会增加编译时长,如果对编译时长要求较高可以使用-mllvm -update-iv-scev=false 选项进行关闭。
-gep-common
通过删除用作索引的add指令,为来自同一指令的GEP cluster生成一个公共父代。
- -mllvm -gep-common=<true|false> 控制该优化,设为true开启优化,默认开启。
- -mllvm -gep-cluster-min=<Int number> 设置GEP cluster阈值,默认为3。
- -mllvm -gep-loop-mindepth=<Int number> 设置循环阈值,默认为3。
-array-restructuring
数组重排优化,改进程序中一个或多个数组的内存访问模式,进行数组重排,从而减少运行时间。
- -mllvm -enable-array-restructuring=<true|false> 控制该优化,设为true开启优化,默认开启。
- -mllvm -skip-array-restructuring-codegen=<true|false> 禁用该优化pass的指令生成部分,设为true禁用,默认false。
-struct-peel
结构体剥离优化,提高访问结构体数组中的结构字段时的局部缓存,从而减少运行时间。
- -mllvm -enable-struct-peel=<true|false> 控制该优化,设为true开启优化,默认开启。
- -mllvm -struct-peel-skip-transform=<true|false> 禁用该优化pass的指令生成部分,设为true禁用,默认false。
- -mllvm -struct-peel-this=... 在合法的前提下,强制剥离指定的结构体。
-fopenmp-reduction-duplicate
openmp reduction场景向量化能力增强,仅在aarch64后端和C、C++ 前端起效,默认开启,在-fopenmp开启时生效。-fno-openmp-reduction-duplicate 可关闭。
-fopenmp-firstprivatize-locals
openmp firstprivatize 场景向量化能力增强,,仅在aarch64后端和C、C++ 前端起效,默认开启,在-fopenmp开启时生效。-fno-openmp-firstprivatize-locals 可关闭。
-sort-ivusers-before-lsr
对Induction Variable的Users进行排序后才开始做Loop Strength Reduce(LSR)优化,避免可能出现在多次构建时保持二进制汇编出现不一致。
为了节省编译耗时,该选项默认关闭。
-Mx,218,0x1
毕昇编译器使能了flang2阶段内联字符串比较,内联后,函数调用成为简单的for-loop字符比较,在LLVM中可以进一步优化。该内联功能默认关闭,使用本选项可以使能内联功能。
-foverflow-shift-alt-behavior
对于超出整型数据类型位宽大小的未定义移位行为,如(int) a << 40,毕昇编译器将表达式提前优化为整型常量,以避免在不同优化遍中会被识别优化成不同的值,该选项默认关闭。
-mllvm -warn-large-symbols=<num>
在C/C++/Fortran程序中,如果存在超大体积符号,符号寻址的重定位类型将无法支持如此大的范围偏移,该选项用于识别源码中可能存在的大符号(大符号的阈值由选项参数控制 num MBytes),并给出相应的告警。
-mllvm -instcombine-simplify-mul64=<true|false>
将两个64比特的操作数相乘输出一个128比特数据的算法简化为更加高效的指令。设为true开启该优化,默认开启。当前语言支持C,C++,后端支持AArch64。
-mllvm -replace-sqrt-compare-by-square=<true|false>
将比较条件中的开方计算替换为其结果的平方计算,从而转换此比较条件。该优化需在-ffast-math开启的前提下开启,设为true开启该优化,默认关闭。当前语言支持C,C++,后端支持AArch64。
-mllvm -enable-combine-sqrt-exp=<true|false>
优化sqrt(exp(x))为exp(x*0.5),消除执行代价较高的sqrt运算。该优化需开启-ffast-math,设为true开启该优化,默认开启。当前语言支持C/C++,后端支持AArch64。
-mllvm -loop-load-widen-patterns=<id1>,<id2>,...
对于部分数据可以用更宽的数据类型进行访问的场景优化,当前支持的场景有三个,id 分别为 0,1,2。若缺省则全部使能。若指定了一个小于 0 的 id (e.g. -1),则关闭该优化。当前语言支持C,后端支持AArch64。
-mllvm -enable-aggressive-inline=<true|false>
不考虑源码中的__attribute__((noinline))限制,强制将该函数视为普通函数来判断是否进行inline优化,设为true开启该优化,默认关闭。当前语言支持C/C++,后端支持AArch64。
-shift rounding
对rounding场景进行匹配,选用更合适的指令,从而减少运行时间。
- -mllvm -aarch64-optimize-rounding =<true|false> 控制该优化,设true为开启优化,默认开启。
- -mllvm -aarch64-optimize-rounding-saturation=<true|false> 控制是否对SQRSHRUN/ UQRSHRN场景优化,设true为开启,默认开启。
- -mllvm -aarch64-extract-vector-element-trunc-combine=<true|false> 对于部分场景进行更优的指令选择,设true为开启,默认开启。
- -mllvm -aarch64-rounding-search-max-depth =<integer> 对于rounding场景的搜索深度设置,默认为4。
-mllvm -aggressive-instcombine-simplify-sqr64=<true|false>
对64位的sqr操作进行优化,采用更精简的指令,从而提升性能,设为true开启该优化,默认开启。当前语言支持C/C++,后端支持AArch64。
-mllvm -enable-value-spec=<true|false>
对于 res = x ? y : z 三目运算符表达式,当 y 或者 z 中包含零并选择了它做为结果时,引用 res 变量的乘法等计算可以被优化消除以提升性能。此优化通过识别三目运算符在 IR 中形成的 select 指令,将使用了 select 结果的部分冗余指令进行消除。注意,只有当三目运算符在编译器中端形成 select 指令时,此优化才会针对 select 指令进行变换。
- -mllvm -vspec-min-select-users = <integer> 控制使用目标 select 结果的冗余指令数量,当实际数量大于设定值时,优化被开启。默认为5。
- -mllvm -vspec-search-users-depth = <integer> 控制从目标 select 所在基本块向下寻找包含冗余指令的基本块的深度。默认为5。
-mllvm -relaxed-ordering-level=<RO_DISABLE|RO_1|RO_2|RO_3>
RO_DIASBLE表示关闭弱内存序防护,RO_1|RO_2|RO_3表示开启弱内存序防护:RO_1使用基本修复策略,确保应用正常执行,性能损失最大;RO_2使用最安全的修复策略,性能损失较大;RO_3应用组件优化规则,可以减少性能损失。
-mllvm -enable-highlevel-branch-prediction=<true|false>
基于代码中的信息,预测分支的执行方向。设为true开启优化,false关闭优化,默认关闭。
-mllvm -enable-branch-metadata -mllvm -enable-boscc=<true|false>
在代码矢量化的基础上,重新引入标量循环中的控制流。设为true开启优化,false关闭优化,默认关闭。