首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gcc4不展开这个循环?

为什么gcc4不展开这个循环?
EN

Stack Overflow用户
提问于 2012-11-12 01:06:24
回答 1查看 1.1K关注 0票数 1

gcc 4.4.6文档中声明:

-所有循环:打开所有循环,即使当输入循环时它们的迭代次数不确定。

我正在编译以下代码:

代码语言:javascript
复制
int unroll(){
  int i = 0;
  int array[1000];
  do {
    use(i,array);
    i++;
  }while(i<1000);
  return(0);
}

void use(int i, int *array){
   int x = i*5;
   array[i] = x;
}

...once具有funroll-all-loops优化,一次没有:

代码语言:javascript
复制
OPT = -funroll-all-loops
NOOPT = -O0

然后,我使用diff来比较每个程序集的代码(使用-S -fverbose-asm生成)。

生成的代码是相同的。

尝试将循环更改为do while;调整循环计数器(最多为100);更改循环正文中的语句。

我错过了什么?为什么没有展开这个循环?

更新

Nikos C建议使用--param max-unroll-times=N提高循环登记参数,其中N是上限。虽然这是一个明智的建议,但并没有改变人们的行为。我还将循环迭代降低到只有10次,还更新了代码,使其实际上“做”了一些事情,没有改变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-12 02:02:20

因为您已经禁用了"OPT“情况下的所有其他优化,所以您告诉编译器展开所有循环,然后拒绝他这样做,比如循环归纳等等。

代码语言:javascript
复制
NOOPT = -O2
OPT = -O2 -funroll-all-loops

如果我翻译代码片段(稍微修改为一个外部函数,以避免任何内联和死代码消除)

代码语言:javascript
复制
void use(int i, int *array);

int unroll(){
  int i = 0;
  int array[1000];
  do {
    use(i,array);
    i++;
  }while(i<1000);
  return(0);
}

gcc -O2 -funroll-all-loops test.c -o test2.o -c中,生成的对象代码被展开了八次:

代码语言:javascript
复制
  0000000000000000 <unroll>:
  0:   53                      push   %rbx
  1:   31 db                   xor    %ebx,%ebx
  3:   48 81 ec a0 0f 00 00    sub    $0xfa0,%rsp
  a:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
  10:   89 df                   mov    %ebx,%edi
  12:   48 89 e6                mov    %rsp,%rsi
  15:   e8 00 00 00 00          callq  1a <unroll+0x1a>
  1a:   8d 7b 01                lea    0x1(%rbx),%edi
  1d:   48 89 e6                mov    %rsp,%rsi
  20:   e8 00 00 00 00          callq  25 <unroll+0x25>
  25:   8d 7b 02                lea    0x2(%rbx),%edi
  28:   48 89 e6                mov    %rsp,%rsi
  2b:   e8 00 00 00 00          callq  30 <unroll+0x30>
  30:   8d 7b 03                lea    0x3(%rbx),%edi
  33:   48 89 e6                mov    %rsp,%rsi
  36:   e8 00 00 00 00          callq  3b <unroll+0x3b>
  3b:   8d 7b 04                lea    0x4(%rbx),%edi
  3e:   48 89 e6                mov    %rsp,%rsi
  41:   e8 00 00 00 00          callq  46 <unroll+0x46>
  46:   8d 7b 05                lea    0x5(%rbx),%edi
  49:   48 89 e6                mov    %rsp,%rsi
  4c:   e8 00 00 00 00          callq  51 <unroll+0x51>
  51:   8d 7b 06                lea    0x6(%rbx),%edi
  54:   48 89 e6                mov    %rsp,%rsi
  57:   e8 00 00 00 00          callq  5c <unroll+0x5c>
  5c:   8d 7b 07                lea    0x7(%rbx),%edi
  5f:   48 89 e6                mov    %rsp,%rsi
  62:   83 c3 08                add    $0x8,%ebx
  65:   e8 00 00 00 00          callq  6a <unroll+0x6a>
  6a:   81 fb e8 03 00 00       cmp    $0x3e8,%ebx
  70:   75 9e                   jne    10 <unroll+0x10>
  72:   48 81 c4 a0 0f 00 00    add    $0xfa0,%rsp
  79:   31 c0                   xor    %eax,%eax
  7b:   5b                      pop    %rbx
  7c:   c3                      retq   
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13337182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档