https://github.com/SunilKuravinakop updated 
https://github.com/llvm/llvm-project/pull/165276

>From 822dd156ad30bc719fd454213c1a82b044e78c73 Mon Sep 17 00:00:00 2001
From: Sunil Kuravinakop <[email protected]>
Date: Mon, 27 Oct 2025 11:20:55 -0500
Subject: [PATCH 1/3] 1) In the default clause, changing check for allocatable
 type in      variable category. 2) Adding a new test case       
 clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp 3) Taking
 care of new comments in    https://github.com/llvm/llvm-project/pull/157063

---
 clang/lib/Sema/SemaOpenMP.cpp                 |  25 +++-
 ...allel_default_variableCategory_codegen.cpp | 117 ++++++++++++++++++
 2 files changed, 137 insertions(+), 5 deletions(-)
 create mode 100644 
clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 5b5b1b685e153..f677be7f02583 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -1314,6 +1314,22 @@ static std::string 
getOpenMPClauseNameForDiag(OpenMPClauseKind C) {
   return getOpenMPClauseName(C).str();
 }
 
+bool isAllocatableType(QualType QT) {
+  if (QT->isPointerType())
+    return true;
+  QT = QT.getCanonicalType().getUnqualifiedType();
+  if (const CXXRecordDecl *RD = QT->getAsCXXRecordDecl()) {
+    if (isa<ClassTemplateSpecializationDecl>(RD)) {
+      std::string QName = RD->getQualifiedNameAsString();
+      return (QName == "std::vector" || QName == "vector" ||
+              QName == "std::unique_ptr" || QName == "unique_ptr" ||
+              QName == "std::shared_ptr" || QName == "shared_ptr" ||
+              QName == "llvm::SmallVector" || QName == "SmallVector");
+    }
+  }
+  return false;
+}
+
 DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter,
                                           ValueDecl *D) const {
   D = getCanonicalDecl(D);
@@ -1370,20 +1386,19 @@ DSAStackTy::DSAVarData 
DSAStackTy::getDSA(const_iterator &Iter,
   DefaultDataSharingAttributes IterDA = Iter->DefaultAttr;
   switch (Iter->DefaultVCAttr) {
   case DSA_VC_aggregate:
-    if (!VD->getType()->isAggregateType())
+    if (!D->getType()->isAggregateType())
       IterDA = DSA_none;
     break;
   case DSA_VC_allocatable:
-    if (!(VD->getType()->isPointerType() ||
-          VD->getType()->isVariableArrayType()))
+    if (!isAllocatableType(D->getType()))
       IterDA = DSA_none;
     break;
   case DSA_VC_pointer:
-    if (!VD->getType()->isPointerType())
+    if (!D->getType()->isPointerType())
       IterDA = DSA_none;
     break;
   case DSA_VC_scalar:
-    if (!VD->getType()->isScalarType())
+    if (!D->getType()->isScalarType())
       IterDA = DSA_none;
     break;
   case DSA_VC_all:
diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp 
b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
new file mode 100644
index 0000000000000..b0674158f57e5
--- /dev/null
+++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
@@ -0,0 +1,117 @@
+// RUN: %clangxx -DOMP60 -Xclang -verify -Wno-vla -fopenmp -fopenmp-version=60 
-x c++ -S -emit-llvm %s -o - | FileCheck --check-prefixes=OMP60 %s
+// expected-no-diagnostics
+#ifndef HEADER
+#define HEADER
+
+#include <vector>
+
+int global;
+#define VECTOR_SIZE 4
+int main (int argc, char **argv) {
+  int i,n;
+  int x;
+
+  n = VECTOR_SIZE;
+
+  #pragma omp parallel masked firstprivate(x) num_threads(2)
+  {
+     int *xPtr = nullptr;
+     // scalar
+     #pragma omp task default(shared:scalar)
+     {
+       xPtr = &x;
+     }
+     #pragma omp taskwait
+
+     // pointer
+     #pragma omp task default(shared:pointer) shared(x)
+     {
+       xPtr = &x;
+     }
+     #pragma omp taskwait
+  }
+
+  int *aggregate[VECTOR_SIZE] = {0,0,0,0};
+  std::vector<int *> arr(VECTOR_SIZE,0);
+  
+  #pragma omp parallel masked num_threads(2)
+  {
+     // aggregate
+     #pragma omp task default(shared:aggregate)
+     for(i=0;i<n;i++) {
+       aggregate[i] = &x;
+     }
+     #pragma omp taskwait
+
+     #pragma omp task default(shared:aggregate) shared(x)
+     for(i=0;i<n;i++) {
+       aggregate[i] = &x;
+     }
+     #pragma omp taskwait
+
+     // allocatable
+     #pragma omp task default(shared:allocatable)
+     for(i=0;i<n;i++) {
+       arr[i] = &x;
+     }
+     #pragma omp taskwait
+
+     #pragma omp task default(shared:allocatable) shared(x)
+     for(i=0;i<n;i++) {
+       arr[i] = &x;
+     }
+     #pragma omp taskwait
+
+     // all
+     #pragma omp task default(shared:all)
+     for(i=0;i<n;i++) {
+       aggregate[i] = &x;
+     }
+     #pragma omp taskwait
+  }
+}
+
+#endif
+
+// OMP60-LABEL: define {{.*}}main.omp_outlined{{.*}}
+// OMP60-NEXT:  entry:
+// OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
+// OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
+// OMP60: [[X_ADDR:%.*]] = alloca{{.*}}
+// OMP60: [[xPTR:%.*]] = alloca{{.*}}
+// OMP60: store ptr null, ptr [[xPTR]]{{.*}}
+// OMP60: store ptr [[xPTR]]{{.*}}
+// OMP60: store ptr [[X_ADDR]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: ret void
+//
+// OMP60: define {{.*}}main.omp_outlined{{.*}}
+// OMP60-NEXT:  entry:
+// OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
+// OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
+// OMP60: [[I_ADDR:%.*]] = alloca{{.*}}
+// OMP60-NEXT:  [[N_ADDR:%.*]] = alloca{{.*}}
+// OMP60-NEXT:  [[AGGREGATE_ADDR:%.*]] = alloca{{.*}}
+// OMP60-NEXT:  [[X_ADDR:%.*]] = alloca{{.*}}
+// OMP60-NEXT:  [[ARR_ADDR:%.*]] = alloca{{.*}}
+// OMP60: [[TMP0:%.*]] = load{{.*}}[[I_ADDR]]
+// OMP60-NEXT:  [[TMP1:%.*]] = load{{.*}}[[N_ADDR]]
+// OMP60-NEXT:  [[TMP2:%.*]] = load{{.*}}[[AGGREGATE_ADDR]]
+// OMP60-NEXT:  [[TMP3:%.*]] = load{{.*}}[[X_ADDR]]
+// OMP60-NEXT:  [[TMP4:%.*]] = load{{.*}}[[ARR_ADDR]]
+// OMP60: store ptr [[TMP2]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: store ptr [[TMP2]]{{.*}}
+// OMP60: store ptr [[TMP3]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: store ptr [[TMP4]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: store ptr [[TMP4]]{{.*}}
+// OMP60: store ptr [[TMP3]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: store ptr [[TMP0]]{{.*}}
+// OMP60: store ptr [[TMP1]]{{.*}}
+// OMP60: store ptr [[TMP2]]{{.*}}
+// OMP60: store ptr [[TMP3]]{{.*}}
+// OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
+// OMP60: ret void

>From f6ef21eca537e05b53cfdaa38633d04540ff8754 Mon Sep 17 00:00:00 2001
From: Sunil Kuravinakop <[email protected]>
Date: Wed, 5 Nov 2025 23:41:30 -0600
Subject: [PATCH 2/3] 1) Correcting the expected output of llvm IR in
 clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp. 2) Taking
 care of the feedback (from Alexey) in SemaOpenMP.cpp.

---
 clang/lib/Sema/SemaOpenMP.cpp                 | 29 ++++++++++++-------
 ...allel_default_variableCategory_codegen.cpp |  2 +-
 2 files changed, 20 insertions(+), 11 deletions(-)

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index c0ca5fda3b8eb..42430905538ad 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -1314,19 +1314,28 @@ static std::string 
getOpenMPClauseNameForDiag(OpenMPClauseKind C) {
   return getOpenMPClauseName(C).str();
 }
 
-bool isAllocatableType(QualType QT) {
+static bool isAllocatableType(QualType QT) {
   if (QT->isPointerType())
     return true;
+
   QT = QT.getCanonicalType().getUnqualifiedType();
-  if (const CXXRecordDecl *RD = QT->getAsCXXRecordDecl()) {
-    if (isa<ClassTemplateSpecializationDecl>(RD)) {
-      std::string QName = RD->getQualifiedNameAsString();
-      return (QName == "std::vector" || QName == "vector" ||
-              QName == "std::unique_ptr" || QName == "unique_ptr" ||
-              QName == "std::shared_ptr" || QName == "shared_ptr" ||
-              QName == "llvm::SmallVector" || QName == "SmallVector");
-    }
-  }
+  if (const auto *RD = QT->getAsCXXRecordDecl())
+    if (const auto *Spec = dyn_cast<ClassTemplateSpecializationDecl>(RD))
+      if (const auto *CTD = Spec->getSpecializedTemplate())
+        if (const auto *NS =
+                dyn_cast_or_null<NamespaceDecl>(CTD->getDeclContext())) {
+          StringRef Name = CTD->getIdentifier()->getName();
+
+          if (NS->isStdNamespace())
+            if (Name == "vector" || Name == "unique_ptr" ||
+                Name == "shared_ptr" || Name == "array")
+              return true;
+
+          if (NS->getIdentifier()->getName() == "llvm")
+            if (Name == "SmallVector")
+              return true;
+        }
+
   return false;
 }
 
diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp 
b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
index b0674158f57e5..e1af3be4f7140 100644
--- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
+++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
@@ -87,7 +87,7 @@ int main (int argc, char **argv) {
 //
 // OMP60: define {{.*}}main.omp_outlined{{.*}}
 // OMP60-NEXT:  entry:
-// OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
+// OMP60:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
 // OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
 // OMP60: [[I_ADDR:%.*]] = alloca{{.*}}
 // OMP60-NEXT:  [[N_ADDR:%.*]] = alloca{{.*}}

>From 99310f54b0e03a013642fedc61c233ab81008c24 Mon Sep 17 00:00:00 2001
From: Sunil Kuravinakop <[email protected]>
Date: Thu, 6 Nov 2025 13:16:59 -0600
Subject: [PATCH 3/3] Removing unnecessary variable in the CHECK: for
 clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp

---
 ...rallel_default_variableCategory_codegen.cpp | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp 
b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
index e1af3be4f7140..09dc10d48b86f 100644
--- a/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
+++ b/clang/test/OpenMP/parallel_default_variableCategory_codegen.cpp
@@ -75,26 +75,22 @@ int main (int argc, char **argv) {
 
 // OMP60-LABEL: define {{.*}}main.omp_outlined{{.*}}
 // OMP60-NEXT:  entry:
-// OMP60-NEXT:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
-// OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-// OMP60: [[X_ADDR:%.*]] = alloca{{.*}}
-// OMP60: [[xPTR:%.*]] = alloca{{.*}}
-// OMP60: store ptr null, ptr [[xPTR]]{{.*}}
-// OMP60: store ptr [[xPTR]]{{.*}}
-// OMP60: store ptr [[X_ADDR]]{{.*}}
+// OMP60: %x.addr = alloca{{.*}}
+// OMP60: %xPtr = alloca
+// OMP60: store ptr null, ptr %xPtr{{.*}}
+// OMP60: store ptr %xPtr{{.*}}
+// OMP60: store ptr %x.addr{{.*}}
 // OMP60-NEXT:  {{.*}}call{{.*}}__kmpc_omp_task_alloc{{.*}}
 // OMP60: ret void
 //
 // OMP60: define {{.*}}main.omp_outlined{{.*}}
 // OMP60-NEXT:  entry:
-// OMP60:    [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8
-// OMP60-NEXT:    [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8
-// OMP60: [[I_ADDR:%.*]] = alloca{{.*}}
+// OMP60: %i.addr = alloca{{.*}}
 // OMP60-NEXT:  [[N_ADDR:%.*]] = alloca{{.*}}
 // OMP60-NEXT:  [[AGGREGATE_ADDR:%.*]] = alloca{{.*}}
 // OMP60-NEXT:  [[X_ADDR:%.*]] = alloca{{.*}}
 // OMP60-NEXT:  [[ARR_ADDR:%.*]] = alloca{{.*}}
-// OMP60: [[TMP0:%.*]] = load{{.*}}[[I_ADDR]]
+// OMP60: [[TMP0:%.*]] = load{{.*}}%i.addr
 // OMP60-NEXT:  [[TMP1:%.*]] = load{{.*}}[[N_ADDR]]
 // OMP60-NEXT:  [[TMP2:%.*]] = load{{.*}}[[AGGREGATE_ADDR]]
 // OMP60-NEXT:  [[TMP3:%.*]] = load{{.*}}[[X_ADDR]]

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to