如果在编译时它的迭代次数未知,GCC如何展开循环呢?

PC *_*ite 13 c optimization gcc loop-unrolling

当我找到选项时,我正在阅读GCC优化选项-funroll-all-loops.

其描述如下:

展开所有循环,即使在输入循环时它们的迭代次数不确定.这通常会使程序运行得更慢.'-funroll-all-loops'意味着与'-funroll-loops'相同的选项

如果编译时迭代次数未知,编译器如何展开循环?编译器是否需要此信息才能展开它?它产生了哪些相应的C代码,如果它通常使程序运行得更慢,在什么情况下这可能是有用的?

Sha*_*our 3

如果这通常会使程序运行得更慢,那么在什么情况下这会很有用?

好吧,他们假设如果您选择此选项,您就知道自己在做什么,如果不知道,则不应使用此选项。

gcc 会做什么,我使用了这个示例程序:

#include <stdio.h>

void f(int j )
{
  for( int k = 0; k < j; ++k )
  {
    printf( "%d\n", k ) ;
  }
}
Run Code Online (Sandbox Code Playgroud)

并用 godbolt 对其进行了测试,它根据剩余的迭代次数生成了一个跳转表(查看实时结果):

cmpl    $1, %ebp
movl    $1, %ebx
je  .L1
testl   %r12d, %r12d
je  .L27
cmpl    $1, %r12d
je  .L28
cmpl    $2, %r12d
je  .L29
cmpl    $3, %r12d
je  .L30
cmpl    $4, %r12d
je  .L31
cmpl    $5, %r12d
je  .L32
cmpl    $6, %r12d
je  .L33
Run Code Online (Sandbox Code Playgroud)