Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(384)

Side by Side Diff: tests_lit/llvm2ice_tests/nacl-mem-intrinsics.ll

Issue 1255053008: Inline memset when there is a constant value and count. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 ; This tests the NaCl intrinsics memset, memcpy and memmove.
2
3 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
4 ; RUN: --target x8632 -i %s --args -O2 -sandbox \
5 ; RUN: | %if --need=target_X8632 --command FileCheck %s
6 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
7 ; RUN: --target x8632 -i %s --args -Om1 -sandbox \
8 ; RUN: | %if --need=target_X8632 --command FileCheck %s
9
10 ; RUN: %if --need=target_ARM32 --need=allow_dump \
11 ; RUN: --command %p2i --filetype=asm --assemble --disassemble --target arm32 \
12 ; RUN: -i %s --args -O2 --skip-unimplemented \
13 ; RUN: | %if --need=target_ARM32 --need=allow_dump \
14 ; RUN: --command FileCheck --check-prefix ARM32 %s
15
16 declare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)
17 declare void @llvm.memmove.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1)
18 declare void @llvm.memset.p0i8.i32(i8*, i8, i32, i32, i1)
19
20 define void @test_memcpy(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
21 entry:
22 %dst = inttoptr i32 %iptr_dst to i8*
23 %src = inttoptr i32 %iptr_src to i8*
24 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
25 i32 %len, i32 1, i1 false)
26 ret void
27 }
28 ; CHECK-LABEL: test_memcpy
29 ; CHECK: call {{.*}} R_{{.*}} memcpy
30 ; ARM32-LABEL: test_memcpy
31 ; ARM32: bl {{.*}} memcpy
32
33 ; TODO(jvoung) -- if we want to be clever, we can do this and the memmove,
34 ; memset without a function call.
35 define void @test_memcpy_const_len_align(i32 %iptr_dst, i32 %iptr_src) {
36 entry:
37 %dst = inttoptr i32 %iptr_dst to i8*
38 %src = inttoptr i32 %iptr_src to i8*
39 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src,
40 i32 32, i32 1, i1 false)
41 ret void
42 }
43 ; CHECK-LABEL: test_memcpy_const_len_align
44 ; CHECK: call {{.*}} R_{{.*}} memcpy
45 ; ARM32-LABEL: test_memcpy_const_len_align
46 ; ARM32: bl {{.*}} memcpy
47
48 define void @test_memmove(i32 %iptr_dst, i32 %iptr_src, i32 %len) {
49 entry:
50 %dst = inttoptr i32 %iptr_dst to i8*
51 %src = inttoptr i32 %iptr_src to i8*
52 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src,
53 i32 %len, i32 1, i1 false)
54 ret void
55 }
56 ; CHECK-LABEL: test_memmove
57 ; CHECK: call {{.*}} R_{{.*}} memmove
58 ; ARM32-LABEL: test_memmove
59 ; ARM32: bl {{.*}} memmove
60
61 define void @test_memmove_const_len_align(i32 %iptr_dst, i32 %iptr_src) {
62 entry:
63 %dst = inttoptr i32 %iptr_dst to i8*
64 %src = inttoptr i32 %iptr_src to i8*
65 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src,
66 i32 32, i32 1, i1 false)
67 ret void
68 }
69 ; CHECK-LABEL: test_memmove_const_len_align
70 ; CHECK: call {{.*}} R_{{.*}} memmove
71 ; ARM32-LABEL: test_memmove_const_len_align
72 ; ARM32: bl {{.*}} memmove
73
74 define void @test_memset(i32 %iptr_dst, i32 %wide_val, i32 %len) {
75 entry:
76 %val = trunc i32 %wide_val to i8
77 %dst = inttoptr i32 %iptr_dst to i8*
78 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val,
79 i32 %len, i32 1, i1 false)
80 ret void
81 }
82 ; CHECK-LABEL: test_memset
83 ; CHECK: movzx
84 ; CHECK: call {{.*}} R_{{.*}} memset
85 ; ARM32-LABEL: test_memset
86 ; ARM32: uxtb
87 ; ARM32: bl {{.*}} memset
88
89 define void @test_memset_const_len_align(i32 %iptr_dst, i32 %wide_val) {
90 entry:
91 %val = trunc i32 %wide_val to i8
92 %dst = inttoptr i32 %iptr_dst to i8*
93 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %val,
94 i32 32, i32 1, i1 false)
95 ret void
96 }
97 ; CHECK-LABEL: test_memset_const_len_align
98 ; CHECK: movzx
99 ; CHECK: call {{.*}} R_{{.*}} memset
100 ; ARM32-LABEL: test_memset_const_len_align
101 ; ARM32: uxtb
102 ; ARM32: bl {{.*}} memset
103
104 define void @test_memset_const_val(i32 %iptr_dst, i32 %len) {
105 entry:
106 %dst = inttoptr i32 %iptr_dst to i8*
107 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 %len, i32 1, i1 false)
108 ret void
109 }
110 ; CHECK-LABEL: test_memset_const_val
111 ; CHECK-NOT: movzx
112 ; CHECK: call {{.*}} R_{{.*}} memset
113 ; ARM32-LABEL: test_memset_const_val
114 ; ARM32: uxtb
115 ; ARM32: bl {{.*}} memset
116
117 define void @test_memset_const_val_len_very_small(i32 %iptr_dst) {
118 entry:
119 %dst = inttoptr i32 %iptr_dst to i8*
120 call void @llvm.memset.p0i8.i32(i8* %dst, i8 10, i32 2, i32 1, i1 false)
121 ret void
122 }
123 ; CHECK-LABEL: test_memset_const_val_len_very_small
124 ; CHECK: mov WORD PTR [{{.*}}],0xa0a
125 ; CHECK-NOT: mov
126 ; ARM32-LABEL: test_memset_const_val_len_very_small
127 ; ARM32: uxtb
128 ; ARM32: bl {{.*}} memset
129
130 define void @test_memset_const_val_len_3(i32 %iptr_dst) {
131 entry:
132 %dst = inttoptr i32 %iptr_dst to i8*
133 call void @llvm.memset.p0i8.i32(i8* %dst, i8 16, i32 3, i32 1, i1 false)
134 ret void
135 }
136 ; CHECK-LABEL: test_memset_const_val_len_3
137 ; CHECK: mov WORD PTR [{{.*}}],0x1010
138 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x2],0x10
139 ; CHECK-NOT: mov
140 ; ARM32-LABEL: test_memset_const_val_len_3
141 ; ARM32: uxtb
142 ; ARM32: bl {{.*}} memset
143
144 define void @test_memset_const_val_len_mid(i32 %iptr_dst) {
145 entry:
146 %dst = inttoptr i32 %iptr_dst to i8*
147 call void @llvm.memset.p0i8.i32(i8* %dst, i8 32, i32 9, i32 1, i1 false)
148 ret void
149 }
150 ; CHECK-LABEL: test_memset_const_val_len_mid
151 ; CHECK: mov DWORD PTR [{{.*}}+0x4],0x20202020
152 ; CHECK: mov DWORD PTR [{{.*}}],0x20202020
153 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x8],0x20
154 ; CHECK-NOT: mov
155 ; ARM32-LABEL: test_memset_const_val_len_mid
156 ; ARM32: uxtb
157 ; ARM32: bl {{.*}} memset
158
159 define void @test_memset_zero_const_len_small(i32 %iptr_dst) {
160 entry:
161 %dst = inttoptr i32 %iptr_dst to i8*
162 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 12, i32 1, i1 false)
163 ret void
164 }
165 ; CHECK-LABEL: test_memset_zero_const_len_small
166 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]]
167 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]]
168 ; CHECK-NEXT: mov DWORD PTR [{{.*}}+0x8],0x0
169 ; CHECK-NOT: mov
170 ; ARM32-LABEL: test_memset_zero_const_len_small
171 ; ARM32: uxtb
172 ; ARM32: bl {{.*}} memset
173
174 define void @test_memset_zero_const_len_small_overlap(i32 %iptr_dst) {
175 entry:
176 %dst = inttoptr i32 %iptr_dst to i8*
177 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 15, i32 1, i1 false)
178 ret void
179 }
180 ; CHECK-LABEL: test_memset_zero_const_len_small_overlap
181 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]]
182 ; CHECK-NEXT: movq QWORD PTR [{{.*}}],[[ZERO]]
183 ; CHECK-NEXT: movq QWORD PTR [{{.*}}+0x7],[[ZERO]]
184 ; CHECK-NOT: mov
185 ; ARM32-LABEL: test_memset_zero_const_len_small_overlap
186 ; ARM32: uxtb
187 ; ARM32: bl {{.*}} memset
188
189 define void @test_memset_zero_const_len_large_overlap(i32 %iptr_dst) {
190 entry:
191 %dst = inttoptr i32 %iptr_dst to i8*
192 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 30, i32 1, i1 false)
193 ret void
194 }
195 ; CHECK-LABEL: test_memset_zero_const_len_large_overlap
196 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]]
197 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]]
198 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0xe],[[ZERO]]
199 ; CHECK-NOT: mov
200 ; ARM32-LABEL: test_memset_zero_const_len_large_overlap
201 ; ARM32: uxtb
202 ; ARM32: bl {{.*}} memset
203
204 define void @test_memset_zero_const_len_large(i32 %iptr_dst) {
205 entry:
206 %dst = inttoptr i32 %iptr_dst to i8*
207 call void @llvm.memset.p0i8.i32(i8* %dst, i8 0, i32 33, i32 1, i1 false)
208 ret void
209 }
210 ; CHECK-LABEL: test_memset_zero_const_len_large
211 ; CHECK: pxor [[ZERO:xmm[0-9]+]],[[ZERO]]
212 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}+0x10],[[ZERO]]
213 ; CHECK-NEXT: movups XMMWORD PTR [{{.*}}],[[ZERO]]
214 ; CHECK-NEXT: mov BYTE PTR [{{.*}}+0x20],0x0
215 ; CHECK-NOT: mov
216 ; ARM32-LABEL: test_memset_zero_const_len_large
217 ; ARM32: uxtb
218 ; ARM32: bl {{.*}} memset
OLDNEW
« no previous file with comments | « src/IceTargetLoweringX86BaseImpl.h ('k') | tests_lit/llvm2ice_tests/nacl-other-intrinsics.ll » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698