From a47847987fb0ea7a4c57bb57fc4fad3af30fcf5e Mon Sep 17 00:00:00 2001 From: Harald van Dijk Date: Fri, 2 May 2025 23:53:47 +0100 Subject: [PATCH] [ARM] Do not assume memory intrinsics specify alignment. --- llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp | 6 +++--- llvm/test/Analysis/CostModel/ARM/memcpy.ll | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp index c3cb700b21c68..e6f90abc3d63d 100644 --- a/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp +++ b/llvm/lib/Target/ARM/ARMTargetTransformInfo.cpp @@ -1169,8 +1169,8 @@ int ARMTTIImpl::getNumMemOps(const IntrinsicInst *I) const { return -1; const unsigned Size = C->getValue().getZExtValue(); - const Align DstAlign = *MC->getDestAlign(); - const Align SrcAlign = *MC->getSourceAlign(); + const Align DstAlign = MC->getDestAlign().valueOrOne(); + const Align SrcAlign = MC->getSourceAlign().valueOrOne(); MOp = MemOp::Copy(Size, /*DstAlignCanChange*/ false, DstAlign, SrcAlign, /*IsVolatile*/ false); @@ -1184,7 +1184,7 @@ int ARMTTIImpl::getNumMemOps(const IntrinsicInst *I) const { return -1; const unsigned Size = C->getValue().getZExtValue(); - const Align DstAlign = *MS->getDestAlign(); + const Align DstAlign = MS->getDestAlign().valueOrOne(); MOp = MemOp::Set(Size, /*DstAlignCanChange*/ false, DstAlign, /*IsZeroMemset*/ false, /*IsVolatile*/ false); diff --git a/llvm/test/Analysis/CostModel/ARM/memcpy.ll b/llvm/test/Analysis/CostModel/ARM/memcpy.ll index 1a66b2b55cc46..f397397125c05 100644 --- a/llvm/test/Analysis/CostModel/ARM/memcpy.ll +++ b/llvm/test/Analysis/CostModel/ARM/memcpy.ll @@ -11,6 +11,22 @@ target triple = "thumbv7m-arm-unknown-eabi" ; Align 1, 1 ;;;;;;;;;;;; +define void @memcpy_0(ptr %d, ptr %s) { +; +; with/without strict-align: +; +; ldrb r1, [r1] +; strb r1, [r0] +; +; COMMON-LABEL: 'memcpy_0' +; COMMON-NEXT: Cost Model: Found an estimated cost of 2 for instruction: call void @llvm.memcpy.p0.p0.i32(ptr %d, ptr %s, i32 1, i1 false) +; COMMON-NEXT: Cost Model: Found an estimated cost of 1 for instruction: ret void +; +entry: + call void @llvm.memcpy.p0.p0.i32(ptr %d, ptr %s, i32 1, i1 false) + ret void +} + define void @memcpy_1(ptr %d, ptr %s) { ; ; with/without strict-align: