• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: llc -mtriple=arm64-apple-ios -mattr=+strict-align < %s | FileCheck %s
2
3; Small (16 bytes here) unaligned memcpy() should be a function call if
4; strict-alignment is turned on.
5define void @t0(i8* %out, i8* %in) {
6; CHECK-LABEL: t0:
7; CHECK:      orr w2, wzr, #0x10
8; CHECK-NEXT: bl _memcpy
9entry:
10  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %out, i8* %in, i64 16, i1 false)
11  ret void
12}
13
14; Small (16 bytes here) aligned memcpy() should be inlined even if
15; strict-alignment is turned on.
16define void @t1(i8* align 8 %out, i8* align 8 %in) {
17; CHECK-LABEL: t1:
18; CHECK:      ldp x{{[0-9]+}}, x{{[0-9]+}}, [x1]
19; CHECK-NEXT: stp x{{[0-9]+}}, x{{[0-9]+}}, [x0]
20entry:
21  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %out, i8* align 8 %in, i64 16, i1 false)
22  ret void
23}
24
25; Tiny (4 bytes here) unaligned memcpy() should be inlined with byte sized
26; loads and stores if strict-alignment is turned on.
27define void @t2(i8* %out, i8* %in) {
28; CHECK-LABEL: t2:
29; CHECK:      ldrb w{{[0-9]+}}, [x1, #3]
30; CHECK-NEXT: ldrb w{{[0-9]+}}, [x1, #2]
31; CHECK-NEXT: ldrb w{{[0-9]+}}, [x1, #1]
32; CHECK-NEXT: ldrb w{{[0-9]+}}, [x1]
33; CHECK-NEXT: strb w{{[0-9]+}}, [x0, #3]
34; CHECK-NEXT: strb w{{[0-9]+}}, [x0, #2]
35; CHECK-NEXT: strb w{{[0-9]+}}, [x0, #1]
36; CHECK-NEXT: strb w{{[0-9]+}}, [x0]
37entry:
38  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %out, i8* %in, i64 4, i1 false)
39  ret void
40}
41
42declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i1)
43