93 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt %s -mtriple=arm64-apple-macosx -passes=inline -inline-threshold=2 -inline-call-penalty=5 -S | FileCheck %s3 4declare i64 @llvm.objectsize.i64.p0(ptr, i1, i1, i1)5declare ptr @__memcpy_chk(ptr, ptr, i64, i64)6declare ptr @__memmove_chk(ptr, ptr, i64, i64)7declare ptr @__mempcpy_chk(ptr, ptr, i64, i64)8declare ptr @__memset_chk(ptr, i32, i64, i64)9 10define void @callee(ptr %dst, ptr %src, i64 %size) {11; CHECK-LABEL: define void @callee12; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[SIZE:%.*]]) {13; CHECK-NEXT: [[OBJSIZE:%.*]] = call i64 @llvm.objectsize.i64.p0(ptr [[DST]], i1 false, i1 true, i1 false)14; CHECK-NEXT: [[CALL_MEMCPY:%.*]] = call ptr @__memcpy_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 [[OBJSIZE]])15; CHECK-NEXT: [[CALL_MEMMOVE:%.*]] = call ptr @__memmove_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 [[OBJSIZE]])16; CHECK-NEXT: [[CALL_MEMPCPY:%.*]] = call ptr @__mempcpy_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 [[OBJSIZE]])17; CHECK-NEXT: [[CALL_MEMSET:%.*]] = call ptr @__memset_chk(ptr [[DST]], i32 0, i64 [[SIZE]], i64 [[OBJSIZE]])18; CHECK-NEXT: ret void19;20 %objsize = call i64 @llvm.objectsize.i64.p0(ptr %dst, i1 false, i1 true, i1 false)21 %call.memcpy = call ptr @__memcpy_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)22 %call.memmove = call ptr @__memmove_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)23 %call.mempcpy = call ptr @__mempcpy_chk(ptr %dst, ptr %src, i64 %size, i64 %objsize)24 %call.memset = call ptr @__memset_chk(ptr %dst, i32 0, i64 %size, i64 %objsize)25 ret void26}27 28define void @caller(ptr %dst, ptr %src) {29; CHECK-LABEL: define void @caller30; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]]) {31; CHECK-NEXT: [[OBJSIZE_I:%.*]] = call i64 @llvm.objectsize.i64.p0(ptr [[DST]], i1 false, i1 true, i1 false)32; CHECK-NEXT: [[CALL_MEMCPY_I:%.*]] = call ptr @__memcpy_chk(ptr [[DST]], ptr [[SRC]], i64 4, i64 [[OBJSIZE_I]])33; CHECK-NEXT: [[CALL_MEMMOVE_I:%.*]] = call ptr @__memmove_chk(ptr [[DST]], ptr [[SRC]], i64 4, i64 [[OBJSIZE_I]])34; CHECK-NEXT: [[CALL_MEMPCPY_I:%.*]] = call ptr @__mempcpy_chk(ptr [[DST]], ptr [[SRC]], i64 4, i64 [[OBJSIZE_I]])35; CHECK-NEXT: [[CALL_MEMSET_I:%.*]] = call ptr @__memset_chk(ptr [[DST]], i32 0, i64 4, i64 [[OBJSIZE_I]])36; CHECK-NEXT: ret void37;38 call void @callee(ptr %dst, ptr %src, i64 4)39 ret void40}41 42define void @objsize_toosmall_callee(ptr %dst, ptr %src, i64 %size) {43; CHECK-LABEL: define void @objsize_toosmall_callee44; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[SIZE:%.*]]) {45; CHECK-NEXT: [[CALL_MEMCPY:%.*]] = call ptr @__memcpy_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 1)46; CHECK-NEXT: [[CALL_MEMMOVE:%.*]] = call ptr @__memmove_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 1)47; CHECK-NEXT: [[CALL_MEMPCPY:%.*]] = call ptr @__mempcpy_chk(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i64 1)48; CHECK-NEXT: [[CALL_MEMSET:%.*]] = call ptr @__memset_chk(ptr [[DST]], i32 0, i64 [[SIZE]], i64 1)49; CHECK-NEXT: ret void50;51 %call.memcpy = call ptr @__memcpy_chk(ptr %dst, ptr %src, i64 %size, i64 1)52 %call.memmove = call ptr @__memmove_chk(ptr %dst, ptr %src, i64 %size, i64 1)53 %call.mempcpy = call ptr @__mempcpy_chk(ptr %dst, ptr %src, i64 %size, i64 1)54 %call.memset = call ptr @__memset_chk(ptr %dst, i32 0, i64 %size, i64 1)55 ret void56}57 58define void @objsize_toosmall_caller(ptr %dst, ptr %src) {59; CHECK-LABEL: define void @objsize_toosmall_caller60; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]]) {61; CHECK-NEXT: call void @objsize_toosmall_callee(ptr [[DST]], ptr [[SRC]], i64 4)62; CHECK-NEXT: ret void63;64 call void @objsize_toosmall_callee(ptr %dst, ptr %src, i64 4)65 ret void66}67 68define void @intrinsics_callee(ptr %dst, ptr %src, i64 %size) {69; CHECK-LABEL: define void @intrinsics_callee70; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]], i64 [[SIZE:%.*]]) {71; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i1 false)72; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 [[SIZE]], i1 false)73; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[DST]], i8 0, i64 [[SIZE]], i1 false)74; CHECK-NEXT: ret void75;76 call void @llvm.memcpy.p0.p0.i64(ptr %dst, ptr %src, i64 %size, i1 false)77 call void @llvm.memmove.p0.p0.i64(ptr %dst, ptr %src, i64 %size, i1 false)78 call void @llvm.memset.p0.i64(ptr %dst, i8 0, i64 %size, i1 false)79 ret void80}81 82define void @intrinsics_caller(ptr %dst, ptr %src) {83; CHECK-LABEL: define void @intrinsics_caller84; CHECK-SAME: (ptr [[DST:%.*]], ptr [[SRC:%.*]]) {85; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 4, i1 false)86; CHECK-NEXT: call void @llvm.memmove.p0.p0.i64(ptr [[DST]], ptr [[SRC]], i64 4, i1 false)87; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr [[DST]], i8 0, i64 4, i1 false)88; CHECK-NEXT: ret void89;90 call void @intrinsics_callee(ptr %dst, ptr %src, i64 4)91 ret void92}93