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