blob: bb7e8dd26d84cf7cee356574e4d7750932990252 [file] [log] [blame]
Dan Gohmanbdf08d52016-01-26 04:01:11 +00001; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test memcpy, memmove, and memset intrinsics.
4
5target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6target triple = "wasm32-unknown-unknown"
7
8declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)
9declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)
10declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1)
11
12; Test that return values are optimized.
13
14; CHECK-LABEL: copy_yes:
15; CHECK: i32.call $push0=, memcpy@FUNCTION, $0, $1, $2{{$}}
16; CHECK-NEXT: return $pop0{{$}}
17define i8* @copy_yes(i8* %dst, i8* %src, i32 %len) {
18 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
19 ret i8* %dst
20}
21
22; CHECK-LABEL: copy_no:
23; CHECK: i32.call $discard=, memcpy@FUNCTION, $0, $1, $2{{$}}
24; CHECK-NEXT: return{{$}}
25define void @copy_no(i8* %dst, i8* %src, i32 %len) {
26 call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
27 ret void
28}
29
30; CHECK-LABEL: move_yes:
31; CHECK: i32.call $push0=, memmove@FUNCTION, $0, $1, $2{{$}}
32; CHECK-NEXT: return $pop0{{$}}
33define i8* @move_yes(i8* %dst, i8* %src, i32 %len) {
34 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
35 ret i8* %dst
36}
37
38; CHECK-LABEL: move_no:
39; CHECK: i32.call $discard=, memmove@FUNCTION, $0, $1, $2{{$}}
40; CHECK-NEXT: return{{$}}
41define void @move_no(i8* %dst, i8* %src, i32 %len) {
42 call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
43 ret void
44}
45
46; CHECK-LABEL: set_yes:
47; CHECK: i32.call $push0=, memset@FUNCTION, $0, $1, $2{{$}}
48; CHECK-NEXT: return $pop0{{$}}
49define i8* @set_yes(i8* %dst, i8 %src, i32 %len) {
50 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %src, i32 %len, i32 1, i1 false)
51 ret i8* %dst
52}
53
54; CHECK-LABEL: set_no:
55; CHECK: i32.call $discard=, memset@FUNCTION, $0, $1, $2{{$}}
56; CHECK-NEXT: return{{$}}
57define void @set_no(i8* %dst, i8 %src, i32 %len) {
58 call void @llvm.memset.p0i8.i32(i8* %dst, i8 %src, i32 %len, i32 1, i1 false)
59 ret void
60}
JF Bastien1a6c7602016-01-26 20:22:42 +000061
62; CHECK-LABEL: frame_index:
63; CHECK: i32.call $discard=, memset@FUNCTION, $3, $pop1, $pop0{{$}}
64; CHECK: return{{$}}
65define void @frame_index() {
66entry:
67 %a = alloca [2048 x i8], align 16
68 %0 = getelementptr inbounds [2048 x i8], [2048 x i8]* %a, i32 0, i32 0
69 call void @llvm.memset.p0i8.i32(i8* %0, i8 256, i32 1024, i32 16, i1 false)
70 ret void
71}