Issue 140997
Summary DSEPass incorrectly eliminates store to captured (and later read) pointer
Labels new issue
Assignees
Reporter mhjacobson
    llvm v20.1.3
macOS "Big Sur" 11.7.10 (20G1427)

I have this code:

```
declare i32 @printf(i8* noalias readonly, ...)
@fmt = constant [6 x i8] c"%hhd\0a\00"

define ptr @makeValue(ptr %p) noinline optnone memory(none) {
  ret ptr %p
}

define void @useValue(ptr %value) noinline optnone memory(argmem: read) {
  %val = load i8, ptr %value
  call i32 @printf(ptr @fmt, i8 %val)
  ret void
}

define i32 @main() {
entry:
  %1 = alloca i8, align 4
  store i8 42, ptr %1
  %value = call i64 @makeValue(ptr %1)
  call void @useValue(i64 %value)
  ret i32 0
}
```

`opt --passes=dse` transforms `@main()` to (<https://godbolt.org/z/rhx1z9K4W>):

```
define i32 @main() {
entry:
  %0 = alloca i8, align 4
  %value = call i64 @makeValue(ptr %0)
  call void @useValue(i64 %value)
  ret i32 0
}
```

i.e., it eliminates the store to `%1`, even though `%1` is captured by the call to `@makeValue()` and ultimately read in `@useValue()`.

I believe the `memory` annotations on `@makeValue()` and `@useValue()` are legal.  Note that the `noinline optnone` are just to prevent the optimizer from seeing into the contents of the function, equivalent to if the functions were simply `declare`d and implemented in another module.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to