Skip to content

Commit 91791c6

Browse files
authored
[DSE] Test precommit for a bug caused by a read-clobber being skipped. (#83084)
1 parent 5e4c436 commit 91791c6

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -S -passes=dse < %s | FileCheck %s
3+
;
4+
; DSE kills both `store i32 44, ptr %struct.byte.4, align 4` and
5+
; `call void @llvm.memset.p0.i64(...)` but the memset should not be killed
6+
; because it has a clobber read: `%ret = load ptr, ptr %struct.byte.8`
7+
8+
%struct.type = type { ptr, ptr }
9+
10+
define ptr @foo(ptr noundef %ptr) {
11+
; CHECK-LABEL: define ptr @foo(
12+
; CHECK-SAME: ptr noundef [[PTR:%.*]]) {
13+
; CHECK-NEXT: [[STRUCT_ALLOCA:%.*]] = alloca [[STRUCT_TYPE:%.*]], align 8
14+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 56, ptr nonnull [[STRUCT_ALLOCA]]) #[[ATTR2:[0-9]+]]
15+
; CHECK-NEXT: [[STRUCT_BYTE_8:%.*]] = getelementptr inbounds i8, ptr [[STRUCT_ALLOCA]], i64 8
16+
; CHECK-NEXT: store i32 43, ptr [[STRUCT_BYTE_8]], align 4
17+
; CHECK-NEXT: [[RET:%.*]] = load ptr, ptr [[STRUCT_BYTE_8]], align 8
18+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 56, ptr nonnull [[STRUCT_ALLOCA]]) #[[ATTR2]]
19+
; CHECK-NEXT: ret ptr [[RET]]
20+
;
21+
%struct.alloca = alloca %struct.type, align 8
22+
call void @llvm.lifetime.start.p0(i64 56, ptr nonnull %struct.alloca) nounwind
23+
%struct.byte.8 = getelementptr inbounds i8, ptr %struct.alloca, i64 8
24+
; Set %struct.alloca[8, 16) to 42.
25+
call void @llvm.memset.p0.i64(ptr noundef nonnull align 4 %struct.byte.8, i8 42, i64 8, i1 false)
26+
; Set %struct.alloca[8, 12) to 43.
27+
store i32 43, ptr %struct.byte.8, align 4
28+
; Set %struct.alloca[4, 8) to 44.
29+
%struct.byte.4 = getelementptr inbounds i8, ptr %struct.alloca, i64 4
30+
store i32 44, ptr %struct.byte.4, align 4
31+
; Return %struct.alloca[8, 16).
32+
%ret = load ptr, ptr %struct.byte.8
33+
call void @llvm.lifetime.end.p0(i64 56, ptr nonnull %struct.alloca) nounwind
34+
ret ptr %ret
35+
}
36+
37+
declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #0
38+
declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #2
39+
declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #2

0 commit comments

Comments
 (0)