| Issue |
61489
|
| Summary |
suboptimal optimization for expr1 * const1 + const2 to x86_64's `lea` instruction
|
| Labels |
new issue
|
| Assignees |
|
| Reporter |
KisaragiEffective
|
**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
```
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs