Issue |
131927
|
Summary |
[InstCombine] Empty lifetime range removal changes behaviour
|
Labels |
new issue
|
Assignees |
|
Reporter |
tmiasko
|
In the example below, allocation `a` and allocation `b` have overlapping
lifetimes in all executions, so it should be impossible to observe them having
the same address. InstCombine removes the overlapping lifetimes. Which
introduces a behavior that wasn't possible before.
Before InstCombine:
```llvm
define { i1, i1 } @f() {
%a = alloca ptr
%b = alloca ptr
; Overlapping lifetimes (removed by instcombine)
call void @llvm.lifetime.start.p0(i64 8, ptr %a)
call void @llvm.lifetime.start.p0(i64 8, ptr %b)
call void @llvm.lifetime.end.p0(i64 8, ptr %a)
call void @llvm.lifetime.end.p0(i64 8, ptr %b)
; Disjoint lifetimes
call void @llvm.lifetime.start.p0(i64 8, ptr %a)
call void @g(ptr %a)
call void @llvm.lifetime.end.p0(i64 8, ptr %a)
call void @llvm.lifetime.start.p0(i64 8, ptr %b)
call void @g(ptr %b)
call void @llvm.lifetime.end.p0(i64 8, ptr %b)
; Obscured equality comparison. Avoids fold that incorrectly assumes that
; "Two distinct allocations will never be equal." See #45725 for details.
%1 = icmp ule ptr %a, %b
%2 = icmp uge ptr %a, %b
%3 = insertvalue { i1, i1 } poison, i1 %1, 0
%4 = insertvalue { i1, i1 } %3, i1 %2, 1
ret { i1, i1 } %4
}
declare void @g(ptr)
```
After InstCombine
```llvm
define { i1, i1 } @f() {
%a = alloca ptr, align 8
%b = alloca ptr, align 8
call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %a)
call void @g(ptr nonnull %a)
call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %a)
call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %b)
call void @g(ptr nonnull %b)
call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %b)
%1 = icmp ule ptr %a, %b
%2 = icmp uge ptr %a, %b
%3 = insertvalue { i1, i1 } poison, i1 %1, 0
%4 = insertvalue { i1, i1 } %3, i1 %2, 1
ret { i1, i1 } %4
}
```
https://alive2.llvm.org/ce/z/Vo8GLq
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs