[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