Skip to content

Commit 22664a3

Browse files
committed
[MemCpyOpt] Don't use array allocas in tests (NFC)
Apparently querying dereferenceability of array allocations is being intentionally penalized (https://reviews.llvm.org/D41398), so avoid using them in tests.
1 parent b4288f2 commit 22664a3

File tree

1 file changed

+68
-48
lines changed

1 file changed

+68
-48
lines changed

llvm/test/Transforms/MemCpyOpt/callslot.ll

Lines changed: 68 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,86 +3,106 @@
33

44
define i8 @read_dest_between_call_and_memcpy() {
55
; CHECK-LABEL: @read_dest_between_call_and_memcpy(
6-
; CHECK-NEXT: [[DEST:%.*]] = alloca i8, i64 16, align 1
7-
; CHECK-NEXT: [[SRC:%.*]] = alloca i8, i64 16, align 1
8-
; CHECK-NEXT: store i8 1, i8* [[DEST]], align 1
9-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC]], i8 0, i64 16, i1 false)
10-
; CHECK-NEXT: [[X:%.*]] = load i8, i8* [[DEST]], align 1
11-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST]], i8 0, i64 16, i1 false)
6+
; CHECK-NEXT: [[DEST:%.*]] = alloca [16 x i8], align 1
7+
; CHECK-NEXT: [[SRC:%.*]] = alloca [16 x i8], align 1
8+
; CHECK-NEXT: [[DEST_I8:%.*]] = bitcast [16 x i8]* [[DEST]] to i8*
9+
; CHECK-NEXT: [[SRC_I8:%.*]] = bitcast [16 x i8]* [[SRC]] to i8*
10+
; CHECK-NEXT: store i8 1, i8* [[DEST_I8]], align 1
11+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC_I8]], i8 0, i64 16, i1 false)
12+
; CHECK-NEXT: [[X:%.*]] = load i8, i8* [[DEST_I8]], align 1
13+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST_I8]], i8 0, i64 16, i1 false)
1214
; CHECK-NEXT: ret i8 [[X]]
1315
;
14-
%dest = alloca i8, i64 16
15-
%src = alloca i8, i64 16
16-
store i8 1, i8* %dest
17-
call void @llvm.memset.p0i8.i64(i8* %src, i8 0, i64 16, i1 false)
18-
%x = load i8, i8* %dest
19-
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 16, i1 false)
16+
%dest = alloca [16 x i8]
17+
%src = alloca [16 x i8]
18+
%dest.i8 = bitcast [16 x i8]* %dest to i8*
19+
%src.i8 = bitcast [16 x i8]* %src to i8*
20+
store i8 1, i8* %dest.i8
21+
call void @llvm.memset.p0i8.i64(i8* %src.i8, i8 0, i64 16, i1 false)
22+
%x = load i8, i8* %dest.i8
23+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest.i8, i8* %src.i8, i64 16, i1 false)
2024
ret i8 %x
2125
}
2226

2327
define i8 @read_src_between_call_and_memcpy() {
2428
; CHECK-LABEL: @read_src_between_call_and_memcpy(
25-
; CHECK-NEXT: [[DEST:%.*]] = alloca i8, i64 16, align 1
26-
; CHECK-NEXT: [[SRC:%.*]] = alloca i8, i64 16, align 1
27-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC]], i8 0, i64 16, i1 false)
28-
; CHECK-NEXT: [[X:%.*]] = load i8, i8* [[SRC]], align 1
29-
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST]], i8* [[SRC]], i64 16, i1 false)
29+
; CHECK-NEXT: [[DEST:%.*]] = alloca [16 x i8], align 1
30+
; CHECK-NEXT: [[SRC:%.*]] = alloca [16 x i8], align 1
31+
; CHECK-NEXT: [[DEST_I8:%.*]] = bitcast [16 x i8]* [[DEST]] to i8*
32+
; CHECK-NEXT: [[SRC_I8:%.*]] = bitcast [16 x i8]* [[SRC]] to i8*
33+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC_I8]], i8 0, i64 16, i1 false)
34+
; CHECK-NEXT: [[X:%.*]] = load i8, i8* [[SRC_I8]], align 1
35+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST_I8]], i8* [[SRC_I8]], i64 16, i1 false)
3036
; CHECK-NEXT: ret i8 [[X]]
3137
;
32-
%dest = alloca i8, i64 16
33-
%src = alloca i8, i64 16
34-
call void @llvm.memset.p0i8.i64(i8* %src, i8 0, i64 16, i1 false)
35-
%x = load i8, i8* %src
36-
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 16, i1 false)
38+
%dest = alloca [16 x i8]
39+
%src = alloca [16 x i8]
40+
%dest.i8 = bitcast [16 x i8]* %dest to i8*
41+
%src.i8 = bitcast [16 x i8]* %src to i8*
42+
call void @llvm.memset.p0i8.i64(i8* %src.i8, i8 0, i64 16, i1 false)
43+
%x = load i8, i8* %src.i8
44+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest.i8, i8* %src.i8, i64 16, i1 false)
3745
ret i8 %x
3846
}
3947

