为什么LLVM IR没有实现优化除以常数?

3
根据下面所给的源代码和我的实验,LLVM实现了一种将除法转换为乘法和右移的变换。
在我的实验中,这个优化是在后端应用的(因为我看到的是X86汇编代码上的变化,而不是LLVM IR)。
我知道这种变化可能与硬件有关。在我看来,在某些硬件上,乘法和右移可能比单个除法运算更昂贵。因此,这种优化是在后端实现的。
但是当我搜索DAGCombiner.cpp时,我看到了一个名为isIntDivCheap()的函数。在该函数的定义中,有一些注释指出,决定成本高低取决于基于代码大小还是速度进行优化。
也就是说,如果我始终基于速度优化代码,那么除法将被转换为乘法和右移。相反,除法将不会转换。
另一方面,单个除法总是比乘法和右移慢,或者函数会做更多的事情来确定成本。
那么,既然单个除法总是比较慢,为什么不在LLVM IR中实现这种优化呢?
1. https://llvm.org/doxygen/DivisionByConstantInfo_8cpp.html

1
你能说出当除法比乘法加移位更便宜时的架构名称吗? - Anton Korobeynikov
1个回答

1
有趣的问题。根据我在面向高层次综合(HLS)编译器的LLVM前端工作经验,回答你的问题在于理解LLVM IR以及LLVM IR阶段优化的限制/范围。
LLVM中间表示(IR)是连接前端和后端的支柱,允许LLVM解析多种源语言并生成代码到多个目标。因此,在LLVM IR阶段,通常关注的是意图而不是全面的性能优化。
除数常量优化非常注重性能。并不是说IR级别的优化与性能无关或者没有什么关系,但是在IR阶段存在内在的优化限制,除数常量就是其中之一。
更准确地说,IR在低级机器细节和指令方面不够深入。如果你观察LLVM IR上的优化,通常由分析和转换传递组成。据我所知,你在IR阶段看不到除数常量传递。

1
谢谢您的回复! - Shane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接