Как предотвратить clang / llvm компилировать локальные переменные в глобальные? - PullRequest
0 голосов
/ 02 мая 2018

У меня есть код C:

int64_t sample_max(int64_t *beg, int64_t len) {
    if (len == 0) {
        return 0;
    }
    int64_t max = 0x8000000000000000;
    int64_t *end = beg + len;
    while (beg < end) {
        if (*beg > max) {
            max = *beg;
        }
        beg++;
    }
    return max;
}

и завершите его с помощью лязга:

clang -S -target x86_64-unknown-none -masm=intel -mno-red-zone -mstackrealign -mllvm -inline-threshold=1000 -fno-asynchronous-unwind-tables -fno-exceptions -fno-rtti -O3 -fno-builtin -ffast-math -mavx2 lib/sample.c -o lib/sample_avx2.s

и я обнаружил, что clang / llvm выполняет локальные переменные "max = 0x8000000000000000" до глобальных:

vpbroadcastq    ymm0, qword ptr [rip + .LCPI1_0]
    vmovdqa ymm3, ymm0
    vmovdqa ymm2, ymm0
    vmovdqa ymm1, ymm0

....

.LCPI1_0:
    .quad   -9223372036854775808    # 0x8000000000000000
    .section    .rodata,"a",@progbits
    .align  32

Как предотвратить компиляцию локальных переменных clang / llvm в глобальные? Можем ли мы скомпилировать 0x8000000000000000 в непосредственные значения?

Спасибо.

...