Issue 138678
Summary EarlyCSE misses redundant load elimination from base pointer, but succeeds when the pointer has a non-zero offset
Labels new issue
Assignees
Reporter GINN-Imp
    For the following case, EarlyCSE fails to eliminate a redundant load `store i8 %5, ptr @g2, align 1 --> store i8 %2, ptr @g2, align 1`. 
As a result, subsequent passes were not optimized further (`store i8 %5, ptr @g2, align 1 --> store i8 0, ptr @g2, align 1`).

In contrast, if the pointer is offset using getelementptr (e.g., gep %ptr, 32), the same redundant load pattern is optimized correctly.

Godbolt: https://godbolt.org/z/5GzT9qT9j
alive2 proof: https://alive2.llvm.org/ce/z/Tb5mbH

the reduced case:
```llvm
@g1 = external global i32
@g2 = external global i8

define void @src(ptr readonly captures(none) %0) local_unnamed_addr #0 {
  %2 = load i8, ptr %0, align 8
  %3 = zext i8 %2 to i32
  store i32 %3, ptr @g1, align 4
  %cond = icmp eq i8 %2, 0
  br i1 %cond, label %4, label %common.ret

common.ret: ; preds = %4, %1
  ret void

4: ; preds = %1
  %5 = load i8, ptr %0, align 8
  store i8 %5, ptr @g2, align 1      ; can be optimized to store i8 %2, ptr @g2, align 1
  br label %common.ret
}
```

opt -O3 didn't do anything to optimize it.

the case that can be optimized:
```llvm
define void @src2(ptr readonly captures(none) %0) local_unnamed_addr #0 {
  %2 = getelementptr inbounds nuw i8, ptr %0, i64 32
  %3 = load i8, ptr %2, align 8
  %4 = zext i8 %3 to i32
  store i32 %4, ptr @g1, align 4
  %cond = icmp eq i8 %3, 0
  br i1 %cond, label %5, label %common.ret

common.ret: ; preds = %5, %1
  ret void

5: ; preds = %1
  %6 = load i8, ptr %2, align 8
  store i8 %6, ptr @g2, align 1
  br label %common.ret
}
```

early-cse on src2:
```
 - %6 = load i8, ptr %2, align 8
 - store i8 %6, ptr @g2, align 1
+ store i8 %3, ptr @g2, align 1
```

The reduced case is derived from https://github.com/c3lang/c3c/blob/125436d23ef9b7f69837a00ffec168c52839a1dc/src/compiler/llvm_codegen_expr.c#L2376.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to