<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61489>61489</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
suboptimal optimization for expr1 * const1 + const2 to x86_64's `lea` instruction
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
KisaragiEffective
</td>
</tr>
</table>
<pre>
**clang version**: 15.0.0
**arch**: x86\_64
**reproducible link**: https://godbolt.org/z/ceM36W1ef
C:
```c
int maybe_lea_2(int base) {
return base * 2 + 0x01020304;
}
int maybe_lea_3(int base) {
return base * 3 + 0x01020304;
}
int maybe_lea_5(int base) {
return base * 5 + 0x01020304;
}
int maybe_lea_9(int base) {
return base * 9 + 0x01020304;
}
```
suboptimal asm:
```asm
maybe_lea_2: # @maybe_lea_2
lea eax, [rdi + rdi]
add eax, 16909060
ret
maybe_lea_3: # @maybe_lea_3
lea eax, [rdi + 2*rdi]
add eax, 16909060
ret
maybe_lea_5: # @maybe_lea_5
lea eax, [rdi + 4*rdi]
add eax, 16909060
ret
maybe_lea_9: # @maybe_lea_9
lea eax, [rdi + 8*rdi]
add eax, 16909060
ret
```
suboptimal IR:
```llvm
define dso_local i32 @maybe_lea_2(i32 noundef %0) local_unnamed_addr #0 !dbg !9 {
call void @llvm.dbg.value(metadata i32 %0, metadata !15, metadata !DIExpression()), !dbg !16
%2 = shl nsw i32 %0, 1, !dbg !17
%3 = add nsw i32 %2, 16909060, !dbg !18
ret i32 %3, !dbg !19
}
define dso_local i32 @maybe_lea_3(i32 noundef %0) local_unnamed_addr #0 !dbg !20 {
call void @llvm.dbg.value(metadata i32 %0, metadata !22, metadata !DIExpression()), !dbg !23
%2 = mul nsw i32 %0, 3, !dbg !24
%3 = add nsw i32 %2, 16909060, !dbg !25
ret i32 %3, !dbg !26
}
define dso_local i32 @maybe_lea_5(i32 noundef %0) local_unnamed_addr #0 !dbg !27 {
call void @llvm.dbg.value(metadata i32 %0, metadata !29, metadata !DIExpression()), !dbg !30
%2 = mul nsw i32 %0, 5, !dbg !31
%3 = add nsw i32 %2, 16909060, !dbg !32
ret i32 %3, !dbg !33
}
define dso_local i32 @maybe_lea_9(i32 noundef %0) local_unnamed_addr #0 !dbg !34 {
call void @llvm.dbg.value(metadata i32 %0, metadata !36, metadata !DIExpression()), !dbg !37
%2 = mul nsw i32 %0, 9, !dbg !38
%3 = add nsw i32 %2, 16909060, !dbg !39
ret i32 %3, !dbg !40
}
declare void @llvm.dbg.value(metadata, metadata, metadata) #1
attributes #0 = { mustprogress nofree norecurse nosync nounwind readnone willreturn uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willreturn }
```
optimal asm:
```asm
maybe_lea_2: # @maybe_lea_2
lea eax, [2*rdi + 16909060]
ret
maybe_lea_3: # @maybe_lea_3
lea eax, [rdi + 2*rdi + 16909060]
ret
maybe_lea_5: # @maybe_lea_5
lea eax, [rdi + 4*rdi + 16909060]
ret
maybe_lea_9: # @maybe_lea_9
lea eax, [rdi + 8*rdi + 16909060]
ret
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysmEFv4rwWhn-N2Vgg5zgJyYJFWwZpdHU3d3OXyIkPwd84NrKdlplf_8kJ0EDbodBWCIx9js9rP7H1FuG9agzigmSPJFtORBe21i3-o7xwolE_Nhusg3rGSWXl7wWBBwIPtRamoc_ovLJm6CL8gSbZjM0YYUvCHoZe4ert6_i-yEn2tM7TcYjDnbOyq1WlkWplfr3Gb0PYecIfCKwIrBorK6vDzLqGwOoPgVWN_-X5_xPcHObr359iwvA9Z8OrHr4rE2grfle41ijWQKCIPZXwSKCkZP44hFFKqcPQOdOPUQIPFCiBR8r2LGHAOEsJPwST-XJc_LwEv6UEv6tEdkuJ7K4S5S0lyusljlTGFX1X2V1QrdBU-PYtwdjZ94z58V7BR38EOCUpGycMqjWKPgDFnsATJdmjk6qX7aQi2fJ1cfFPSDmOTvKSlewoPi7_Uhe_VRc_LxjlvZUG8aR8h7zsVnnZZ-Sl3yWvvFVe-Rl5xdfkXXtkf_7v7ROr9XM7Dpe4UQap9HatbS00VRwun08oYqexnZG4oQQyFs9bH77ujBEtyrWQ0sVdYJRAIqsmfpydyVpoTZ-tknH2qGImq2b2LHSHBIoWg5AiiKF8X-GJnjoJJEl22bP8-WO_c-iHu74gUPavp5GAJD9WJ5ABJXxJ_VZT41_O6iQXWfNRFu-zIpBRFpxROU8ujskOwzGeX8SU715v11Hwu1EA-0YWAHewAP6GRdu9ZXGxVZB-gQVk11lAfieL7H4W8-9kUd7BgrNPscguspIvsOBwnQXnd7Io72bB029kwfN7WMw_xeIyq_gKi_I6i5R9wKLWwuH1TRrvxHk7WrHjozS8ixCcqrqA_oCHLyMV2nY-7Jxt4gZSYzcOkRrrsO6cjy3_29Q98xdlJHUopLEG6YvS-uD_upcgon8nABsnWpzurDIBHQEgfEkAYgKBuAHQKjPV2Ag9fcY6WDd9UTJsT5HsEGbsNDix2ynTTFsxCgiuO07lg6h_TXfOhmGmqtts0E29-oOn8OIQG4RrMEzrXXca2hf5NE_PxzcoQufQn4IIPNb7gsATgcfN3ruh1bb7oeGjKT40YGjti_lxzs7gWcUGDTpV98NH4OdUkhMVEw-VrkT965XJByT8DutOi4HBCMvfTfc3Ou4bzPbByfa-7HRsLo3ZR776M-aZvuvt_172NqP8JY9888LLdxf-ju99f-HF5xZ-Aj-RCy5LXooJLpJ8XiZJnpRssl0UHFk15yhzWWMiOaYplnNRActYiqycqAUw4IwnBctYmbHZPIc8nVeJQCZZLuckZdgKpWf9bWZdM1Hed7jIk7QoJ1pUqH3_MwSAwRfaD8ajky0nbhFzplXX-HgbKh_86yxBBY2LkSHvP9UfEZQ1dGMdxf3OJf0_qLU1PiT9bvRNoMHSfZGv40Uw9zRadxQkZ1QZH1xXxzkmndOLi18jVNh21ay2LYFVb_aHj3gb_YN1ILDq9XsCq359_wYAAP__dS-1UA">