首页 > 解决方案 > GCC 忽略 -funroll-loop 参数

问题描述

GCC 只是忽略-funroll-loops-funroll-all-loops选项。

这是一个代码示例

#include <stdio.h>

void NOT_WORK_1(char* arg)
{
    for(int i = 0; i < 4; ++i) {
        printf("%s", arg);
    }
}

__attribute__((optimize("unroll-loops")))
void NOT_WORK_2(char* arg)
{
    for(int i = 0; i < 4; ++i) {
        printf("%s", arg);
    }
}

#pragma GCC push_options
#pragma GCC optimize ("unroll-loops")
void NOT_WORK_3(char* arg)
{
    for(int i = 0; i < 4; ++i) {
        printf("%s", arg);
    }
}
#pragma GCC pop_options

void WORKS_1(char* arg)
{
    #pragma GCC unroll(4)
    for(int i = 0; i < 4; ++i) {
        printf("%s", arg);
    }
}

编译的屁股gcc -O3 -funroll-loops。ASM 输出

.LC0:
        .string "%s"
NOT_WORK_1:
        push    rbp
        mov     rbp, rdi
        push    rbx
        mov     ebx, 4
        sub     rsp, 8
.L2:
        xor     eax, eax
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        sub     ebx, 1
        jne     .L2
        add     rsp, 8
        pop     rbx
        pop     rbp
        ret
NOT_WORK_2:
        push    rbp
        mov     rbp, rdi
        push    rbx
        mov     ebx, 4
        sub     rsp, 8
.L7:
        xor     eax, eax
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        sub     ebx, 1
        jne     .L7
        add     rsp, 8
        pop     rbx
        pop     rbp
        ret
NOT_WORK_3:
        push    rbp
        mov     rbp, rdi
        push    rbx
        mov     ebx, 4
        sub     rsp, 8
.L11:
        xor     eax, eax
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        sub     ebx, 1
        jne     .L11
        add     rsp, 8
        pop     rbx
        pop     rbp
        ret
WORKS_1:
        push    rbp
        mov     rsi, rdi
        mov     rbp, rdi
        xor     eax, eax
        mov     edi, OFFSET FLAT:.LC0
        call    printf
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        call    printf
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        call    printf
        mov     rsi, rbp
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax
        pop     rbp
        jmp     printf

如果您查看代码,您会发现我已经尝试过:

GCC 有特殊的pragma,但它仅适用于 GCC >= 8,但我必须使用 GCC 7.5.0 编译,其中不可用。有什么方法可以强制旧的 GCC 表现得像 GCC 一样#pragma GCC unroll N

标签: c++cgcc

解决方案


推荐阅读