xref: /aosp_15_r20/external/llvm/test/CodeGen/WebAssembly/mem-intrinsics.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -asm-verbose=false -disable-wasm-fallthrough-return-opt | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Test memcpy, memmove, and memset intrinsics.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128"
6*9880d681SAndroid Build Coastguard Workertarget triple = "wasm32-unknown-unknown"
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)
9*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture readonly, i32, i32, i1)
10*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1)
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; Test that return values are optimized.
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copy_yes:
15*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $push0=, memcpy@FUNCTION, $0, $1, $2{{$}}
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return   $pop0{{$}}
17*9880d681SAndroid Build Coastguard Workerdefine i8* @copy_yes(i8* %dst, i8* %src, i32 %len) {
18*9880d681SAndroid Build Coastguard Worker  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
19*9880d681SAndroid Build Coastguard Worker  ret i8* %dst
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: copy_no:
23*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $drop=, memcpy@FUNCTION, $0, $1, $2{{$}}
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
25*9880d681SAndroid Build Coastguard Workerdefine void @copy_no(i8* %dst, i8* %src, i32 %len) {
26*9880d681SAndroid Build Coastguard Worker  call void @llvm.memcpy.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
27*9880d681SAndroid Build Coastguard Worker  ret void
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: move_yes:
31*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $push0=, memmove@FUNCTION, $0, $1, $2{{$}}
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return   $pop0{{$}}
33*9880d681SAndroid Build Coastguard Workerdefine i8* @move_yes(i8* %dst, i8* %src, i32 %len) {
34*9880d681SAndroid Build Coastguard Worker  call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
35*9880d681SAndroid Build Coastguard Worker  ret i8* %dst
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: move_no:
39*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $drop=, memmove@FUNCTION, $0, $1, $2{{$}}
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
41*9880d681SAndroid Build Coastguard Workerdefine void @move_no(i8* %dst, i8* %src, i32 %len) {
42*9880d681SAndroid Build Coastguard Worker  call void @llvm.memmove.p0i8.p0i8.i32(i8* %dst, i8* %src, i32 %len, i32 1, i1 false)
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: set_yes:
47*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $push0=, memset@FUNCTION, $0, $1, $2{{$}}
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return   $pop0{{$}}
49*9880d681SAndroid Build Coastguard Workerdefine i8* @set_yes(i8* %dst, i8 %src, i32 %len) {
50*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %dst, i8 %src, i32 %len, i32 1, i1 false)
51*9880d681SAndroid Build Coastguard Worker  ret i8* %dst
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: set_no:
55*9880d681SAndroid Build Coastguard Worker; CHECK:      i32.call $drop=, memset@FUNCTION, $0, $1, $2{{$}}
56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: return{{$}}
57*9880d681SAndroid Build Coastguard Workerdefine void @set_no(i8* %dst, i8 %src, i32 %len) {
58*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %dst, i8 %src, i32 %len, i32 1, i1 false)
59*9880d681SAndroid Build Coastguard Worker  ret void
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: frame_index:
64*9880d681SAndroid Build Coastguard Worker; CHECK: i32.call $drop=, memset@FUNCTION, $pop{{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}{{$}}
65*9880d681SAndroid Build Coastguard Worker; CHECK: i32.call $push{{[0-9]+}}=, memset@FUNCTION, ${{[0-9]+}}, $pop{{[0-9]+}}, $pop{{[0-9]+}}{{$}}
66*9880d681SAndroid Build Coastguard Worker; CHECK: return{{$}}
67*9880d681SAndroid Build Coastguard Workerdefine void @frame_index() {
68*9880d681SAndroid Build Coastguard Workerentry:
69*9880d681SAndroid Build Coastguard Worker  %a = alloca [2048 x i8], align 16
70*9880d681SAndroid Build Coastguard Worker  %b = alloca [2048 x i8], align 16
71*9880d681SAndroid Build Coastguard Worker  %0 = getelementptr inbounds [2048 x i8], [2048 x i8]* %a, i32 0, i32 0
72*9880d681SAndroid Build Coastguard Worker  %1 = getelementptr inbounds [2048 x i8], [2048 x i8]* %b, i32 0, i32 0
73*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %0, i8 256, i32 1024, i32 16, i1 false)
74*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %1, i8 256, i32 1024, i32 16, i1 false)
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; If the result value of memset doesn't get stackified, it should be marked
79*9880d681SAndroid Build Coastguard Worker; $drop. Note that we use a call to prevent tail dup so that we can test
80*9880d681SAndroid Build Coastguard Worker; this specific functionality.
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: drop_result:
83*9880d681SAndroid Build Coastguard Worker; CHECK: i32.call $drop=, memset@FUNCTION, $0, $1, $2
84*9880d681SAndroid Build Coastguard Workerdeclare i8* @def()
85*9880d681SAndroid Build Coastguard Workerdeclare void @block_tail_dup()
86*9880d681SAndroid Build Coastguard Workerdefine i8* @drop_result(i8* %arg, i8 %arg1, i32 %arg2, i32 %arg3, i32 %arg4) {
87*9880d681SAndroid Build Coastguard Workerbb:
88*9880d681SAndroid Build Coastguard Worker  %tmp = icmp eq i32 %arg3, 0
89*9880d681SAndroid Build Coastguard Worker  br i1 %tmp, label %bb5, label %bb9
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerbb5:
92*9880d681SAndroid Build Coastguard Worker  %tmp6 = icmp eq i32 %arg4, 0
93*9880d681SAndroid Build Coastguard Worker  br i1 %tmp6, label %bb7, label %bb8
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerbb7:
96*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %arg, i8 %arg1, i32 %arg2, i32 1, i1 false)
97*9880d681SAndroid Build Coastguard Worker  br label %bb11
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerbb8:
100*9880d681SAndroid Build Coastguard Worker  br label %bb11
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Workerbb9:
103*9880d681SAndroid Build Coastguard Worker  %tmp10 = call i8* @def()
104*9880d681SAndroid Build Coastguard Worker  br label %bb11
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerbb11:
107*9880d681SAndroid Build Coastguard Worker  %tmp12 = phi i8* [ %arg, %bb7 ], [ %arg, %bb8 ], [ %tmp10, %bb9 ]
108*9880d681SAndroid Build Coastguard Worker  call void @block_tail_dup()
109*9880d681SAndroid Build Coastguard Worker  ret i8* %tmp12
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; This is the same as drop_result, except we let tail dup happen, so the
113*9880d681SAndroid Build Coastguard Worker; result of the memset *is* stackified.
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tail_dup_to_reuse_result:
116*9880d681SAndroid Build Coastguard Worker; CHECK: i32.call $push{{[0-9]+}}=, memset@FUNCTION, $0, $1, $2
117*9880d681SAndroid Build Coastguard Workerdefine i8* @tail_dup_to_reuse_result(i8* %arg, i8 %arg1, i32 %arg2, i32 %arg3, i32 %arg4) {
118*9880d681SAndroid Build Coastguard Workerbb:
119*9880d681SAndroid Build Coastguard Worker  %tmp = icmp eq i32 %arg3, 0
120*9880d681SAndroid Build Coastguard Worker  br i1 %tmp, label %bb5, label %bb9
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerbb5:
123*9880d681SAndroid Build Coastguard Worker  %tmp6 = icmp eq i32 %arg4, 0
124*9880d681SAndroid Build Coastguard Worker  br i1 %tmp6, label %bb7, label %bb8
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerbb7:
127*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i32(i8* %arg, i8 %arg1, i32 %arg2, i32 1, i1 false)
128*9880d681SAndroid Build Coastguard Worker  br label %bb11
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerbb8:
131*9880d681SAndroid Build Coastguard Worker  br label %bb11
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerbb9:
134*9880d681SAndroid Build Coastguard Worker  %tmp10 = call i8* @def()
135*9880d681SAndroid Build Coastguard Worker  br label %bb11
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerbb11:
138*9880d681SAndroid Build Coastguard Worker  %tmp12 = phi i8* [ %arg, %bb7 ], [ %arg, %bb8 ], [ %tmp10, %bb9 ]
139*9880d681SAndroid Build Coastguard Worker  ret i8* %tmp12
140*9880d681SAndroid Build Coastguard Worker}
141