<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">