RRVM 编译器优化-llvm gep 指令消除

Featured image

中端到后端 GEP 消除

注:这是在当时编译器比赛(全国大学生计算机系统能力大赛-编译系统设计赛)实现这个优化 pass 之前写的设计思路文档。big credit to Fuyuki
目的是消除冗余的 GEP 指令 项目仓库,当时比赛最后一天下午本来想实现这个就下班,但是当时突发线上测试超时的情况,我们回退了仓库版本(但是优化基本都还是全的),所以这个 pass 没有实现,但是思路还是很有参考价值的

思路

%1 = getelementptr i32, ptr @Ptr, i64 0
%2 = getelementptr i32, ptr @Ptr, i64 1

之后 %2 只在 store 的时候被读取,且 store_offset + ( %2 相对于 %1 的 offset) 在12位以内,就可以不用产生 %2 而是把 store 的 offset(%2) 改成 (offset + ( %2 相对于 %1 的 offset))(%1) 来访存

从而减少了指令,而且可以减轻寄存器分配/指令调度的压力

条件