Skip to content

Commit 57d0290

Browse files
committed
[test,instcombine] Precommit test for upcoming transform
1 parent c7e24db commit 57d0290

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
4+
; Memcpy is copying known-undef, and is thus removable
5+
define void @test(i8* %dest) {
6+
; CHECK-LABEL: @test(
7+
; CHECK-NEXT: [[A:%.*]] = alloca [7 x i8], align 1
8+
; CHECK-NEXT: [[SRC:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A]], i64 0, i64 0
9+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(7) [[DEST:%.*]], i8* noundef nonnull align 1 dereferenceable(7) [[SRC]], i64 7, i1 false)
10+
; CHECK-NEXT: ret void
11+
;
12+
%a = alloca [7 x i8]
13+
%src = getelementptr inbounds [7 x i8], [7 x i8]* %a, i64 0, i64 0
14+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 7, i1 false)
15+
ret void
16+
}
17+
18+
; Some non-undef elements
19+
define void @test2(i8* %dest) {
20+
; CHECK-LABEL: @test2(
21+
; CHECK-NEXT: [[A:%.*]] = alloca [7 x i8], align 1
22+
; CHECK-NEXT: [[SRC:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A]], i64 0, i64 0
23+
; CHECK-NEXT: store i8 0, i8* [[SRC]], align 1
24+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(7) [[DEST:%.*]], i8* noundef nonnull align 1 dereferenceable(7) [[SRC]], i64 7, i1 false)
25+
; CHECK-NEXT: ret void
26+
;
27+
%a = alloca [7 x i8]
28+
%src = getelementptr inbounds [7 x i8], [7 x i8]* %a, i64 0, i64 0
29+
store i8 0, i8* %src
30+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 7, i1 false)
31+
ret void
32+
}
33+
34+
; Volatile write is still required
35+
define void @test3(i8* %dest) {
36+
; CHECK-LABEL: @test3(
37+
; CHECK-NEXT: [[A:%.*]] = alloca [7 x i8], align 1
38+
; CHECK-NEXT: [[SRC:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A]], i64 0, i64 0
39+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST:%.*]], i8* [[SRC]], i64 7, i1 true)
40+
; CHECK-NEXT: ret void
41+
;
42+
%a = alloca [7 x i8]
43+
%src = getelementptr inbounds [7 x i8], [7 x i8]* %a, i64 0, i64 0
44+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 7, i1 true)
45+
ret void
46+
}
47+
48+
define void @test4(i8* %dest) {
49+
; CHECK-LABEL: @test4(
50+
; CHECK-NEXT: [[A1:%.*]] = alloca [7 x i8], align 1
51+
; CHECK-NEXT: [[A1_SUB:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A1]], i64 0, i64 0
52+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(7) [[DEST:%.*]], i8* noundef nonnull align 1 dereferenceable(7) [[A1_SUB]], i64 7, i1 false)
53+
; CHECK-NEXT: ret void
54+
;
55+
%a = alloca [7 x i8]
56+
%src = bitcast [7 x i8]* %a to i8*
57+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 7, i1 false)
58+
ret void
59+
}
60+
61+
define void @test5(i8* %dest) {
62+
; CHECK-LABEL: @test5(
63+
; CHECK-NEXT: [[A:%.*]] = alloca [7 x i8], align 1
64+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A]], i64 0, i64 4
65+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(3) [[DEST:%.*]], i8* noundef nonnull align 1 dereferenceable(3) [[P2]], i64 3, i1 false)
66+
; CHECK-NEXT: ret void
67+
;
68+
%a = alloca [7 x i8]
69+
%p1 = bitcast [7 x i8]* %a to i32*
70+
%p2 = getelementptr i32, i32* %p1, i32 1
71+
%src = bitcast i32* %p2 to i8*
72+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 3, i1 false)
73+
ret void
74+
}
75+
76+
define void @test6(i8* %dest) {
77+
; CHECK-LABEL: @test6(
78+
; CHECK-NEXT: [[A:%.*]] = alloca [7 x i8], align 1
79+
; CHECK-NEXT: [[P2:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* [[A]], i64 0, i64 2
80+
; CHECK-NEXT: [[TMP1:%.*]] = bitcast i8* [[P2]] to i16*
81+
; CHECK-NEXT: store i16 42, i16* [[TMP1]], align 2
82+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* noundef nonnull align 1 dereferenceable(7) [[DEST:%.*]], i8* noundef nonnull align 1 dereferenceable(7) [[P2]], i64 7, i1 false)
83+
; CHECK-NEXT: ret void
84+
;
85+
%a = alloca [7 x i8]
86+
%p1 = bitcast [7 x i8]* %a to i16*
87+
%p2 = getelementptr i16, i16* %p1, i32 1
88+
store i16 42, i16* %p2
89+
%src = bitcast i16* %p2 to i8*
90+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 7, i1 false)
91+
ret void
92+
}
93+
94+
declare void @llvm.memcpy.p0i8.p0i8.i64(i8*, i8*, i64, i1)

0 commit comments

Comments
 (0)