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