| ; RUN: llc < %s -mtriple=bpfel -verify-machineinstrs -bpf-max-stores-per-memfunc=1 | FileCheck %s --check-prefix=LIBCALL |
| |
| ; StoresNumEstimate = alignTo(16, 8) >> 3 = 2, which is greater than the |
| ; getCommonMaxStoresPerMemFunc() value of 1 from -bpf-max-stores-per-memfunc. |
| ; That prevents inline expansion and lets the generic memcpy libcall path fire. |
| define dso_local void @small_copy(ptr nocapture %dst, ptr nocapture readonly %src) local_unnamed_addr { |
| entry: |
| tail call void @llvm.memcpy.p0.p0.i64(ptr align 8 %dst, ptr align 8 %src, i64 16, i1 false) |
| ret void |
| } |
| |
| ; StoresNumEstimate = alignTo(16, 16) >> 4 = 1, so the threshold still allows |
| ; inline expansion here. The memcpy must still avoid BPF::MEMCPY because BPF |
| ; only supports alignment up to 8 bytes. |
| define dso_local void @align16_copy(ptr nocapture %dst, ptr nocapture readonly %src) local_unnamed_addr { |
| entry: |
| tail call void @llvm.memcpy.p0.p0.i64(ptr align 16 %dst, ptr align 16 %src, i64 16, i1 false) |
| ret void |
| } |
| |
| declare void @llvm.memcpy.p0.p0.i64(ptr nocapture writeonly, ptr nocapture readonly, i64, i1 immarg) |
| |
| ; LIBCALL-LABEL: small_copy: |
| ; LIBCALL: r3 = 16 |
| ; LIBCALL: call memcpy |
| ; LIBCALL-LABEL: align16_copy: |
| ; LIBCALL: r3 = 16 |
| ; LIBCALL: call memcpy |