4048
define void @write_dest_between_call_and_memcpy() {
4149
; CHECK-LABEL: @write_dest_between_call_and_memcpy(
42-
; CHECK-NEXT: [[DEST:%.*]] = alloca i8, i64 16, align 1
43-
; CHECK-NEXT: [[SRC:%.*]] = alloca i8, i64 16, align 1
44-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC]], i8 0, i64 16, i1 false)
45-
; CHECK-NEXT: store i8 1, i8* [[DEST]], align 1
46-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST]], i8 0, i64 16, i1 false)
50+
; CHECK-NEXT: [[DEST:%.*]] = alloca [16 x i8], align 1
51+
; CHECK-NEXT: [[SRC:%.*]] = alloca [16 x i8], align 1
52+
; CHECK-NEXT: [[DEST_I8:%.*]] = bitcast [16 x i8]* [[DEST]] to i8*
53+
; CHECK-NEXT: [[SRC_I8:%.*]] = bitcast [16 x i8]* [[SRC]] to i8*
54+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC_I8]], i8 0, i64 16, i1 false)
55+
; CHECK-NEXT: store i8 1, i8* [[DEST_I8]], align 1
56+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST_I8]], i8 0, i64 16, i1 false)
4757
; CHECK-NEXT: ret void
4858
;
49-
%dest = alloca i8, i64 16
50-
%src = alloca i8, i64 16
51-
call void @llvm.memset.p0i8.i64(i8* %src, i8 0, i64 16, i1 false)
52-
store i8 1, i8* %dest
53-
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 16, i1 false)
59+
%dest = alloca [16 x i8]
60+
%src = alloca [16 x i8]
61+
%dest.i8 = bitcast [16 x i8]* %dest to i8*
62+
%src.i8 = bitcast [16 x i8]* %src to i8*
63+
call void @llvm.memset.p0i8.i64(i8* %src.i8, i8 0, i64 16, i1 false)
64+
store i8 1, i8* %dest.i8
65+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest.i8, i8* %src.i8, i64 16, i1 false)
5466
ret void
5567
}
5668

5769
define void @write_src_between_call_and_memcpy() {
5870
; CHECK-LABEL: @write_src_between_call_and_memcpy(
59-
; CHECK-NEXT: [[DEST:%.*]] = alloca i8, i64 16, align 1
60-
; CHECK-NEXT: [[SRC:%.*]] = alloca i8, i64 16, align 1
61-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC]], i8 0, i64 16, i1 false)
62-
; CHECK-NEXT: store i8 1, i8* [[SRC]], align 1
63-
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST]], i8* [[SRC]], i64 16, i1 false)
71+
; CHECK-NEXT: [[DEST:%.*]] = alloca [16 x i8], align 1
72+
; CHECK-NEXT: [[SRC:%.*]] = alloca [16 x i8], align 1
73+
; CHECK-NEXT: [[DEST_I8:%.*]] = bitcast [16 x i8]* [[DEST]] to i8*
74+
; CHECK-NEXT: [[SRC_I8:%.*]] = bitcast [16 x i8]* [[SRC]] to i8*
75+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[SRC_I8]], i8 0, i64 16, i1 false)
76+
; CHECK-NEXT: store i8 1, i8* [[SRC_I8]], align 1
77+
; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[DEST_I8]], i8* [[SRC_I8]], i64 16, i1 false)
6478
; CHECK-NEXT: ret void
6579
;
66-
%dest = alloca i8, i64 16
67-
%src = alloca i8, i64 16
68-
call void @llvm.memset.p0i8.i64(i8* %src, i8 0, i64 16, i1 false)
69-
store i8 1, i8* %src
70-
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 16, i1 false)
80+
%dest = alloca [16 x i8]
81+
%src = alloca [16 x i8]
82+
%dest.i8 = bitcast [16 x i8]* %dest to i8*
83+
%src.i8 = bitcast [16 x i8]* %src to i8*
84+
call void @llvm.memset.p0i8.i64(i8* %src.i8, i8 0, i64 16, i1 false)
85+
store i8 1, i8* %src.i8
86+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest.i8, i8* %src.i8, i64 16, i1 false)
7187
ret void
7288
}
7389

7490
; TODO: This is a miscompile.
75-
define void @throw_between_call_and_mempy(i8* dereferenceable(16) %dest) {
91+
define void @throw_between_call_and_mempy(i8* dereferenceable(16) %dest.i8) {
7692
; CHECK-LABEL: @throw_between_call_and_mempy(
77-
; CHECK-NEXT: [[SRC:%.*]] = alloca i8, i64 16, align 1
78-
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST:%.*]], i8 0, i64 16, i1 false)
93+
; CHECK-NEXT: [[SRC:%.*]] = alloca [16 x i8], align 1
94+
; CHECK-NEXT: [[SRC_I8:%.*]] = bitcast [16 x i8]* [[SRC]] to i8*
95+
; CHECK-NEXT: [[DEST_I81:%.*]] = bitcast i8* [[DEST_I8:%.*]] to [16 x i8]*
96+
; CHECK-NEXT: [[DEST_I812:%.*]] = bitcast [16 x i8]* [[DEST_I81]] to i8*
97+
; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* [[DEST_I812]], i8 0, i64 16, i1 false)
7998
; CHECK-NEXT: call void @may_throw() [[ATTR2:#.*]]
8099
; CHECK-NEXT: ret void
81100
;
82-
%src = alloca i8, i64 16
83-
call void @llvm.memset.p0i8.i64(i8* %src, i8 0, i64 16, i1 false)
101+
%src = alloca [16 x i8]
102+
%src.i8 = bitcast [16 x i8]* %src to i8*
103+
call void @llvm.memset.p0i8.i64(i8* %src.i8, i8 0, i64 16, i1 false)
84104
call void @may_throw() readnone
85-
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest, i8* %src, i64 16, i1 false)
105+
call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dest.i8, i8* %src.i8, i64 16, i1 false)
86106
ret void
87107
}
88108

0 commit comments

Comments
 (0)