gpt4 book ai didi

c - 如何让 Clang 优化掉无用的数组副本

转载 作者:太空宇宙 更新时间:2023-11-03 23:54:09 25 4
gpt4 key购买 nike

考虑以下 C99 代码(使用 alloca 扩展。)

    void print_int_list(size_t size, int x[size]) {
int y[size];
memcpy(y, x, size * sizeof *x);

for (size_t ii = 0; ii < size; ++ii)
printf("%i ", y[ii]);
printf("\n");
}

void print_int_list_2(size_t size, int x[size]) {
for (size_t ii = 0; ii < size; ++ii)
printf("%i ", x[ii]);
printf("\n");
}

void print_int(int x) {
int * restrict const y = alloca(sizeof x);
memcpy(y, &x, sizeof x);
printf("%d\n", *y);
}

void print_int_2(int x) {
printf("%d\n", *x);
}

在代码中,print_int 被优化为与 Clang 版本 3.0 上的 print_int_2 完全相同,但函数 print_int_list 并未优化为 print_int_2。相反,保留无用的数组副本。

这种事情对大多数人来说不是问题,但对我来说却是。我打算通过生成与 Clang 一起使用的 C 代码来制作编译器原型(prototype),(然后将其直接移植到 LLVM),我想生成极其愚蠢、简单但显然正确的代码,并让 LLVM 完成代码优化的工作.

我需要知道的是如何让 Clang 优化掉无用的数组副本,以便将像 print_int_list 这样的愚蠢代码优化成像 print_int_list_2 这样的代码。

最佳答案

首先,我会更加小心。在您拥有的两种情况之间有一个步骤,即固定大小的数组。我认为现在的编译器可以跟踪数组组件,这些组件也使用编译时间常量进行索引。

另外不要忘记 memcpy 将您的数组 转换为指向第一个元素的指针,然后使它们成为 void*。所以它丢失了所有信息。

所以我会去

  • 尝试固定大小的数组
  • 不使用memcpy,而是使用赋值循环

并尝试从那里失去约束。

关于c - 如何让 Clang 优化掉无用的数组副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12381727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com