Missed Optimization: Unnecessary `icmp` for checking overflow of `add nsw` in `_M_check_len`
- Dominant language
- LLVM
- Stars
- 40.5k
- Forks
- 18.7k
- PR merge metrics
- PR metrics pending
Description
```llvm
define i64 @src(i64 %v0) {
%v1 = tail call i64 @llvm.umax.i64(i64 %v0, i64 1)
%v2 = add nsw i64 %v1, %v0
%v3 = icmp ult i64 %v2, %v0
%v4 = tail call i64 @llvm.umin.i64(i64 %v2, i64 288230376151711743)
%v5 = select i1 %v3, i64 288230376151711743, i64 %v4
ret i64 %v5
}
define i64 @tgt(i64 %v0) {
%v1 = tail call i64 @llvm.umax.i64(i64 %v0, i64 1)
%v2 = add nsw i64 %v1, %v0
%v4 = tail call i64 @llvm.umin.i64(i64 %v2, i64 288230376151711743)
ret i64 %v4
}
; 288230376151711743 == std::allocator_traits>::max_size(...);
```
Alive2: https://alive2.llvm.org/ce/z/QTCWkK
Godbolt: https://godbolt.org/z/dM747MT69
This pattern is compiled from `_M_realloc_insert` (`_M_check_len`), which exists in many sources.
Contributor guide
Assessment
This issue has not been assessed yet.