| Issue |
86920
|
| Summary |
[DSE] Missed optimization : eliminate `store C, ptr` if `load ptr` is known to be `C`
|
| Labels |
missed-optimization
|
| Assignees |
|
| Reporter |
XChy
|
Alive2 proof: https://alive2.llvm.org/ce/z/nVPFem
### Motivating example
```llvm
define void @src(ptr %p) {
entry:
%l1 = load i32, ptr %p, align 4
%cmp1 = icmp eq i32 %l1, 0
br i1 %cmp1, label %then, label %else
else: ; preds = %entry
call void @dummy()
%l2 = load i32, ptr %p, align 4
%cmp2 = icmp eq i32 %l2, 0
br i1 %cmp2, label %then, label %common.ret
then: ; preds = %entry, %else
store i32 0, ptr %p, align 4
br label %common.ret
common.ret: ; preds = %else, %then
ret void
}
```
can be folded to:
```llvm
define void @tgt(ptr %p) {
entry:
%l1 = load i32, ptr %p, align 4
%cmp1 = icmp eq i32 %l1, 0
br i1 %cmp1, label %then, label %else
else: ; preds = %entry
call void @dummy()
%l2 = load i32, ptr %p, align 4
%cmp2 = icmp eq i32 %l2, 0
br i1 %cmp2, label %then, label %common.ret
then: ; preds = %entry, %else
br label %common.ret
common.ret: ; preds = %else, %then
ret void
}
```
### Real-world motivation
This snippet of IR is derived from [linux/kernel/delayacct.c@delayacct_init](https://github.com/torvalds/linux/blob/8d025e2092e29bfd13e56c78e22af25fac83c8ec/kernel/delayacct.c#L39) (after O3 pipeline).
The example above is a reduced version. If you're interested in the original suboptimal IR and optimal IR, see also:https://godbolt.org/z/csqq89bef
**Let me know if you can confirm that it's an optimization opportunity, thanks.**
_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs