首页 > 解决方案 > 如何防止 clang/llvm 将局部变量编译为全局变量?

问题描述

我有一个 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 编译为立即值吗?

谢谢。

标签: cgccclangllvm

解决方案


推荐阅读