Keil IDE —— 优化等级Code Optimization

目 录

  • Code Optimization
  • L0(基础优化 Constant Folding)
  • L1(死码清除 DCE)
  • L2(数据覆盖 Data overlay)
  • L3(窥孔优化 Peephole OPT)
  • L4(寄存器分配 Reg Var)
  • L5(全局CSE)
  • L6(循环变换 Loop Rotation)
  • L7(DPTR优化)
  • L8(尾部复用)
  • L9(子程序提取)
  • 补充说明


Code Optimization

keil对代码优化等级code optimization在魔法棒配置的C51选项里,一共有0-9这10个等级可选。


L0(基础优化 Constant Folding)

  • 核心优化
    • 常量折叠(Constant Folding):编译时计算所有可推导的常量表达式(含地址计算)。
    • 简单访问优化:对idata/bit等内部存储区的直接访问生成高效指令。
    • 跳转压缩(Jump Chaining):消除中间跳转,直达最终目标地址。
  • 调试支持
    • 保留完整调试符号,支持任意行断点设置(含死代码)。

L1(死码清除 DCE)

  • 新增优化
    • 死码消除(DCE):移除不可达代码及无用静态函数。
    • 跳转简化(Jump Simplification):基于控制流分析简化/删除冗余条件跳转。
  • 平衡性
    • 保留关键调试信息,适合开发阶段使用。

L2(数据覆盖 Data overlay)

  • 关键优化
    • 静态数据覆盖分析:通过BL51连接器实现全局数据流分析,标记可重叠存储的静态变量。
  • 影响
    • 可能改变函数调用关系,调试信息完整性下降。

L3(窥孔优化 Peephole OPT)

  • 指令级优化
    • 冗余MOV消除:移除不必要的寄存器/内存加载操作。
    • 指令替换:用更高效的指令序列替代复杂操作(如乘法→移位加法)。
  • 激进优化
    • 自动内联扩展,可能触发循环展开(可通过--loop_optimization_level单独控制)。

L4(寄存器分配 Reg Var)

  • 核心改进
    • 激进寄存器分配:优先将自动变量和参数分配到工作寄存器(R0-R7)。
    • 直接存储区访问:消除xdata/pdata等区域的中间加载步骤。
  • 进阶优化
    • 局部公共子表达式消除(LCSE)。
    • switch语句跳转表转换。

L5(全局CSE)

  • 跨块优化
    • 全局公共子表达式消除(GCSE):跨基本块复用重复计算。
    • 常量传播循环优化:对填充常量的内存循环进行特殊优化。

L6(循环变换 Loop Rotation)

  • 循环优化
    • 循环旋转(Loop Rotation):重构循环结构以提高流水线效率。
    • 强度削减(Strength Reduction):用低成本操作替换高成本计算(如乘法→加法)。

L7(DPTR优化)

  • 指针增强
    • 扩展DPTR使用:优化指针/数组访问模式,减少辅助寄存器占用。
    • 自动选择基址+偏移量访问策略。

L8(尾部复用)

  • 调用优化
    • 公共调用序言/尾声合并:复用多次函数调用的相同初始化代码。

L9(子程序提取)

  • 代码压缩
    • 重复指令序列检测:提取公共指令序列为子程序,可能重组代码以最大化复用。

补充说明

  1. 调试影响:优化等级≥L2时调试信息逐步受限,≥L3可能显著改变代码结构。
  2. 循环控制:通过--loop_optimization_level可独立设置循环展开强度(0-3级)。
  3. 存储模型敏感性:高等级优化效果受small/compact/large存储模式影响。

PS:
优化级别并非越高越好,应该根据具体要求适当选择。
在debug时尽量保证优化等级在0,在出货时尽量保证等级在1,既不会出现问题,生成的代码也小。
尽量不要用最高优先级。

你可能感兴趣的:(Keil,代码优化,Code,Optimi)