<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/96488>96488</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Regression: large integer division lowers to very slow code
</td>
</tr>
<tr>
<th>Labels</th>
<td>
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
mlugg
</td>
</tr>
</table>
<pre>
Downstream issue: https://github.com/ziglang/zig/issues/20340
In the Zig compiler, we have observed incredibly slow compilation and execution of some arithmetic operations on large integers when compiling via LLVM. Zig's self-hosted x86_64 code generation backend, which does not currently apply any optimization passes, is able to produce significantly faster code then our LLVM backend. This issue also reproduces when compiling equivalent code with Clang.
It appears that this regressed in LLVM 16 as a result of 6d13b80 (https://reviews.llvm.org/D130079). Zig 0.10.1, which uses LLVM 15, exhibits much faster compilation and code generation.
This likely contributes to #82196.
Minimal reproduction:
```
target triple = "x86_64-unknown-linux-gnu"
@large_integer = unnamed_addr global i16384 15132498712934891283498721348971234987123498712349871234987123498712349871234987123498712349999999999999999999999999999999999999999999999999999999999999999900000000000000000000000000000000000000000000000000000000000000000000000000000000012345987123498712349871234987123498712349871234987123498734987234598723459872345987456398734569873459872394859238470000000001151324987129348912834987213489712349871234987123498712349871234987123498712349871234987123499999999999999999999999999999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000000000000000000000000000000123459871234987123498712349871234987123498712349871234987349872345987234598723459874563987345698734598723948592384700000000011513249871293489128349872134897123498712349871234987123498712349871234987123498712349871234999999999999999999999999999999999999999999999999999999999999999990000000000000000000000000000000000000000000000000000000000000000000000000000000001234598712349871234987123498712349871234987123498712349873498723459872345987234598745639873456987345987239485923847000000000115132498712934891283498721348971234987123498712349871234987123498712349871234987123498712349999999999999999999999999999999999999999999999999999999999999999900000000000000000000000000000000000000000000000000000000000000000000000000000000012345987123498712349871234987123498712349871234987123498734987234598723459872345987456398734569873459872394859238470000000001151324987129348912834987213489712349871234987123498712349871234987123498712349871234987123499999999999999999999999999999999999999999999999999999999999999999000000000000000000000000000000000000000000000000000000000000000000000000000000000123459871234987123498712349871234987123498712349871234987349872345987234598723459874563987323489712349871234987123498712349871234987123498712349871234987234598723459872345987234598723459872549872345987234597234598723459872345987234598723459872345987234598723459872345987234598723459872345987234598723459182734987123498712349871234987123498712349871234987123498712349871234987123498712349871234987123498712349871234987123498712349871234987123498712349871234987123498712349871234987124987123498712349871234987234598723459873465987345987342598723459872345987234598723459875927234598723459872345987234598723459872345987234598723459872345987234598723459872345987234598723459872345987234598734569873469873456987345698734569873469873469873456987435698743569873456987345698374569867439873456934659873469837451513249871293489128349872134897123498712349871234987123498712349871234987123498712349871234999999999999999999999999999999999999999999999999999999999999999990000000000000000000000000000000000000000000000000000000000000000000000000000000001234598712349871234987123498712349871234987123498712349873498723459872345987234598745639873456987345987239485923847000000000115132498712934891283498721348971234987123498712349871234987123498712349871234987123498712349999999999999999999999999999999999999999999999993475989994985849876091380111183754975279343, align 16
define dso_local i32 @main() #0 {
br label %1
1:
%2 = phi i64 [ 0, %0 ], [ %5, %1 ]
%3 = load i16384, ptr @large_integer, align 16
%4 = udiv i16384 %3, 100
store i16384 %4, ptr @large_integer, align 16
%5 = add i64 %2, 1
%6 = icmp eq i64 %5, 500
br i1 %6, label %7, label %1
7:
ret i32 0
}
attributes #0 = { nounwind }
```
Building this IR on an AMD Ryzen 7 7840HS takes around 1.2s, and executing it takes around 0.5s. Equivalent Zig code compiled using Zig's self-hosted x86_64 code generation backend executes in a negligible amount of time (~4ms), making this naive lowering at least 100x faster.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWE1v47wR_jX0ZRCDIvV58CFZN-gLvHvZFj30ElDiWGJDkV6SspM99LcXpBR_JEW7u2mxhzdBoDHJ4Xw8MxIwj_Be9QZxQ4o7UmxXYgqDdZtRT32_aq183mzt0fjgUIygvJ-Q8FsYQth7wm8JuyfsvldhmNp1Z0fC7r-pXgvTz78Iu093PGH3jPKcErol9HZ-_mYgDAh_Vz10dtwrjY6wT3BEGMQBwbYe3QElKNM5lKrVz-C1PS7KIihrQBgJ-ITdlFZ2B96OCMKpMIwYVAd2jy6perAGtHA9gjIBe3QejgOaxZwyPRyUgN9__9vndYyJsMqDR727GawPKOGpLh_KHDorEXo0i1loRfeIRqbIB9UNIC16MDZANzmHJuhnEPt9fJpnsPugRvVtvroX3kdoPoHyIFqNECzsnZVThxDLonaqE8nCTviAbnYeYtR2cinWF_9r-Oug_FwhENpbcLiYepMnfp3UQWg0YTZ4VGGAT7Fq66v6hBg4CuchDCJAiA4c9g69T2WZA8hKEB4EOPSTDrEGpcx4W1MgrL5uFIcHhUe_1vowrq2L7bHNOKVVQ1iTUAe6zug6O6M5efSLnyLu4tOgWhU8jFM3nGG57ohXNbrKKsGk1SPqZ-isCU61U0AfoSeM1yxryiv9z8qoUegTnNFgTGhWKenyn5YhtleA4NReIxC-BcLY3Dc3k3k09mhutDLT001vJsLYpR-S09SdD0t3puuTMWJE-SCkdNBr2woNKit5nUNWZJzlTV1lrOF53WSs5nHJsriqMsbnw58R7_2j_-u_GFXxM-nMkMyXr0VelDwpFOUs0lGT10XDeJ1XZ98fSH8g_YH0B9IfSP9KpNm74Pq3pl-J4rXid916j8hqVr2j_L9CfCfCPC-L04vBc_bf4Cga9n9H-22My8tbXr3J5duji62cX4ordV4lUVb56dNwgmE5_vgY_AE_uzyviqZumiZv6qKOVkraZLymWZZlNa-KvKkKVjU853HCEVr1BrLycjiQuFMGQXr7oG0XhwDOgOR0FMoQVhPWxOGFAqnu5gsArQMtWtRAWJHNm9lpbombLE0Y-0GBKnMgxR3Q6J6wggIptul3cRfXxbKfpf3FPmEFTxa0FXIZSqLePjh4Pcu8TSvdz-cZR6rDy1ATjUbljNIXPR-sw4vzH3VSJCdCyjlNVrDk4EKjTBqqG_eAX1-0Us7FOYzWgcqSdjw4IVtdrRar1RlncBhSsV6Yj2p7WVcRTvPnXL84MlZ3YOxkjspIOOtfT5rz825SWsaJPo3mv32BNP_C7ectfHn-hgYqqOqc_vkvEMQjehDOTkZCtmaJdbggT0wPKlxr0XXh1_CnM1cwEzUSX9gaCZOPF3-cLFm8ogdlQIDBXqtetRpBjHYyiUQIakQgrP5nPnrCmhjvKB5PyRqhDgjaHtHFPRFAo_Ahds7TQgusV3LDZcMbscJNVmUNi-8aXQ2boipom9Mu61DWu5blO1pXsu1qrMtd3jQrtWGU5bRkecaLhtI1LwTDlrOq5hWTXJKc4iiUPlEZq8S8bJoyr-tVagj_Qqm5TVS6aafex55VPpwZkFVQQePmy8yqzNTCNUsFUh1UPJmTTUTFAd2JC5O4mpze_AdGLvpaxM3e2X9gFy55uTnkw4b9KwAA__8PMf_s">