[clang] [llvm] Remove __arm_atomic_store_with_stshh from llvm (PR #192419)

via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 16 03:04:01 PDT 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-x86

Author: Lukacma

<details>
<summary>Changes</summary>

Current implementation of __arm_atomic_store_with_stshh is incorrect as it doesn't enforce the memory ordering constraints as can be seen [here](https://godbolt.org/z/n5YnbaT8E). Different solution will need to be implemented, but removing for now so users don't pick this up. 

I have also added an auto upgrade for the intrinsic for the propriety sake.

---

Patch is 38.92 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/192419.diff


18 Files Affected:

- (modified) clang/include/clang/Basic/BuiltinsAArch64.td (-5) 
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (-8) 
- (modified) clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp (-7) 
- (modified) clang/lib/CodeGen/TargetBuiltins/ARM.cpp (-27) 
- (modified) clang/lib/Headers/arm_acle.h (-8) 
- (modified) clang/lib/Sema/SemaARM.cpp (-100) 
- (removed) clang/test/CodeGen/AArch64/pcdphint-atomic-store.c (-71) 
- (modified) clang/test/CodeGen/arm_acle.c (-11) 
- (modified) clang/test/CodeGen/builtins-arm64.c (-5) 
- (removed) clang/test/Sema/AArch64/pcdphint-atomic-store.c (-74) 
- (modified) llvm/include/llvm/IR/IntrinsicsAArch64.td (-6) 
- (modified) llvm/lib/IR/AutoUpgrade.cpp (+31) 
- (modified) llvm/lib/IR/Verifier.cpp (-19) 
- (modified) llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp (-70) 
- (modified) llvm/lib/Target/AArch64/AArch64InstrInfo.td (-13) 
- (added) llvm/test/Assembler/autoupgrade-aarch64-stshh-atomic-store.ll (+27) 
- (removed) llvm/test/CodeGen/AArch64/pcdphint-atomic-store.ll (-243) 
- (modified) llvm/test/Verifier/AArch64/intrinsic-immarg.ll (-47) 


``````````diff
diff --git a/clang/include/clang/Basic/BuiltinsAArch64.td b/clang/include/clang/Basic/BuiltinsAArch64.td
index 48ad4cb16f14c..8e5dbb5f4172d 100644
--- a/clang/include/clang/Basic/BuiltinsAArch64.td
+++ b/clang/include/clang/Basic/BuiltinsAArch64.td
@@ -171,11 +171,6 @@ let Attributes = [NoThrow], Features = "ls64" in {
 	def st64bv0 : AArch64TargetBuiltin<"uint64_t (void *, uint64_t const *)">;
 }
 
-// Atomic store with PCDPHINT
-let Attributes = [CustomTypeChecking] in {
-	def atomic_store_with_stshh : AArch64TargetBuiltin<"void (...)">;
-}
-
 // Armv9.3-A Guarded Control Stack
 let Attributes = [NoThrow], Features = "gcs" in {
 	def gcspopm : AArch64TargetBuiltin<"uint64_t (uint64_t)">;
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 4d352f1def04b..d051bb02c0af2 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -9587,14 +9587,6 @@ def err_atomic_builtin_must_be_pointer_intfltptr : Error<
 def err_atomic_builtin_pointer_size : Error<
   "address argument to atomic builtin must be a pointer to 1,2,4,8 or 16 byte "
   "type (%0 invalid)">;
-def err_arm_atomic_store_with_stshh_bad_type : Error<
-  "address argument to '__arm_atomic_store_with_stshh' must be a pointer to an "
-  "8,16,32, or 64-bit integer type (%0 invalid)">;
-def err_arm_atomic_store_with_stshh_bad_value_type : Error<
-  "value argument to '__arm_atomic_store_with_stshh' must be %0; got %1">;
-def err_arm_atomic_store_with_stshh_bad_order : Error<
-  "memory order argument to '__arm_atomic_store_with_stshh' must be one of "
-  "__ATOMIC_RELAXED, __ATOMIC_RELEASE, or __ATOMIC_SEQ_CST">;
 def err_atomic_exclusive_builtin_pointer_size : Error<
   "address argument to load or store exclusive builtin must be a pointer to "
   // Because the range of legal sizes for load/store exclusive varies with the
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
index d9d303cd07b92..45c5d3201f8e3 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp
@@ -1588,13 +1588,6 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr,
     return mlir::Value{};
   }
 
-  if (builtinID == clang::AArch64::BI__builtin_arm_atomic_store_with_stshh) {
-    cgm.errorNYI(expr->getSourceRange(),
-                 std::string("unimplemented AArch64 builtin call: ") +
-                     getContext().BuiltinInfo.getName(builtinID));
-    return mlir::Value{};
-  }
-
   if (builtinID == clang::AArch64::BI__builtin_arm_rndr ||
       builtinID == clang::AArch64::BI__builtin_arm_rndrrs) {
     cgm.errorNYI(expr->getSourceRange(),
diff --git a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp
index 8ec2f5b83085c..17c811221a702 100644
--- a/clang/lib/CodeGen/TargetBuiltins/ARM.cpp
+++ b/clang/lib/CodeGen/TargetBuiltins/ARM.cpp
@@ -4673,33 +4673,6 @@ Value *CodeGenFunction::EmitAArch64BuiltinExpr(unsigned BuiltinID,
     return Builder.CreateCall(F, Args);
   }
 
-  if (BuiltinID == clang::AArch64::BI__builtin_arm_atomic_store_with_stshh) {
-    Value *StoreAddr = EmitScalarExpr(E->getArg(0));
-    Value *StoreValue = EmitScalarExpr(E->getArg(1));
-
-    auto *OrderC = cast<ConstantInt>(EmitScalarExpr(E->getArg(2)));
-    auto *PolicyC = cast<ConstantInt>(EmitScalarExpr(E->getArg(3)));
-
-    // Compute pointee bit-width from arg0 and create as i32 constant
-    QualType ValQT =
-        E->getArg(0)->getType()->castAs<PointerType>()->getPointeeType();
-    unsigned SizeBits = getContext().getTypeSize(ValQT);
-    auto *SizeC = llvm::ConstantInt::get(Int32Ty, SizeBits);
-
-    Value *StoreValue64 = Builder.CreateIntCast(StoreValue, Int64Ty,
-                                                ValQT->isSignedIntegerType());
-
-    Function *F = CGM.getIntrinsic(Intrinsic::aarch64_stshh_atomic_store,
-                                   {StoreAddr->getType()});
-
-    // Emit a single intrinsic so backend can expand to STSHH followed by
-    // atomic store, to guarantee STSHH immediately precedes STR insn
-    return Builder.CreateCall(
-        F, {StoreAddr, StoreValue64,
-            ConstantInt::get(Int32Ty, OrderC->getZExtValue()),
-            ConstantInt::get(Int32Ty, PolicyC->getZExtValue()), SizeC});
-  }
-
   if (BuiltinID == clang::AArch64::BI__builtin_arm_rndr ||
       BuiltinID == clang::AArch64::BI__builtin_arm_rndrrs) {
 
diff --git a/clang/lib/Headers/arm_acle.h b/clang/lib/Headers/arm_acle.h
index 929c88cf72ef2..9a6b6a837fa5a 100644
--- a/clang/lib/Headers/arm_acle.h
+++ b/clang/lib/Headers/arm_acle.h
@@ -840,14 +840,6 @@ __rndrrs(uint64_t *__p) {
 }
 #endif
 
-/* Atomic store with PCDPHINT */
-#if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
-#define __arm_atomic_store_with_stshh(ptr, data, memory_order,                 \
-                                      retention_policy)                        \
-  __builtin_arm_atomic_store_with_stshh(ptr, data, memory_order,               \
-                                        retention_policy)
-#endif
-
 /* 11.2 Guarded Control Stack intrinsics */
 #if defined(__ARM_64BIT_STATE) && __ARM_64BIT_STATE
 static __inline__ void * __attribute__((__always_inline__, __nodebug__))
diff --git a/clang/lib/Sema/SemaARM.cpp b/clang/lib/Sema/SemaARM.cpp
index e54c8228e5ff8..29cf6fcd5be7e 100644
--- a/clang/lib/Sema/SemaARM.cpp
+++ b/clang/lib/Sema/SemaARM.cpp
@@ -1107,103 +1107,6 @@ bool SemaARM::CheckARMBuiltinFunctionCall(const TargetInfo &TI,
   }
 }
 
-static bool CheckAArch64AtomicStoreWithStshhCall(SemaARM &S,
-                                                 CallExpr *TheCall) {
-  Sema &SemaRef = S.SemaRef;
-  ASTContext &Context = S.getASTContext();
-  // Ensure we have the proper number of arguments.
-  if (SemaRef.checkArgCount(TheCall, 4))
-    return true;
-
-  // Normalize arg0/arg1 into value form, and check valid
-  ExprResult PtrRes =
-      SemaRef.DefaultFunctionArrayLvalueConversion(TheCall->getArg(0));
-  ExprResult ValRes =
-      SemaRef.DefaultFunctionArrayLvalueConversion(TheCall->getArg(1));
-
-  if (PtrRes.isInvalid() || ValRes.isInvalid())
-    return true;
-
-  Expr *OrderArg = TheCall->getArg(2);
-  TheCall->setArg(0, PtrRes.get());
-  TheCall->setArg(1, ValRes.get());
-
-  // Defer validation for dependent memory_order arguments.
-  if (OrderArg->isValueDependent())
-    return false;
-
-  Expr *PointerArg = PtrRes.get();
-  QualType PtrType = PointerArg->getType();
-
-  // Check arg 0 is a pointer type, err out if not
-  const PointerType *PointerTy = PtrType->getAs<PointerType>();
-  if (!PointerTy) {
-    SemaRef.Diag(PointerArg->getBeginLoc(),
-                 diag::err_atomic_builtin_must_be_pointer)
-        << PtrType << 0 << PointerArg->getSourceRange();
-    return true;
-  }
-
-  // Reject const-qualified pointee types
-  QualType ValType = PointerTy->getPointeeType();
-  if (ValType.isConstQualified()) {
-    SemaRef.Diag(PointerArg->getBeginLoc(),
-                 diag::err_atomic_builtin_cannot_be_const)
-        << PtrType << PointerArg->getSourceRange();
-    return true;
-  }
-
-  ValType = ValType.getUnqualifiedType();
-  unsigned Bits = ValType->isIntegerType() ? Context.getTypeSize(ValType) : 0;
-  if (Bits != 8 && Bits != 16 && Bits != 32 && Bits != 64) {
-    SemaRef.Diag(PointerArg->getBeginLoc(),
-                 diag::err_arm_atomic_store_with_stshh_bad_type)
-        << PtrType << PointerArg->getSourceRange();
-    return true;
-  }
-
-  Expr *ValArg = TheCall->getArg(1);
-  QualType ValArgType = ValArg->getType().getUnqualifiedType();
-
-  // Check value type and width
-  if (!Context.hasSameType(ValArgType, ValType)) {
-    SemaRef.Diag(ValArg->getBeginLoc(),
-                 diag::err_arm_atomic_store_with_stshh_bad_value_type)
-        << ValType << ValArg->getType() << ValArg->getSourceRange();
-    return true;
-  }
-
-  // Require an order value.
-  std::optional<llvm::APSInt> OrderValOpt =
-      OrderArg->getIntegerConstantExpr(Context);
-  if (!OrderValOpt) {
-    SemaRef.Diag(OrderArg->getBeginLoc(),
-                 diag::err_arm_atomic_store_with_stshh_bad_order)
-        << OrderArg->getSourceRange();
-    return true;
-  }
-
-  // __ATOMIC_RELAXED=0, __ATOMIC_RELEASE=3, __ATOMIC_SEQ_CST=5.
-  int64_t Order = OrderValOpt->getSExtValue();
-  if (Order != 0 && Order != 3 && Order != 5) {
-    SemaRef.Diag(OrderArg->getBeginLoc(),
-                 diag::err_arm_atomic_store_with_stshh_bad_order)
-        << OrderArg->getSourceRange();
-    return true;
-  }
-
-  // Value type already matches ValType above; apply a no-op cast for
-  // consistency with other builtin argument rewriting paths.
-  ExprResult ValArgRes = SemaRef.ImpCastExprToType(ValArg, ValType, CK_NoOp);
-  if (ValArgRes.isInvalid())
-    return true;
-
-  TheCall->setArg(1, ValArgRes.get());
-
-  // Arg 3 (retention policy) must be between KEEP(0) and STRM(1).
-  return SemaRef.BuiltinConstantArgRange(TheCall, 3, 0, 1);
-}
-
 bool SemaARM::CheckAArch64BuiltinFunctionCall(const TargetInfo &TI,
                                               unsigned BuiltinID,
                                               CallExpr *TheCall) {
@@ -1214,9 +1117,6 @@ bool SemaARM::CheckAArch64BuiltinFunctionCall(const TargetInfo &TI,
     return CheckARMBuiltinExclusiveCall(TI, BuiltinID, TheCall);
   }
 
-  if (BuiltinID == AArch64::BI__builtin_arm_atomic_store_with_stshh)
-    return CheckAArch64AtomicStoreWithStshhCall(*this, TheCall);
-
   if (BuiltinID == AArch64::BI__builtin_arm_prefetch) {
     return SemaRef.BuiltinConstantArgRange(TheCall, 1, 0, 1) ||
            SemaRef.BuiltinConstantArgRange(TheCall, 2, 0, 3) ||
diff --git a/clang/test/CodeGen/AArch64/pcdphint-atomic-store.c b/clang/test/CodeGen/AArch64/pcdphint-atomic-store.c
deleted file mode 100644
index f48f1d6344bc5..0000000000000
--- a/clang/test/CodeGen/AArch64/pcdphint-atomic-store.c
+++ /dev/null
@@ -1,71 +0,0 @@
-// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
-// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o - %s | FileCheck %s
-
-#include <arm_acle.h>
-
-// CHECK-LABEL: define dso_local void @test_u8(
-// CHECK-SAME: ptr noundef [[P:%.*]], i8 noundef [[V:%.*]]) #[[ATTR0:[0-9]+]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
-// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i8, align 1
-// CHECK-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    store i8 [[V]], ptr [[V_ADDR]], align 1
-// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    [[TMP1:%.*]] = load i8, ptr [[V_ADDR]], align 1
-// CHECK-NEXT:    [[TMP2:%.*]] = zext i8 [[TMP1]] to i64
-// CHECK-NEXT:    call void @llvm.aarch64.stshh.atomic.store.p0(ptr [[TMP0]], i64 [[TMP2]], i32 0, i32 0, i32 8)
-// CHECK-NEXT:    ret void
-//
-void test_u8(unsigned char *p, unsigned char v) {
-  __arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-}
-
-// CHECK-LABEL: define dso_local void @test_u16(
-// CHECK-SAME: ptr noundef [[P:%.*]], i16 noundef [[V:%.*]]) #[[ATTR0]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
-// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i16, align 2
-// CHECK-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    store i16 [[V]], ptr [[V_ADDR]], align 2
-// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    [[TMP1:%.*]] = load i16, ptr [[V_ADDR]], align 2
-// CHECK-NEXT:    [[TMP2:%.*]] = zext i16 [[TMP1]] to i64
-// CHECK-NEXT:    call void @llvm.aarch64.stshh.atomic.store.p0(ptr [[TMP0]], i64 [[TMP2]], i32 3, i32 1, i32 16)
-// CHECK-NEXT:    ret void
-//
-void test_u16(unsigned short *p, unsigned short v) {
-  __arm_atomic_store_with_stshh(p, v, __ATOMIC_RELEASE, 1);
-}
-
-// CHECK-LABEL: define dso_local void @test_u32(
-// CHECK-SAME: ptr noundef [[P:%.*]], i32 noundef [[V:%.*]]) #[[ATTR0]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
-// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i32, align 4
-// CHECK-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    store i32 [[V]], ptr [[V_ADDR]], align 4
-// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    [[TMP1:%.*]] = load i32, ptr [[V_ADDR]], align 4
-// CHECK-NEXT:    [[TMP2:%.*]] = zext i32 [[TMP1]] to i64
-// CHECK-NEXT:    call void @llvm.aarch64.stshh.atomic.store.p0(ptr [[TMP0]], i64 [[TMP2]], i32 5, i32 0, i32 32)
-// CHECK-NEXT:    ret void
-//
-void test_u32(unsigned int *p, unsigned int v) {
-  __arm_atomic_store_with_stshh(p, v, __ATOMIC_SEQ_CST, 0);
-}
-
-// CHECK-LABEL: define dso_local void @test_u64(
-// CHECK-SAME: ptr noundef [[P:%.*]], i64 noundef [[V:%.*]]) #[[ATTR0]] {
-// CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:    [[P_ADDR:%.*]] = alloca ptr, align 8
-// CHECK-NEXT:    [[V_ADDR:%.*]] = alloca i64, align 8
-// CHECK-NEXT:    store ptr [[P]], ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    store i64 [[V]], ptr [[V_ADDR]], align 8
-// CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[P_ADDR]], align 8
-// CHECK-NEXT:    [[TMP1:%.*]] = load i64, ptr [[V_ADDR]], align 8
-// CHECK-NEXT:    call void @llvm.aarch64.stshh.atomic.store.p0(ptr [[TMP0]], i64 [[TMP1]], i32 0, i32 1, i32 64)
-// CHECK-NEXT:    ret void
-//
-void test_u64(unsigned long *p, unsigned long v) {
-  __arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 1);
-}
diff --git a/clang/test/CodeGen/arm_acle.c b/clang/test/CodeGen/arm_acle.c
index 3b97f90e806fc..cd18fa63bfdbd 100644
--- a/clang/test/CodeGen/arm_acle.c
+++ b/clang/test/CodeGen/arm_acle.c
@@ -1821,14 +1821,3 @@ int test_rndrrs(uint64_t *__addr) {
   return __rndrrs(__addr);
 }
 #endif
-
-#if defined(__ARM_64BIT_STATE)
-// AArch64-LABEL: @test_stshh_atomic_store(
-// AArch64-NEXT:  entry:
-// AArch64:         call void @llvm.aarch64.stshh.atomic.store.p0(ptr %p, i64 {{.*}}, i32 0, i32 0, i32 32)
-// AArch64-NEXT:    ret void
-//
-void test_stshh_atomic_store(int *p, int v) {
-  __arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-}
-#endif
diff --git a/clang/test/CodeGen/builtins-arm64.c b/clang/test/CodeGen/builtins-arm64.c
index 5344a2c5c6c5b..3d054c79f1777 100644
--- a/clang/test/CodeGen/builtins-arm64.c
+++ b/clang/test/CodeGen/builtins-arm64.c
@@ -39,11 +39,6 @@ void hints(void) {
   __builtin_arm_sevl();   //CHECK: call {{.*}} @llvm.aarch64.hint(i32 5)
 }
 
-void stshh_atomic_store(int *p, int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // CHECK: call void @llvm.aarch64.stshh.atomic.store.p0(ptr {{.*}}, i64 {{.*}}, i32 0, i32 0, i32 32)
-}
-
 void barriers(void) {
   __builtin_arm_dmb(1);  //CHECK: call {{.*}} @llvm.aarch64.dmb(i32 1)
   __builtin_arm_dsb(2);  //CHECK: call {{.*}} @llvm.aarch64.dsb(i32 2)
diff --git a/clang/test/Sema/AArch64/pcdphint-atomic-store.c b/clang/test/Sema/AArch64/pcdphint-atomic-store.c
deleted file mode 100644
index 5b4bf27003a5a..0000000000000
--- a/clang/test/Sema/AArch64/pcdphint-atomic-store.c
+++ /dev/null
@@ -1,74 +0,0 @@
-// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -fsyntax-only -verify %s
-// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -emit-llvm -o /dev/null -verify %s
-
-#include <arm_acle.h>
-
-void test_signed_ok(int *p, int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-}
-
-void test_invalid_retention_policy(unsigned int *p, unsigned int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 2);
-  // expected-error at -1 {{argument value 2 is outside the valid range [0, 1]}}
-}
-
-void test_const_pointer(const unsigned int *p, unsigned int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{address argument to atomic builtin cannot be const-qualified}}
-}
-
-void test_non_integer_pointer(float *p, float v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{address argument to '__arm_atomic_store_with_stshh' must be a pointer to an 8,16,32, or 64-bit integer type}}
-}
-
-void test_invalid_bit_width(__int128 *p, __int128 v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{address argument to '__arm_atomic_store_with_stshh' must be a pointer to an 8,16,32, or 64-bit integer type}}
-}
-
-struct IncompleteType;
-void test_incomplete_pointee(struct IncompleteType *p, int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{address argument to '__arm_atomic_store_with_stshh' must be a pointer to an 8,16,32, or 64-bit integer type}}
-}
-
-void test_invalid_memory_order(unsigned int *p, unsigned int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_ACQUIRE, 0);
-  // expected-error at -1 {{memory order argument to '__arm_atomic_store_with_stshh' must be one of __ATOMIC_RELAXED, __ATOMIC_RELEASE, or __ATOMIC_SEQ_CST}}
-}
-
-void test_invalid_memory_order_consume(unsigned int *p, unsigned int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_CONSUME, 0);
-  // expected-error at -1 {{memory order argument to '__arm_atomic_store_with_stshh' must be one of __ATOMIC_RELAXED, __ATOMIC_RELEASE, or __ATOMIC_SEQ_CST}}
-}
-
-void test_invalid_memory_order_acq_rel(unsigned int *p, unsigned int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_ACQ_REL, 0);
-  // expected-error at -1 {{memory order argument to '__arm_atomic_store_with_stshh' must be one of __ATOMIC_RELAXED, __ATOMIC_RELEASE, or __ATOMIC_SEQ_CST}}
-}
-
-void test_value_size_mismatch(int *p, short v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{value argument to '__arm_atomic_store_with_stshh' must be 'int'; got 'short'}}
-}
-
-void test_non_integer_value(int *p, float v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{value argument to '__arm_atomic_store_with_stshh' must be 'int'; got 'float'}}
-}
-
-void test_too_few_args(int *p, int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED);
-  // expected-error at -1 {{too few arguments to function call, expected 4, have 3}}
-}
-
-void test_too_many_args(int *p, int v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0, 1);
-  // expected-error at -1 {{too many arguments to function call, expected 4, have 5}}
-}
-
-void test_value_i128_mismatch(int *p, __int128 v) {
-  __builtin_arm_atomic_store_with_stshh(p, v, __ATOMIC_RELAXED, 0);
-  // expected-error at -1 {{value argument to '__arm_atomic_store_with_stshh' must be 'int'; got '__int128'}}
-}
diff --git a/llvm/include/llvm/IR/IntrinsicsAArch64.td b/llvm/include/llvm/IR/IntrinsicsAArch64.td
index 63500beaa6521..2660d79db4313 100644
--- a/llvm/include/llvm/IR/IntrinsicsAArch64.td
+++ b/llvm/include/llvm/IR/IntrinsicsAArch64.td
@@ -65,12 +65,6 @@ def int_aarch64_sys  : DefaultAttrsIntrinsic<[], [llvm_i32_ty, llvm_i32_ty,
 // HINT
 
 def int_aarch64_hint : DefaultAttrsIntrinsic<[], [llvm_i32_ty]>;
-def int_aarch64_stshh_atomic_store
-    : Intrinsic<[],
-                [llvm_anyptr_ty, llvm_i64_ty, llvm_i32_ty, llvm_i32_ty,
-                 llvm_i32_ty],
-                [IntrHasSideEffects, ImmArg<ArgIndex<2>>,
-                 ImmArg<ArgIndex<3>>, ImmArg<ArgIndex<4>>]>;
 
 def int_aarch64_break : Intrinsic<[], [llvm_i32_ty],
     [IntrNoMem, IntrHasSideEffects, IntrNoReturn, IntrCold, ImmArg<ArgIndex<0>>]>;
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index d336966c272f9..98e4ad74ab7f8 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -45,6 +45,7 @@
 #include "llvm/IR/Value.h"
 #include "llvm/IR/Verifier.h"
 #include "llvm/Support/AMDGPUAddrSpace.h"
+#include "llvm/Support/AtomicOrdering.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/NVPTXAddrSpace.h"
@@ -1100,6 +1101,11 @@ static bool upgradeArmOrAarch64IntrinsicFunction(bool IsArm, Function *F,
 
       return false; // No other 'aarch64.sve.*'.
     }
+
+    if (Name.starts_with("stshh.atomic.store")) {
+      NewFn = nullptr;
+      return true;
+    }
   }
   return false; // No other 'arm.*', 'aarch64.*'.
 }
@@ -4585,6 +4591,31 @@ static Value *...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/192419


More information about the cfe-commits mailing list