ZHDA315 September   2026 MSPM0C1103 , MSPM0C1103-Q1 , MSPM0C1104 , MSPM0C1104-Q1

 

  1.   1
  2.   摘要
  3.   商标
  4. 1简介
  5. 2C 编译器优化
    1. 2.1 优化设置
      1. 2.1.1 优化级别
      2. 2.1.2 Optnone
      3. 2.1.3 链接时优化 - LTO
    2. 2.2 运行时模型选项
      1. 2.2.1 数据段与函数段
      2. 2.2.2 函数外提
  6. 3编码技巧
    1. 3.1 为变量和常量选用尽可能小的类型
    2. 3.2 避免乘法和除法
    3. 3.3 使用查找表代替手动计算
    4. 3.4 高效使用函数
    5. 3.5 实现递减计数循环
    6. 3.6 使用 __even_in_range() 内建函数
    7. 3.7 volatile 关键字
  7. 4示例
    1. 4.1 优化级别
    2. 4.2 LTO
    3. 4.3 运行时模型选项
  8. 5总结
  9. 6参考资料

优化级别

优化级别标志可配置为:以牺牲性能为代价,偏向更小的编译器生成代码体积;或以牺牲代码体积为代价,偏向更佳性能。需要注意的是,由于优化算法和代码生成方法各不相同,编译器的选择会直接影响代码体积。

表 2-1 优化级别
代码优化级别
IDE Keil O0 O1 O2 O3 Ofast Os balanced Oz image size Og
CCS O0 O1 O2 O3 Ofast Os Oz /
IAR None Low Medium High High-speed High-Balanced High-Size /
表 2-2 优化摘要
优化级别选项 优化摘要 执行的优化
-O0 不执行任何优化。建议在需要最大限度可调试性时使用此选项。 无
-O1、-O 启用受限的优化。在代码体积与可调试性之间提供良好的折衷。
  • 控制流简化
  • 将连续的 icmp 合并为 memcmp
  • memcpy/memset/memcmp 内联
  • 常量提升
  • 部分内联对库函数的调用
  • 对 always_inline 函数进行内联
  • 全局变量合并
  • 合并不相交的栈槽
  • 循环强度削减
  • 循环不变量代码运动
  • 通用子表达式消除
  • 死参数消除
  • 机器码下沉
  • 窥孔优化
  • 尾部谓词化
  • 尾部复制
  • 加载/存储优化
  • 简单寄存器合并
  • 复制传播
  • 条件常量传播
  • 被调用值传播
  • 控制流优化
  • If 转换
  • Thumb2 指令体积缩减
  • 死代码消除
  • 循环向量化
  • printf 函数特化
  • 小型 memcpy/memset 函数特化
  • 有条件地消除死库调用
  • 循环旋转
  • 循环展开
-O2 启用大多数优化。禁用某些可能导致编译器生成代码体积增大的优化。
  • 执行所有 (-O1) 优化,另加:
  • 函数集成/内联
  • 指令推测
  • 值传播
  • 跳转线程化(非 DFA)
  • 尾调用消除
  • 合并的加载/存储移动
  • 全局值编号
  • 内存依赖分析
  • 死存储消除
  • 超字级并行 (SLP) 向量化
  • 合并冗余指令
  • 死全局消除
  • 全局重复常量合并
  • 快速 memcpy/memset 函数特化
  • 将循环目标边界对齐到 16 字节 (Cortex-R4/R5)
-O3 启用 -O2 可用的所有优化,以及另一些可能增大编译器生成代码体积的优化。建议在优化性能时使用此选项,但这很可能会增大代码体积。
  • 执行所有 (-O2) 针对速度调优的优化,另加:
  • 用受支持的内建函数替换函数
  • 附加的别名分析和循环优化
  • 激进函数内联
  • 调用点拆分
  • 将“按引用”传递的参数提升为标量
  • 合并基于模式的表达式
-Og 启用受限的优化,同时保持可调试性。启用 -O1 可用的所有优化,并附加 -O2 中的部分优化。
  • 执行所有 (-O2) 优化,但禁用以下项:
  • 不进行循环向量化
  • 除 always_inline 函数外不进行函数内联
  • 不进行指令推测
  • 不进行跳转线程化
  • 不进行值传播
  • 不进行尾调用消除
  • 不进行合并的加载/存储移动
  • 不进行全局值编号
  • 不进行内存依赖分析
  • 不进行超字级并行 (SLP) 向量化
  • 不进行死全局消除
  • 不进行全局重复常量合并
-Os 启用 -O2 可用的所有优化,外加旨在减小代码体积的附加优化。与 -Oz 选项相比,-Os 选项会避免那些可能损害性能的代码体积优化。
  • 执行所有 (-O2) 针对代码体积调优的优化,另加:
  • 先前已启用、针对代码体积调优的优化
  • 小型 memcpy/memset 函数特化
  • 最小化 memcpy/memset/memcmp 内联
  • 不有条件地消除死库调用
  • 不将循环目标边界对齐到 16 字节 (Cortex-R4/R5)
-Oz 启用 -O2 可用的所有优化,外加旨在减小代码体积的附加优化。与 -Os 选项相比,-Oz 选项会执行额外的代码体积优化,而这些优化可能损害性能。若以减小代码体积为优先,建议使用此优化设置。
  • 执行所有 (-Os) 优化,另加:
  • 机器码外提
  • 不进行循环向量化
  • 减少对代码体积有影响的激进优化
  • 不将循环目标边界对齐到 16 字节 (Cortex-R4/R5)
-Ofast 已弃用此选项。此选项启用 -O3 可用的所有优化,外加额外的激进优化,但这些优化不保证严格符合语言标准。若需要此行为,建议将 -O3 选项与 -fast-math 结合使用。
  • 执行所有 (-O3) 优化
  • 额外的激进优化

关于不同优化级别下汇编代码影响的示例,请参阅 TI Arm Clang 编译器工具用户指南。