增强别名分析能力,有效识别并排除非循环体中相邻数组元素访问的虚假数据依赖关系,促成相邻元素的连续操作被安全矢量化,提升代码执行效率。
需开启 -O2 或以上优化等级,同时增加编译选项 -falias-analysis-expand-ssa。
测试用例如下:
1 2 3 4 5 6 7 8 9 10 11 | void f(double *p, long i) { p[i+0] += 1; p[i+1] += 1; } void g(double *p, long i) { double *q = p + i; q[0] += 1; q[1] += 1; } |
测试命令:
1 | gcc -O2 -fdump-tree-slp-details -falias-analysis-expand-ssa test.c -S -o test.s |
选项未打开时,对于函数f,编译器认为p[i+0]和p[i+1]互为别名,存在依赖关系,矢量化失败。选项打开后,矢量化成功