如果循环完全不符合软件流水线的要求,则会显示以下消息:
- 错误的循环结构。此错误非常罕见,可能源于以下原因:
- 在 C 代码内循环中插入了 asm 语句
- 被用作线性汇编优化器的输入的并行指令
- 复杂的控制流,例如GOTO语句和中断
- 循环包含调用。有时,编译器可能无法内联处于循环中的函数调用。由于编译器无法内联函数调用,因此无法对循环进行软件流水化处理。
- 太多指令。到软件流水线的循环中有太多指令。
- 禁用软件流水线。软件流水已被命令行选项禁用,例如,当使用 --disable_software_pipeline 选项、不使用 --opt_level=2(或 -O2)或 --opt_level=3(或 -O3)选项或使用 --opt_for_space=2 或 --opt_for_space=3 选项时。
- 未初始化行程计数器。行程计数器可能未设置为初始值。
- 抑制以防止代码扩展。由于 --opt_for_space=1 选项,软件流水线可能被抑制。当使用 --opt_for_space=1 选项时,在不太乐观的情况下会禁用软件流水线以减小代码大小。如需启用流水线,请使用 --opt_for_space=0 或完全省略 --opt_for_space 选项。
- 循环携带的依赖性约束太大。如果循环具有复杂的循环控制,请根据节 4.6.3.2中的建议尝试使用 --speculate_loads。
- 无法识别跳变计数器。循环行程计数器无法被识别或在循环体中使用不当。