1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt %s -mtriple=arm64-apple-macosx -passes="default<O3>" -inline-threshold=2 -inline-call-penalty=5 -S | FileCheck %s
4 declare i64 @llvm.objectsize.i64.p0(ptr, i1, i1, i1)
5 declare ptr @__memcpy_chk(ptr, ptr, i64, i64)
6 declare ptr @__memmove_chk(ptr, ptr, i64, i64)
7 declare ptr @__mempcpy_chk(ptr, ptr, i64, i64)
8 declare ptr @__memset_chk(ptr, i32, i64, i64)
10 define void @callee_memcpy(ptr %dst, ptr %src, i64 %size) {
11 ; CHECK-LABEL: define void @callee_memcpy
12 ; CHECK-SAME: (ptr [[DST:%.*]], ptr readonly captures(none) [[SRC:%.*]], i64 [[SIZE:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
13 ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DST]], ptr align 1 [[SRC]], i64 [[SIZE]], i1 false)
14 ; CHECK-NEXT: ret void
16 %objsize = call i64 @llvm.objectsize.i64.p0(ptr %dst, i1 false, i1 true, i1 false)
17 %call.memcpy = call ptr @__memcpy_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)
21 define void @callee_memmove(ptr %dst, ptr %src, i64 %size) {
22 ; CHECK-LABEL: define void @callee_memmove
23 ; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[SIZE:%.*]]) local_unnamed_addr #[[ATTR1:[0-9]+]] {
24 ; CHECK-NEXT: tail call void @llvm.memmove.p0.p0.i64(ptr align 1 [[DST]], ptr align 1 [[SRC]], i64 [[SIZE]], i1 false)
25 ; CHECK-NEXT: ret void
27 %objsize = call i64 @llvm.objectsize.i64.p0(ptr %dst, i1 false, i1 true, i1 false)
28 %call.memmove = call ptr @__memmove_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)
32 define void @callee_mempcpy(ptr %dst, ptr %src, i64 %size) {
33 ; CHECK-LABEL: define void @callee_mempcpy
34 ; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[SIZE:%.*]]) local_unnamed_addr #[[ATTR1]] {
35 ; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DST]], ptr align 1 [[SRC]], i64 [[SIZE]], i1 false)
36 ; CHECK-NEXT: ret void
38 %objsize = call i64 @llvm.objectsize.i64.p0(ptr %dst, i1 false, i1 true, i1 false)
39 %call.mempcpy = call ptr @__mempcpy_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)
43 define void @callee_memset(ptr %dst, i64 %size) {
44 ; CHECK-LABEL: define void @callee_memset
45 ; CHECK-SAME: (ptr [[DST:%.*]], i64 [[SIZE:%.*]]) local_unnamed_addr #[[ATTR0]] {
46 ; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr align 1 [[DST]], i8 0, i64 [[SIZE]], i1 false)
47 ; CHECK-NEXT: ret void
49 %objsize = call i64 @llvm.objectsize.i64.p0(ptr %dst, i1 false, i1 true, i1 false)
50 %call.mempcpy = call ptr @__memset_chk(ptr %dst, i32 0, i64 %size, i64 %objsize)
54 define void @caller_memcpy(ptr %dst, ptr %src) {
55 ; CHECK-LABEL: define void @caller_memcpy
56 ; CHECK-SAME: (ptr [[DST:%.*]], ptr readonly captures(none) [[SRC:%.*]]) local_unnamed_addr #[[ATTR0]] {
57 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[SRC]], align 1
58 ; CHECK-NEXT: store i32 [[TMP1]], ptr [[DST]], align 1
59 ; CHECK-NEXT: ret void
61 call void @callee_memcpy(ptr %dst, ptr %src, i64 4)
65 define void @caller_memmove(ptr %dst, ptr %src) {
66 ; CHECK-LABEL: define void @caller_memmove
67 ; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]]) local_unnamed_addr #[[ATTR1]] {
68 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[SRC]], align 1
69 ; CHECK-NEXT: store i32 [[TMP1]], ptr [[DST]], align 1
70 ; CHECK-NEXT: ret void
72 call void @callee_memmove(ptr %dst, ptr %src, i64 4)
76 define void @caller_mempcpy(ptr %dst, ptr %src) {
77 ; CHECK-LABEL: define void @caller_mempcpy
78 ; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]]) local_unnamed_addr #[[ATTR1]] {
79 ; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[SRC]], align 1
80 ; CHECK-NEXT: store i32 [[TMP1]], ptr [[DST]], align 1
81 ; CHECK-NEXT: ret void
83 call void @callee_mempcpy(ptr %dst, ptr %src, i64 4)
87 define void @caller_memset(ptr %dst) {
88 ; CHECK-LABEL: define void @caller_memset
89 ; CHECK-SAME: (ptr [[DST:%.*]]) local_unnamed_addr #[[ATTR0]] {
90 ; CHECK-NEXT: store i32 0, ptr [[DST]], align 1
91 ; CHECK-NEXT: ret void
93 call void @callee_memset(ptr %dst, i64 4)