[llvm] [TTI] Provide a cost for memset_pattern which matches the libcall (PR #139978)
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Wed May 28 09:29:22 PDT 2025
https://github.com/preames updated https://github.com/llvm/llvm-project/pull/139978
>From aee4e570798c94ab030089a288ed88a7a179b9bb Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Wed, 14 May 2025 16:08:37 -0700
Subject: [PATCH 1/3] Precommit tests
---
.../Analysis/CostModel/X86/memset-pattern.ll | 40 +++++++++++++++++++
1 file changed, 40 insertions(+)
create mode 100644 llvm/test/Analysis/CostModel/X86/memset-pattern.ll
diff --git a/llvm/test/Analysis/CostModel/X86/memset-pattern.ll b/llvm/test/Analysis/CostModel/X86/memset-pattern.ll
new file mode 100644
index 0000000000000..011ae703c746a
--- /dev/null
+++ b/llvm/test/Analysis/CostModel/X86/memset-pattern.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4
+; RUN: opt < %s -mtriple=x86_64-apple-darwin10.0.0 -passes="print<cost-model>" 2>&1 -disable-output | FileCheck %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+
+target triple = "x86_64-apple-darwin10.0.0"
+
+ at .memset_pattern = private unnamed_addr constant [4 x i32] [i32 2, i32 2, i32 2, i32 2], align 16
+
+define void @via_libcall(ptr %p) nounwind ssp {
+; CHECK-LABEL: 'via_libcall'
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @memset_pattern4(ptr %p, ptr @.memset_pattern, i64 200)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @memset_pattern8(ptr %p, ptr @.memset_pattern, i64 200)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @memset_pattern16(ptr %p, ptr @.memset_pattern, i64 200)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
+;
+ call void @memset_pattern4(ptr %p, ptr @.memset_pattern, i64 200)
+ call void @memset_pattern8(ptr %p, ptr @.memset_pattern, i64 200)
+ call void @memset_pattern16(ptr %p, ptr @.memset_pattern, i64 200)
+ ret void
+}
+
+declare void @memset_pattern4(ptr, ptr, i64)
+declare void @memset_pattern8(ptr, ptr, i64)
+declare void @memset_pattern16(ptr, ptr, i64)
+
+define void @via_intrinsic(ptr %p) {
+; CHECK-LABEL: 'via_intrinsic'
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i16.i64(ptr align 4 %p, i16 2, i64 100, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr align 4 %p, i32 2, i64 50, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i64.i64(ptr align 4 %p, i64 2, i64 25, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i128.i64(ptr align 4 %p, i128 2, i64 12, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
+;
+ call void @llvm.experimental.memset.pattern(ptr align 4 %p, i16 2, i64 100, i1 false)
+ call void @llvm.experimental.memset.pattern(ptr align 4 %p, i32 2, i64 50, i1 false)
+ call void @llvm.experimental.memset.pattern(ptr align 4 %p, i64 2, i64 25, i1 false)
+ call void @llvm.experimental.memset.pattern(ptr align 4 %p, i128 2, i64 12, i1 false)
+ ret void
+}
>From 4afb264df37681a7188cb5231cb90e5f38b0c36c Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Wed, 14 May 2025 16:11:40 -0700
Subject: [PATCH 2/3] [TTI] Provide a cost for memset_pattern which matches the
libcall
The motivation is that differences in unrolling were noticed when
trying to swich from the libcall to the intrinsic. Neither cost
is a good, well considered cost, but for the moment, let's have
them be equal to simplify migration.
---
llvm/include/llvm/CodeGen/BasicTTIImpl.h | 3 +++
llvm/test/Analysis/CostModel/X86/memset-pattern.ll | 8 ++++----
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
index ff8778168686d..449e9e8f85561 100644
--- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h
+++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
@@ -2408,6 +2408,9 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
CmpInst::ICMP_ULT, CostKind);
return Cost;
}
+ case Intrinsic::experimental_memset_pattern:
+ // This cost is set to match the cost of the memset_pattern16 libcall
+ return TTI::TCC_Basic * 4;
case Intrinsic::abs:
ISD = ISD::ABS;
break;
diff --git a/llvm/test/Analysis/CostModel/X86/memset-pattern.ll b/llvm/test/Analysis/CostModel/X86/memset-pattern.ll
index 011ae703c746a..aa0c6efdf34fa 100644
--- a/llvm/test/Analysis/CostModel/X86/memset-pattern.ll
+++ b/llvm/test/Analysis/CostModel/X86/memset-pattern.ll
@@ -26,10 +26,10 @@ declare void @memset_pattern16(ptr, ptr, i64)
define void @via_intrinsic(ptr %p) {
; CHECK-LABEL: 'via_intrinsic'
-; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i16.i64(ptr align 4 %p, i16 2, i64 100, i1 false)
-; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr align 4 %p, i32 2, i64 50, i1 false)
-; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i64.i64(ptr align 4 %p, i64 2, i64 25, i1 false)
-; CHECK-NEXT: Cost Model: Found an estimated cost of 1 for instruction: call void @llvm.experimental.memset.pattern.p0.i128.i64(ptr align 4 %p, i128 2, i64 12, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.experimental.memset.pattern.p0.i16.i64(ptr align 4 %p, i16 2, i64 100, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.experimental.memset.pattern.p0.i32.i64(ptr align 4 %p, i32 2, i64 50, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.experimental.memset.pattern.p0.i64.i64(ptr align 4 %p, i64 2, i64 25, i1 false)
+; CHECK-NEXT: Cost Model: Found an estimated cost of 4 for instruction: call void @llvm.experimental.memset.pattern.p0.i128.i64(ptr align 4 %p, i128 2, i64 12, i1 false)
; CHECK-NEXT: Cost Model: Found an estimated cost of 0 for instruction: ret void
;
call void @llvm.experimental.memset.pattern(ptr align 4 %p, i16 2, i64 100, i1 false)
>From f6d068bfe372f90589035c2ab104aec0b1c7dbc9 Mon Sep 17 00:00:00 2001
From: Philip Reames <preames at rivosinc.com>
Date: Wed, 28 May 2025 09:25:16 -0700
Subject: [PATCH 3/3] Address review comment
---
llvm/include/llvm/CodeGen/BasicTTIImpl.h | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
index 449e9e8f85561..574152e254f15 100644
--- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h
+++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h
@@ -2409,7 +2409,9 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> {
return Cost;
}
case Intrinsic::experimental_memset_pattern:
- // This cost is set to match the cost of the memset_pattern16 libcall
+ // This cost is set to match the cost of the memset_pattern16 libcall.
+ // It should likely be re-evaluated after migration to this intrinsic
+ // is complete.
return TTI::TCC_Basic * 4;
case Intrinsic::abs:
ISD = ISD::ABS;
More information about the llvm-commits
mailing list