[llvm] [ARM] Do not assume memory intrinsics specify alignment. (PR #138356)
Harald van Dijk via llvm-commits
llvm-commits at lists.llvm.org
Fri May 2 16:00:18 PDT 2025
https://github.com/hvdijk created https://github.com/llvm/llvm-project/pull/138356
None
>From a47847987fb0ea7a4c57bb57fc4fad3af30fcf5e Mon Sep 17 00:00:00 2001
From: Harald van Dijk <harald.vandijk at codeplay.com>
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:
More information about the llvm-commits
mailing list