[llvm] [MergeFuncs] Account for elementwise loads in FunctionComparator (PR #211478)

Harrison Hao via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 23 02:28:38 PDT 2026


https://github.com/harrisonGPU updated https://github.com/llvm/llvm-project/pull/211478

>From 2b561d5fdec0ed56254ae759ce80faf3181d55e2 Mon Sep 17 00:00:00 2001
From: Harrison Hao <tsworld1314 at gmail.com>
Date: Thu, 23 Jul 2026 15:13:29 +0800
Subject: [PATCH 1/2] [MergeFuncs] Account for elementwise loads in
 FunctionComparator

---
 .../Transforms/Utils/FunctionComparator.cpp   |  3 +++
 .../MergeFunc/atomic-load-elementwise.ll      | 22 +++++++++++++++++++
 2 files changed, 25 insertions(+)
 create mode 100644 llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll

diff --git a/llvm/lib/Transforms/Utils/FunctionComparator.cpp b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
index 80b02d579f5da..f3b595e05d881 100644
--- a/llvm/lib/Transforms/Utils/FunctionComparator.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
@@ -699,6 +699,9 @@ int FunctionComparator::cmpOperations(const Instruction *L,
   if (const LoadInst *LI = dyn_cast<LoadInst>(L)) {
     if (int Res = cmpNumbers(LI->isVolatile(), cast<LoadInst>(R)->isVolatile()))
       return Res;
+    if (int Res =
+            cmpNumbers(LI->isElementwise(), cast<LoadInst>(R)->isElementwise()))
+      return Res;
     if (int Res = cmpAligns(LI->getAlign(), cast<LoadInst>(R)->getAlign()))
       return Res;
     if (int Res =
diff --git a/llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll b/llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll
new file mode 100644
index 0000000000000..7bb76f61a8a49
--- /dev/null
+++ b/llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll
@@ -0,0 +1,22 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -S -passes=mergefunc %s | FileCheck %s
+
+define internal <2 x i32> @whole_vector_load(ptr %p) {
+; CHECK-LABEL: define internal <2 x i32> @whole_vector_load(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT:    [[VALUE:%.*]] = load atomic <2 x i32>, ptr [[P]] monotonic, align 4
+; CHECK-NEXT:    ret <2 x i32> [[VALUE]]
+;
+  %value = load atomic <2 x i32>, ptr %p monotonic, align 4
+  ret <2 x i32> %value
+}
+
+define internal <2 x i32> @elementwise_load(ptr %p) {
+; CHECK-LABEL: define internal <2 x i32> @elementwise_load(
+; CHECK-SAME: ptr [[P:%.*]]) {
+; CHECK-NEXT:    [[VALUE:%.*]] = load atomic elementwise <2 x i32>, ptr [[P]] monotonic, align 4
+; CHECK-NEXT:    ret <2 x i32> [[VALUE]]
+;
+  %value = load atomic elementwise <2 x i32>, ptr %p monotonic, align 4
+  ret <2 x i32> %value
+}

>From b476a593bf0e5ba7f336eef8708ccde273f40c33 Mon Sep 17 00:00:00 2001
From: Harrison Hao <tsworld1314 at gmail.com>
Date: Thu, 23 Jul 2026 17:26:35 +0800
Subject: [PATCH 2/2] Support atomicrmw

---
 .../Transforms/Utils/FunctionComparator.cpp   |  3 +++
 ...d-elementwise.ll => atomic-elementwise.ll} | 20 +++++++++++++++++++
 2 files changed, 23 insertions(+)
 rename llvm/test/Transforms/MergeFunc/{atomic-load-elementwise.ll => atomic-elementwise.ll} (50%)

diff --git a/llvm/lib/Transforms/Utils/FunctionComparator.cpp b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
index f3b595e05d881..c9cc62adc2604 100644
--- a/llvm/lib/Transforms/Utils/FunctionComparator.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
@@ -800,6 +800,9 @@ int FunctionComparator::cmpOperations(const Instruction *L,
     if (int Res = cmpNumbers(RMWI->isVolatile(),
                              cast<AtomicRMWInst>(R)->isVolatile()))
       return Res;
+    if (int Res = cmpNumbers(RMWI->isElementwise(),
+                             cast<AtomicRMWInst>(R)->isElementwise()))
+      return Res;
     if (int Res = cmpOrderings(RMWI->getOrdering(),
                                cast<AtomicRMWInst>(R)->getOrdering()))
       return Res;
diff --git a/llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll b/llvm/test/Transforms/MergeFunc/atomic-elementwise.ll
similarity index 50%
rename from llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll
rename to llvm/test/Transforms/MergeFunc/atomic-elementwise.ll
index 7bb76f61a8a49..9f756c3aaa25b 100644
--- a/llvm/test/Transforms/MergeFunc/atomic-load-elementwise.ll
+++ b/llvm/test/Transforms/MergeFunc/atomic-elementwise.ll
@@ -20,3 +20,23 @@ define internal <2 x i32> @elementwise_load(ptr %p) {
   %value = load atomic elementwise <2 x i32>, ptr %p monotonic, align 4
   ret <2 x i32> %value
 }
+
+define internal <2 x i32> @whole_vector_atomicrmw(ptr %p, <2 x i32> %value) {
+; CHECK-LABEL: define internal <2 x i32> @whole_vector_atomicrmw(
+; CHECK-SAME: ptr [[P:%.*]], <2 x i32> [[VALUE:%.*]]) {
+; CHECK-NEXT:    [[OLD:%.*]] = atomicrmw add ptr [[P]], <2 x i32> [[VALUE]] monotonic, align 8
+; CHECK-NEXT:    ret <2 x i32> [[OLD]]
+;
+  %old = atomicrmw add ptr %p, <2 x i32> %value monotonic, align 8
+  ret <2 x i32> %old
+}
+
+define internal <2 x i32> @elementwise_atomicrmw(ptr %p, <2 x i32> %value) {
+; CHECK-LABEL: define internal <2 x i32> @elementwise_atomicrmw(
+; CHECK-SAME: ptr [[P:%.*]], <2 x i32> [[VALUE:%.*]]) {
+; CHECK-NEXT:    [[OLD:%.*]] = atomicrmw elementwise add ptr [[P]], <2 x i32> [[VALUE]] monotonic, align 8
+; CHECK-NEXT:    ret <2 x i32> [[OLD]]
+;
+  %old = atomicrmw elementwise add ptr %p, <2 x i32> %value monotonic, align 8
+  ret <2 x i32> %old
+}



More information about the llvm-commits mailing list