[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-12 Thread Mike Rice via cfe-commits

https://github.com/mikerice1969 closed 
https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-12 Thread Mike Rice via cfe-commits

mikerice1969 wrote:

> We should really fix using cmpxchg here. Can you open an IR issue for it?

Sure, I'll look into it and follow-up. Thanks for the review!

https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-12 Thread Matt Arsenault via cfe-commits

https://github.com/arsenm approved this pull request.

We should really fix using cmpxchg here. Can you open an IR issue for it?

https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-12 Thread Matt Arsenault via cfe-commits


@@ -851,6 +852,16 @@ int main(void) {
 // CHECK: call{{.*}} @__kmpc_flush(
 #pragma omp atomic seq_cst
   rix = dv / rix;
+
+// CHECK: [[LD_CPX:%.+]] = load atomic ptr, ptr @cpx monotonic
+// CHECK: br label %[[CONT:.+]]
+// CHECK: [[CONT]]
+// CHECK: [[PHI:%.+]] = phi ptr
+// CHECK: [[RES:%.+]] = cmpxchg ptr @cpx,

arsenm wrote:

Do we really end up emitting a cmpxchg in the frontend just because atomicrmw 
doesn't have pointer typed add? This is horrible 

https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-09 Thread via cfe-commits

llvmbot wrote:




@llvm/pr-subscribers-clang-codegen

Author: Mike Rice (mikerice1969)


Changes

In 4d5e834c5b7f0d90a6d543e182df602f6bc8, casts were removed for pointers 
but one case was missed. Add missing check.

---
Full diff: https://github.com/llvm/llvm-project/pull/88215.diff


2 Files Affected:

- (modified) clang/lib/CodeGen/CGAtomic.cpp (+5-1) 
- (modified) clang/test/OpenMP/atomic_update_codegen.cpp (+11) 


``diff
diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp
index d35ce0409d7232..07452b18a85ea4 100644
--- a/clang/lib/CodeGen/CGAtomic.cpp
+++ b/clang/lib/CodeGen/CGAtomic.cpp
@@ -1806,7 +1806,11 @@ void AtomicInfo::EmitAtomicUpdateOp(
  /*NumReservedValues=*/2);
   PHI->addIncoming(OldVal, CurBB);
   Address NewAtomicAddr = CreateTempAlloca();
-  Address NewAtomicIntAddr = castToAtomicIntPointer(NewAtomicAddr);
+  Address NewAtomicIntAddr =
+  shouldCastToInt(NewAtomicAddr.getElementType(), /*CmpXchg=*/true)
+  ? castToAtomicIntPointer(NewAtomicAddr)
+  : NewAtomicAddr;
+
   if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
   requiresMemSetZero(getAtomicAddress().getElementType())) {
 CGF.Builder.CreateStore(PHI, NewAtomicIntAddr);
diff --git a/clang/test/OpenMP/atomic_update_codegen.cpp 
b/clang/test/OpenMP/atomic_update_codegen.cpp
index ce0765118922a1..fe745590a9f919 100644
--- a/clang/test/OpenMP/atomic_update_codegen.cpp
+++ b/clang/test/OpenMP/atomic_update_codegen.cpp
@@ -27,6 +27,7 @@ long double ldv, ldx;
 _Complex int civ, cix;
 _Complex float cfv, cfx;
 _Complex double cdv, cdx;
+char *cpx;
 
 typedef int int4 __attribute__((__vector_size__(16)));
 int4 int4x;
@@ -851,6 +852,16 @@ int main(void) {
 // CHECK: call{{.*}} @__kmpc_flush(
 #pragma omp atomic seq_cst
   rix = dv / rix;
+
+// CHECK: [[LD_CPX:%.+]] = load atomic ptr, ptr @cpx monotonic
+// CHECK: br label %[[CONT:.+]]
+// CHECK: [[CONT]]
+// CHECK: [[PHI:%.+]] = phi ptr
+// CHECK: [[RES:%.+]] = cmpxchg ptr @cpx,
+// CHECK: br i1 %{{.+}}, label %[[EXIT:.+]], label %[[CONT]]
+  #pragma omp atomic update
+  cpx += 1;
+
   return 0;
 }
 

``




https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-09 Thread Mike Rice via cfe-commits

mikerice1969 wrote:

See: https://godbolt.org/z/av7axb9as

https://github.com/llvm/llvm-project/pull/88215
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


[clang] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr types (PR #88215)

2024-04-09 Thread Mike Rice via cfe-commits

https://github.com/mikerice1969 created 
https://github.com/llvm/llvm-project/pull/88215

In 4d5e834c5b7f0d90a6d543e182df602f6bc8, casts were removed for pointers 
but one case was missed. Add missing check.

>From b1eaa2f5b13db4d63390a0358ad0f9b13cbe927f Mon Sep 17 00:00:00 2001
From: Mike Rice 
Date: Tue, 9 Apr 2024 16:11:30 -0700
Subject: [PATCH] [clang][CodeGen][OpenMP] Fix casting of atomic update of ptr
 types

In 4d5e834c5b7f0d90a6d543e182df602f6bc8, casts were removed for
pointers but one case was missed. Add missing check.
---
 clang/lib/CodeGen/CGAtomic.cpp  |  6 +-
 clang/test/OpenMP/atomic_update_codegen.cpp | 11 +++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/CGAtomic.cpp b/clang/lib/CodeGen/CGAtomic.cpp
index d35ce0409d7232..07452b18a85ea4 100644
--- a/clang/lib/CodeGen/CGAtomic.cpp
+++ b/clang/lib/CodeGen/CGAtomic.cpp
@@ -1806,7 +1806,11 @@ void AtomicInfo::EmitAtomicUpdateOp(
  /*NumReservedValues=*/2);
   PHI->addIncoming(OldVal, CurBB);
   Address NewAtomicAddr = CreateTempAlloca();
-  Address NewAtomicIntAddr = castToAtomicIntPointer(NewAtomicAddr);
+  Address NewAtomicIntAddr =
+  shouldCastToInt(NewAtomicAddr.getElementType(), /*CmpXchg=*/true)
+  ? castToAtomicIntPointer(NewAtomicAddr)
+  : NewAtomicAddr;
+
   if ((LVal.isBitField() && BFI.Size != ValueSizeInBits) ||
   requiresMemSetZero(getAtomicAddress().getElementType())) {
 CGF.Builder.CreateStore(PHI, NewAtomicIntAddr);
diff --git a/clang/test/OpenMP/atomic_update_codegen.cpp 
b/clang/test/OpenMP/atomic_update_codegen.cpp
index ce0765118922a1..fe745590a9f919 100644
--- a/clang/test/OpenMP/atomic_update_codegen.cpp
+++ b/clang/test/OpenMP/atomic_update_codegen.cpp
@@ -27,6 +27,7 @@ long double ldv, ldx;
 _Complex int civ, cix;
 _Complex float cfv, cfx;
 _Complex double cdv, cdx;
+char *cpx;
 
 typedef int int4 __attribute__((__vector_size__(16)));
 int4 int4x;
@@ -851,6 +852,16 @@ int main(void) {
 // CHECK: call{{.*}} @__kmpc_flush(
 #pragma omp atomic seq_cst
   rix = dv / rix;
+
+// CHECK: [[LD_CPX:%.+]] = load atomic ptr, ptr @cpx monotonic
+// CHECK: br label %[[CONT:.+]]
+// CHECK: [[CONT]]
+// CHECK: [[PHI:%.+]] = phi ptr
+// CHECK: [[RES:%.+]] = cmpxchg ptr @cpx,
+// CHECK: br i1 %{{.+}}, label %[[EXIT:.+]], label %[[CONT]]
+  #pragma omp atomic update
+  cpx += 1;
+
   return 0;
 }
 

___
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits