Actually support volatile memcpys in NVPTX lowering
[oota-llvm.git] / test / CodeGen / NVPTX / lower-aggr-copies.ll
1 ; RUN: llc < %s -march=nvptx -mcpu=sm_35 | FileCheck %s
2
3 ; Verify that the NVPTXLowerAggrCopies pass works as expected - calls to
4 ; llvm.mem* intrinsics get lowered to loops.
5
6 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #1
7 declare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) #1
8
9 define i8* @memcpy_caller(i8* %dst, i8* %src, i64 %n) #0 {
10 entry:
11   tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst, i8* %src, i64 %n, i32 1, i1 false)
12   ret i8* %dst
13 ; CHECK-LABEL: .visible .func (.param .b32 func_retval0) memcpy_caller
14 ; CHECK: LBB[[LABEL:[_0-9]+]]:
15 ; CHECK:      ld.u8 %rs[[REG:[0-9]+]]
16 ; CHECK:      st.u8 [%r{{[0-9]+}}], %rs[[REG]]
17 ; CHECK:      add.s64 %rd[[COUNTER:[0-9]+]], %rd[[COUNTER]], 1
18 ; CHECK-NEXT: setp.lt.u64 %p[[PRED:[0-9]+]], %rd[[COUNTER]], %rd
19 ; CHECK-NEXT: @%p[[PRED]] bra LBB[[LABEL]]
20 }
21
22 define i8* @memcpy_volatile_caller(i8* %dst, i8* %src, i64 %n) #0 {
23 entry:
24   tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %dst, i8* %src, i64 %n, i32 1, i1 true)
25   ret i8* %dst
26 ; CHECK-LABEL: .visible .func (.param .b32 func_retval0) memcpy_volatile_caller
27 ; CHECK: LBB[[LABEL:[_0-9]+]]:
28 ; CHECK:      ld.volatile.u8 %rs[[REG:[0-9]+]]
29 ; CHECK:      st.volatile.u8 [%r{{[0-9]+}}], %rs[[REG]]
30 ; CHECK:      add.s64 %rd[[COUNTER:[0-9]+]], %rd[[COUNTER]], 1
31 ; CHECK-NEXT: setp.lt.u64 %p[[PRED:[0-9]+]], %rd[[COUNTER]], %rd
32 ; CHECK-NEXT: @%p[[PRED]] bra LBB[[LABEL]]
33 }
34
35 define i8* @memset_caller(i8* %dst, i32 %c, i64 %n) #0 {
36 entry:
37   %0 = trunc i32 %c to i8
38   tail call void @llvm.memset.p0i8.i64(i8* %dst, i8 %0, i64 %n, i32 1, i1 false)
39   ret i8* %dst
40 ; CHECK-LABEL: .visible .func (.param .b32 func_retval0) memset_caller(
41 ; CHECK:      ld.param.u8 %rs[[REG:[0-9]+]]
42 ; CHECK:      LBB[[LABEL:[_0-9]+]]:
43 ; CHECK:      st.u8 [%r{{[0-9]+}}], %rs[[REG]]
44 ; CHECK:      add.s64 %rd[[COUNTER:[0-9]+]], %rd[[COUNTER]], 1
45 ; CHECK-NEXT: setp.lt.u64 %p[[PRED:[0-9]+]], %rd[[COUNTER]], %rd
46 ; CHECK-NEXT: @%p[[PRED]] bra LBB[[LABEL]]
47 }