Skip to content

Commit cfb9991

Browse files
committed
Pre-commit test cases
1 parent 6e20519 commit cfb9991

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes=memcpyopt -S -verify-memoryssa | FileCheck %s
3+
4+
define i24 @forward_load(ptr %src) {
5+
; CHECK-LABEL: define i24 @forward_load(
6+
; CHECK-SAME: ptr [[SRC:%.*]]) {
7+
; CHECK-NEXT: [[DEST:%.*]] = alloca [3 x i8], align 1
8+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 3, i1 false)
9+
; CHECK-NEXT: [[VAL1:%.*]] = load i24, ptr [[DEST]], align 4
10+
; CHECK-NEXT: ret i24 [[VAL1]]
11+
;
12+
%dest = alloca [3 x i8]
13+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 3, i1 false)
14+
%val = load i24, ptr %dest
15+
ret i24 %val
16+
}
17+
18+
define i16 @forward_load_2(ptr %src) {
19+
; CHECK-LABEL: define i16 @forward_load_2(
20+
; CHECK-SAME: ptr [[SRC:%.*]]) {
21+
; CHECK-NEXT: [[DEST:%.*]] = alloca [3 x i8], align 1
22+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 2, i1 false)
23+
; CHECK-NEXT: [[VAL1:%.*]] = load i16, ptr [[DEST]], align 2
24+
; CHECK-NEXT: ret i16 [[VAL1]]
25+
;
26+
%dest = alloca [3 x i8]
27+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 2, i1 false)
28+
%val = load i16, ptr %dest
29+
ret i16 %val
30+
}
31+
32+
define i32 @forward_load_padding(ptr %src) {
33+
; CHECK-LABEL: define i32 @forward_load_padding(
34+
; CHECK-SAME: ptr [[SRC:%.*]]) {
35+
; CHECK-NEXT: [[DEST:%.*]] = alloca { i8, i32 }, align 8
36+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 8, i1 false)
37+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[DEST]], i64 4
38+
; CHECK-NEXT: [[VAL1:%.*]] = load i32, ptr [[GEP]], align 4
39+
; CHECK-NEXT: ret i32 [[VAL1]]
40+
;
41+
%dest = alloca { i8, i32 }
42+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 8, i1 false)
43+
%gep = getelementptr inbounds i8, ptr %dest, i64 4
44+
%val = load i32, ptr %gep
45+
ret i32 %val
46+
}
47+
48+
; Negative tests
49+
50+
define i24 @failed_forward_load_write_src(ptr %src) {
51+
; CHECK-LABEL: define i24 @failed_forward_load_write_src(
52+
; CHECK-SAME: ptr [[SRC:%.*]]) {
53+
; CHECK-NEXT: [[DEST:%.*]] = alloca [3 x i8], align 1
54+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 3, i1 false)
55+
; CHECK-NEXT: store i1 true, ptr [[SRC]], align 1
56+
; CHECK-NEXT: [[VAL:%.*]] = load i24, ptr [[DEST]], align 4
57+
; CHECK-NEXT: ret i24 [[VAL]]
58+
;
59+
%dest = alloca [3 x i8]
60+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 3, i1 false)
61+
store i1 true, ptr %src
62+
%val = load i24, ptr %dest
63+
ret i24 %val
64+
}
65+
66+
define i16 @failed_forward_load_size(ptr %src) {
67+
; CHECK-LABEL: define i16 @failed_forward_load_size(
68+
; CHECK-SAME: ptr [[SRC:%.*]]) {
69+
; CHECK-NEXT: [[DEST:%.*]] = alloca [3 x i8], align 1
70+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 1, i1 false)
71+
; CHECK-NEXT: [[VAL:%.*]] = load i16, ptr [[DEST]], align 2
72+
; CHECK-NEXT: ret i16 [[VAL]]
73+
;
74+
%dest = alloca [3 x i8]
75+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 1, i1 false)
76+
%val = load i16, ptr %dest
77+
ret i16 %val
78+
}
79+
80+
define i32 @failed_forward_load_padding(ptr %src) {
81+
; CHECK-LABEL: define i32 @failed_forward_load_padding(
82+
; CHECK-SAME: ptr [[SRC:%.*]]) {
83+
; CHECK-NEXT: [[DEST:%.*]] = alloca { i8, i32 }, align 8
84+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DEST]], ptr [[SRC]], i64 5, i1 false)
85+
; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[DEST]], i64 4
86+
; CHECK-NEXT: [[VAL:%.*]] = load i32, ptr [[GEP]], align 4
87+
; CHECK-NEXT: ret i32 [[VAL]]
88+
;
89+
%dest = alloca { i8, i32 }
90+
call void @llvm.memcpy.p0.p0.i64(ptr %dest, ptr %src, i64 5, i1 false)
91+
%gep = getelementptr inbounds i8, ptr %dest, i64 4
92+
%val = load i32, ptr %gep
93+
ret i32 %val
94+
}
95+
96+
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt -O2 -S < %s | FileCheck %s
3+
4+
; FIXME: It can return true.
5+
define i1 @main(ptr %i2) {
6+
; CHECK-LABEL: define noundef i1 @main(
7+
; CHECK-SAME: ptr captures(none) initializes((0, 3)) [[I2:%.*]]) local_unnamed_addr {
8+
; CHECK-NEXT: [[I1:%.*]] = alloca [3 x i8], align 1
9+
; CHECK-NEXT: store i8 0, ptr [[I2]], align 1
10+
; CHECK-NEXT: [[I3:%.*]] = getelementptr inbounds nuw i8, ptr [[I2]], i64 1
11+
; CHECK-NEXT: store i8 1, ptr [[I3]], align 1
12+
; CHECK-NEXT: [[I4:%.*]] = getelementptr inbounds nuw i8, ptr [[I2]], i64 2
13+
; CHECK-NEXT: store i8 2, ptr [[I4]], align 1
14+
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 3, ptr nonnull [[I1]])
15+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(3) [[I1]], ptr noundef nonnull align 1 dereferenceable(3) [[I2]], i64 3, i1 false)
16+
; CHECK-NEXT: [[I51:%.*]] = load i8, ptr [[I1]], align 1
17+
; CHECK-NEXT: [[I6:%.*]] = icmp eq i8 [[I51]], 0
18+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds nuw i8, ptr [[I1]], i64 1
19+
; CHECK-NEXT: [[I82:%.*]] = load i8, ptr [[TMP1]], align 1
20+
; CHECK-NEXT: [[I9:%.*]] = icmp eq i8 [[I82]], 1
21+
; CHECK-NEXT: [[I10:%.*]] = select i1 [[I6]], i1 [[I9]], i1 false
22+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[I1]], i64 2
23+
; CHECK-NEXT: [[I123:%.*]] = load i8, ptr [[TMP2]], align 1
24+
; CHECK-NEXT: [[I13:%.*]] = icmp eq i8 [[I123]], 2
25+
; CHECK-NEXT: [[I14:%.*]] = select i1 [[I10]], i1 [[I13]], i1 false
26+
; CHECK-NEXT: br i1 [[I14]], label %[[TRUE:.*]], label %[[FALSE:.*]]
27+
; CHECK: [[COMMON_RET:.*]]:
28+
; CHECK-NEXT: ret i1 [[I14]]
29+
; CHECK: [[TRUE]]:
30+
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 3, ptr nonnull [[I1]])
31+
; CHECK-NEXT: br label %[[COMMON_RET]]
32+
; CHECK: [[FALSE]]:
33+
; CHECK-NEXT: call void @assert_failed(ptr nonnull [[I1]])
34+
; CHECK-NEXT: br label %[[COMMON_RET]]
35+
;
36+
%i1 = alloca [3 x i8], align 1
37+
store i8 0, ptr %i2, align 1
38+
%i3 = getelementptr inbounds nuw i8, ptr %i2, i64 1
39+
store i8 1, ptr %i3, align 1
40+
%i4 = getelementptr inbounds nuw i8, ptr %i2, i64 2
41+
store i8 2, ptr %i4, align 1
42+
call void @llvm.lifetime.start.p0(i64 3, ptr nonnull %i1)
43+
call void @llvm.memcpy.p0.p0.i64(ptr %i1, ptr %i2, i64 3, i1 false)
44+
%i5 = load i8, ptr %i1, align 1
45+
%i6 = icmp eq i8 %i5, 0
46+
%i7 = getelementptr inbounds nuw i8, ptr %i1, i64 1
47+
%i8 = load i8, ptr %i7, align 1
48+
%i9 = icmp eq i8 %i8, 1
49+
%i10 = select i1 %i6, i1 %i9, i1 false
50+
%i11 = getelementptr inbounds nuw i8, ptr %i1, i64 2
51+
%i12 = load i8, ptr %i11, align 1
52+
%i13 = icmp eq i8 %i12, 2
53+
%i14 = select i1 %i10, i1 %i13, i1 false
54+
br i1 %i14, label %true, label %false
55+
56+
true:
57+
call void @llvm.lifetime.end.p0(i64 3, ptr nonnull %i1)
58+
ret i1 true
59+
60+
false:
61+
call void @assert_failed(ptr %i1)
62+
ret i1 false
63+
}
64+
65+
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
66+
declare void @llvm.lifetime.start.p0(i64, ptr)
67+
declare void @llvm.lifetime.end.p0(i64, ptr)
68+
declare void @assert_failed(ptr)

0 commit comments

Comments
 (0)