[llvm] [bolt][aarch64] Add load-acquire & store-release instructions (PR #146035)

Alexey Moksyakov via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 30 00:55:30 PDT 2025


https://github.com/yavtuk updated https://github.com/llvm/llvm-project/pull/146035

>From 7980b9c29997ba13e17575dd1b8b5a46f408ba7b Mon Sep 17 00:00:00 2001
From: Alexey Moksyakov <moksyakov.alexey at huawei.com>
Date: Fri, 27 Jun 2025 10:24:49 +0300
Subject: [PATCH] [bolt][aarch64] Add load-acquire & store-release instructions

This patch adds checking for the load-acquire & store-release
instructions since a operand can be SP register.
---
 .../Target/AArch64/AArch64MCPlusBuilder.cpp   | 90 +++++++++++++------
 1 file changed, 65 insertions(+), 25 deletions(-)

diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
index 612c1304efd60..f1522217c06f4 100644
--- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
+++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp
@@ -661,6 +661,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     case AArch64::LDTRBi:
     case AArch64::LDTRSBWi:
     case AArch64::LDTRSBXi:
+    case AArch64::LDARB:
       return true;
     default:
       break;
@@ -699,6 +700,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     case AArch64::LDTRHi:
     case AArch64::LDTRSHWi:
     case AArch64::LDTRSHXi:
+    case AArch64::LDARH:
       return true;
     default:
       break;
@@ -733,6 +735,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     case AArch64::LDPSWpost:
     case AArch64::LDPSWpre:
     case AArch64::LDNPWi:
+    case AArch64::LDARW:
       return true;
     default:
       break;
@@ -756,6 +759,7 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
     case AArch64::LDPXi:
     case AArch64::LDPXpost:
     case AArch64::LDPXpre:
+    case AArch64::LDARX:
       return true;
     default:
       break;
@@ -850,33 +854,55 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
   }
 
   bool isAArch64ExclusiveLoad(const MCInst &Inst) const override {
-    return (Inst.getOpcode() == AArch64::LDXPX ||
-            Inst.getOpcode() == AArch64::LDXPW ||
-            Inst.getOpcode() == AArch64::LDXRX ||
-            Inst.getOpcode() == AArch64::LDXRW ||
-            Inst.getOpcode() == AArch64::LDXRH ||
-            Inst.getOpcode() == AArch64::LDXRB ||
-            Inst.getOpcode() == AArch64::LDAXPX ||
-            Inst.getOpcode() == AArch64::LDAXPW ||
-            Inst.getOpcode() == AArch64::LDAXRX ||
-            Inst.getOpcode() == AArch64::LDAXRW ||
-            Inst.getOpcode() == AArch64::LDAXRH ||
-            Inst.getOpcode() == AArch64::LDAXRB);
+    const unsigned opcode = Inst.getOpcode();
+    switch (opcode) {
+    case AArch64::LDXPX:
+    case AArch64::LDXPW:
+    case AArch64::LDXRX:
+    case AArch64::LDXRW:
+    case AArch64::LDXRH:
+    case AArch64::LDXRB:
+    case AArch64::LDAXPX:
+    case AArch64::LDAXPW:
+    case AArch64::LDAXRX:
+    case AArch64::LDAXRW:
+    case AArch64::LDAXRH:
+    case AArch64::LDAXRB:
+    case AArch64::LDAEX:
+    case AArch64::LDAEXB:
+    case AArch64::LDAEXH:
+    case AArch64::LDAEXD:
+      return true;
+    default:
+      break;
+    }
+    return false;
   }
 
   bool isAArch64ExclusiveStore(const MCInst &Inst) const override {
-    return (Inst.getOpcode() == AArch64::STXPX ||
-            Inst.getOpcode() == AArch64::STXPW ||
-            Inst.getOpcode() == AArch64::STXRX ||
-            Inst.getOpcode() == AArch64::STXRW ||
-            Inst.getOpcode() == AArch64::STXRH ||
-            Inst.getOpcode() == AArch64::STXRB ||
-            Inst.getOpcode() == AArch64::STLXPX ||
-            Inst.getOpcode() == AArch64::STLXPW ||
-            Inst.getOpcode() == AArch64::STLXRX ||
-            Inst.getOpcode() == AArch64::STLXRW ||
-            Inst.getOpcode() == AArch64::STLXRH ||
-            Inst.getOpcode() == AArch64::STLXRB);
+    const unsigned opcode = Inst.getOpcode();
+    switch (opcode) {
+    case AArch64::STXPX:
+    case AArch64::STXPW:
+    case AArch64::STXRX:
+    case AArch64::STXRW:
+    case AArch64::STXRH:
+    case AArch64::STXRB:
+    case AArch64::STLXPX:
+    case AArch64::STLXPW:
+    case AArch64::STLXRX:
+    case AArch64::STLXRW:
+    case AArch64::STLXRH:
+    case AArch64::STLXRB:
+    case AArch64::STLEX:
+    case AArch64::STLEXB:
+    case AArch64::STLEXH:
+    case AArch64::STLEXD:
+      return true;
+    default:
+      break;
+    }
+    return false;
   }
 
   bool isAArch64ExclusiveClear(const MCInst &Inst) const override {
@@ -1926,9 +1952,23 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
       return false;
     };
 
+    auto isStoreRelease = [&]() {
+      switch (opcode) {
+      case AArch64::STLRB:
+      case AArch64::STLRH:
+      case AArch64::STLRW:
+      case AArch64::STLRX:
+        return true;
+      default:
+        break;
+      }
+
+      return false;
+    };
+
     return isStoreRegUnscaleImm() || isStoreRegScaledImm() ||
            isStoreRegImmPreIndexed() || isStoreRegImmPostIndexed() ||
-           isStoreRegUnscaleUnpriv() || isStoreRegTrunc();
+           isStoreRegUnscaleUnpriv() || isStoreRegTrunc() || isStoreRelease();
   }
 
   bool mayStore(const MCInst &Inst) const override {



More information about the llvm-commits mailing list