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

Reply via email to