Skip to content

Commit b047a20

Browse files
committed
Precommit tests for PR84694
1 parent c925c16 commit b047a20

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=globalopt < %s -S | FileCheck %s
3+
4+
@gv = internal unnamed_addr global [3 x ptr] zeroinitializer, align 16
5+
@gv2 = internal unnamed_addr global i32 0, align 4
6+
7+
;; This test includes a load from @gv. No stores
8+
;; or memintrinsics with destination @gv should be removed.
9+
define i32 @main_with_load_from_b() local_unnamed_addr {
10+
; CHECK-LABEL: define i32 @main_with_load_from_b() local_unnamed_addr {
11+
; CHECK-NEXT: entry:
12+
; CHECK-NEXT: [[E:%.*]] = alloca i32, align 4
13+
; CHECK-NEXT: store ptr [[E]], ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 16
14+
; CHECK-NEXT: [[LOAD_B:%.*]] = load ptr, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 16
15+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @gv, ptr null, i64 8, i1 false)
16+
; CHECK-NEXT: ret i32 0
17+
;
18+
entry:
19+
%e = alloca i32, align 4
20+
store ptr %e, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 16
21+
%load.b = load ptr, ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 2), align 16
22+
call void @llvm.memcpy.p0i8.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @gv, i64 0, i64 0), ptr null, i64 8, i1 false)
23+
ret i32 0
24+
}
25+
26+
;; This test includes a memcpy with @c as it's source and destination
27+
;; operands. CleanupPointerRootUsers is not called in this case.
28+
define i32 @main_with_load_store_c() local_unnamed_addr {
29+
; CHECK-LABEL: define i32 @main_with_load_store_c() local_unnamed_addr {
30+
; CHECK-NEXT: entry:
31+
; CHECK-NEXT: [[E:%.*]] = alloca i32, align 4
32+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @gv2, ptr @gv2, i64 4, i1 false)
33+
; CHECK-NEXT: ret i32 0
34+
;
35+
entry:
36+
%e = alloca i32, align 4
37+
call void @llvm.memcpy.p0i8.p0i8.i64(ptr @gv2, ptr @gv2, i64 4, i1 false)
38+
ret i32 0
39+
}
40+
41+
declare void @llvm.memcpy.p0i8.p0i8.i64(ptr nocapture, ptr nocapture readonly, i64, i1) local_unnamed_addr
42+
declare void @llvm.memset.p0i8.i64(ptr nocapture, i8, i64, i1) local_unnamed_addr
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=globalopt < %s -S | FileCheck %s
3+
4+
@a = internal unnamed_addr global i32 0, align 4
5+
@b = internal unnamed_addr global [3 x ptr] zeroinitializer, align 16
6+
7+
;; This test is extracted from the issue reported in #64680, with an
8+
;; additional memcpy and a memset. Ensure all stores and memintrinsics with
9+
;; destination @b are removed as @b is dead.
10+
define i32 @main() local_unnamed_addr {
11+
; CHECK-LABEL: define i32 @main() local_unnamed_addr {
12+
; CHECK-NEXT: entry:
13+
; CHECK-NEXT: [[E:%.*]] = alloca i32, align 4
14+
; CHECK-NEXT: [[DOTPR:%.*]] = load i32, ptr @a, align 4
15+
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[DOTPR]], 3
16+
; CHECK-NEXT: br i1 [[CMP1]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]]
17+
; CHECK: for.body:
18+
; CHECK-NEXT: store i32 8, ptr [[E]], align 4
19+
; CHECK-NEXT: call void @bar20_()
20+
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[E]], align 4
21+
; CHECK-NEXT: [[TOBOOL_NOT:%.*]] = icmp eq i32 [[TMP0]], 0
22+
; CHECK-NEXT: br i1 [[TOBOOL_NOT]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
23+
; CHECK: if.then:
24+
; CHECK-NEXT: call void @foo()
25+
; CHECK-NEXT: br label [[IF_END]]
26+
; CHECK: if.end:
27+
; CHECK-NEXT: store ptr [[E]], ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 2), align 16
28+
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr @a, align 4
29+
; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[TMP1]], 1
30+
; CHECK-NEXT: store i32 [[INC]], ptr @a, align 4
31+
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP1]], 2
32+
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END]]
33+
; CHECK: for.end:
34+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr @b, ptr null, i64 8, i1 false)
35+
; CHECK-NEXT: ret i32 0
36+
;
37+
entry:
38+
%e = alloca i32, align 4
39+
%.pr = load i32, ptr @a, align 4
40+
%cmp1 = icmp slt i32 %.pr, 3
41+
br i1 %cmp1, label %for.body, label %for.end
42+
43+
for.body: ; preds = %entry, %if.end
44+
store i32 8, ptr %e, align 4
45+
call void @bar20_()
46+
%0 = load i32, ptr %e, align 4
47+
%tobool.not = icmp eq i32 %0, 0
48+
br i1 %tobool.not, label %if.then, label %if.end
49+
50+
if.then: ; preds = %for.body
51+
call void @foo()
52+
br label %if.end
53+
54+
if.end: ; preds = %if.then, %for.body
55+
store ptr %e, ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 2), align 16
56+
%1 = load i32, ptr @a, align 4
57+
%inc = add nsw i32 %1, 1
58+
store i32 %inc, ptr @a, align 4
59+
%cmp = icmp slt i32 %1, 2
60+
call void @llvm.memset.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 0), i8 0, i64 8, i1 false)
61+
br i1 %cmp, label %for.body, label %for.end
62+
63+
for.end: ; preds = %if.end, %entry
64+
call void @llvm.memcpy.p0i8.p0i8.i64(ptr getelementptr inbounds ([3 x ptr], ptr @b, i64 0, i64 0), ptr null, i64 8, i1 false)
65+
ret i32 0
66+
}
67+
68+
declare void @bar20_() local_unnamed_addr
69+
declare void @foo() local_unnamed_addr
70+
declare void @llvm.memcpy.p0i8.p0i8.i64(ptr nocapture, ptr nocapture readonly, i64, i1) local_unnamed_addr
71+
declare void @llvm.memset.p0i8.i64(ptr nocapture, i8, i64, i1) local_unnamed_addr

0 commit comments

Comments
 (0)