提问人:Daisy G 提问时间:11/1/2023 最后编辑:Peter CordesDaisy G 更新时间:11/2/2023 访问量:54
使用 gcc -O3 优化时,为什么循环索引的类型会影响 gcc 的内部 GIMPLE 向量常量(但不会影响最终的 asm)?
With gcc -O3 optimization, why does the loop index's type affect gcc's internal GIMPLE vector constants (but not the final asm)?
问:
我创建了一个结构数组,这是我的源代码。
#include <stdio.h>
#include <stdlib.h>
#define N 256
typedef struct arc {
int num;
} arc_t;
typedef double cost_t;
typedef struct basket {
arc_t *a;
cost_t cost;
} BASKET;
static BASKET basket[N];
static BASKET *perm[N];
int main() {
__asm__ ("########");
int j;
for ( j = 0; j < N; j++)
{
perm[j] = &(basket[j]) ;
}
__asm__ ("########");
printf("%d\n",perm[1]->a->num);
return 0;
}
至此,我定义了一个整数变量“j”。使用命令打印中间文件时,在我的标记位置(asm (“########”);)生成的中间文件中,有以下内容:gcc -O3 p.c -fdump-tree-vect-details -fopt-info-vec -S -mavx2
<bb 2> [local count: 10737416]:
__asm__ __volatile__("########");
vect_cst__13 = { 8, 8, 8, 8, 8, 8, 8, 8 };
vect_cst__22 = { 16, 16, 16, 16, 16, 16, 16, 16 };
_27 = (long unsigned int) &basket;
vect_cst__28 = {_27, _27, _27, _27};
但是,当我定义“long j”时,它会产生以下中间文件:
<bb 2> [local count: 10737416]:
__asm__ __volatile__("########");
vect_cst__14 = { 4, 4, 4, 4 };
vect_cst__19 = { 16, 16, 16, 16 };
_23 = (long unsigned int) &basket;
vect_cst__24 = {_23, _23, _23, _23};
这是差异的一部分,但最让我困惑的是,在 Peter Cordes 的帮助下,我们推测中间代码的差异可能是由于 int 和 long 数据类型的不同大小造成的。
但是它只是一个数组索引,那么为什么它的数据类型会产生这种影响呢?我在 和 的两种情况下都打印了“basket[j]”的前四个地址,它们是相同的。gcc 版本为 10.3.0j
int j
long j
由于此时中间文件存在差异,我怀疑前端编译器可能应用了不同的优化。我应该在哪里查找与此相关的信息?GCC 如何分析结构数组?
答: 暂无答案
评论
j
&basket[j]
arr[j] = j;
sum += j;
j
j
j
arr[j] = j
&basket[j]
basket + j
int j
int64_t j
j