Issue |
139732
|
Summary |
Missed optimization: trunc not de-duplicated
|
Labels |
new issue
|
Assignees |
|
Reporter |
Mark-Simulacrum
|
This Rust program:
```rust
use std::cell::Cell;
thread_local! {
pub static FOO: Cell<u32> = Cell::new(0xffff);
}
pub fn bar() -> u32 {
FOO.get() + FOO.get()
}
```
results in (at least) a duplicate load + trunc:
First version:
```llvm
%0 = load i32, ptr @"_ZN7example3FOO29_$u7b$$u7b$constant$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$3VAL17h49f9a1072bb59151E", align 4, !range !3, !noalias !4, !noundef !11
%trunc.i.i.i.i.i = trunc nuw i32 %0 to i1
```
Second version:
```llvm
%self3.val.pre.i.i = load i32, ptr getelementptr inbounds nuw (i8, ptr @"_ZN7example3FOO29_$u7b$$u7b$constant$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$3VAL17h49f9a1072bb59151E", i64 4), align 4
%1 = trunc nuw i32 %0 to i1
```
At minimum it'd be great to eliminate the double `trunc`, but combining the two loads also seems worthwhile (it *should* be possible AFAICT to deduplicate those). That would avoid two TLS address lookups in the resulting IR and should allow for further simplification (e.g., dropping some branches).
```llvm
define noundef i32 @_ZN7example3bar17h6628f733c3c7a49fE() unnamed_addr #0 personality ptr @rust_eh_personality {
start:
%0 = load i32, ptr @"_ZN7example3FOO29_$u7b$$u7b$constant$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$3VAL17h49f9a1072bb59151E", align 4, !range !3, !noalias !4, !noundef !11
%trunc.i.i.i.i.i = trunc nuw i32 %0 to i1
br i1 %trunc.i.i.i.i.i, label %"_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h35c29327e034454aE.exit", label %"_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h35c29327e034454aE.exit6.sink.split", !prof !12
"_ZN3std6thread5local17LocalKey$LT$T$GT$4with17h35c29327e034454aE.exit": ; preds = %start
%self3.val.pre.i.i = load i32, ptr getelementptr inbounds nuw (i8, ptr @"_ZN7example3FOO29_$u7b$$u7b$constant$u7d$$u7d$28_$u7b$$u7b$closure$u7d$$u7d$3VAL17h49f9a1072bb59151E", i64 4), align 4
%1 = trunc nuw i32 %0 to i1
...
```
Godbolt: https://rust.godbolt.org/z/dPb4bPTTe
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs