llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Zahira Ammarguellat (zahiraam)

<details>
<summary>Changes</summary>

According to the `OpenMP 6.0` specification (Section 17.9.6 511:18), if the 
`impex-type` is not explicitly specified, the behavior defaults to treating it 
as `omp_impex`. This patch ensures proper handling of the `transparent` clause 
when no specific `impex-type` is provided.

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


7 Files Affected:

- (modified) clang/lib/AST/OpenMPClause.cpp (+4-1) 
- (modified) clang/lib/Parse/ParseOpenMP.cpp (+8) 
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+4) 
- (modified) clang/test/OpenMP/task_ast_print.cpp (+3-6) 
- (modified) clang/test/OpenMP/task_codegen.cpp (+8) 
- (modified) clang/test/OpenMP/taskloop_ast_print.cpp (+8-4) 
- (modified) clang/test/OpenMP/taskloop_codegen.cpp (+3) 


``````````diff
diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp
index 62d78660570de..9e7a8a48372c7 100644
--- a/clang/lib/AST/OpenMPClause.cpp
+++ b/clang/lib/AST/OpenMPClause.cpp
@@ -2057,7 +2057,10 @@ void 
OMPClausePrinter::VisitOMPThreadsetClause(OMPThreadsetClause *Node) {
 
 void OMPClausePrinter::VisitOMPTransparentClause(OMPTransparentClause *Node) {
   OS << "transparent(";
-  Node->getImpexType()->printPretty(OS, nullptr, Policy, 0);
+  if (Node->getImpexType())
+    Node->getImpexType()->printPretty(OS, nullptr, Policy, 0);
+  else
+    OS << "omp_impex";
   OS << ")";
 }
 
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index ec62df83a203e..6946c27de9801 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -3214,6 +3214,14 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind 
DKind,
       ErrorFound = true;
     }
 
+    if (CKind == OMPC_transparent &&
+        PP.LookAhead(0).is(tok::annot_pragma_openmp_end)) {
+      SourceLocation Loc = ConsumeToken();
+      SourceLocation LLoc = Tok.getLocation();
+      Clause = Actions.OpenMP().ActOnOpenMPTransparentClause(nullptr, LLoc,
+                                                             LLoc, Loc);
+      break;
+    }
     if ((CKind == OMPC_ordered || CKind == OMPC_partial) &&
         PP.LookAhead(/*N=*/0).isNot(tok::l_paren))
       Clause = ParseOpenMPClause(CKind, WrongDirective);
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 456e94a009d2f..e90884a89bf6e 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -17476,6 +17476,10 @@ OMPClause 
*SemaOpenMP::ActOnOpenMPTransparentClause(Expr *ImpexTypeArg,
                                                     SourceLocation StartLoc,
                                                     SourceLocation LParenLoc,
                                                     SourceLocation EndLoc) {
+  if (!ImpexTypeArg) {
+    return new (getASTContext())
+        OMPTransparentClause(ImpexTypeArg, StartLoc, LParenLoc, EndLoc);
+  }
   QualType Ty = ImpexTypeArg->getType();
 
   if (const auto *TT = Ty->getAs<TypedefType>()) {
diff --git a/clang/test/OpenMP/task_ast_print.cpp 
b/clang/test/OpenMP/task_ast_print.cpp
index 4c59a7c7fafa1..d7c1da3db537c 100644
--- a/clang/test/OpenMP/task_ast_print.cpp
+++ b/clang/test/OpenMP/task_ast_print.cpp
@@ -16,12 +16,6 @@
 typedef void *omp_depend_t;
 typedef unsigned long omp_event_handle_t;
 
-typedef void **omp_impex_t;
-extern const omp_impex_t omp_not_impex;
-extern const omp_impex_t omp_import;
-extern const omp_impex_t omp_export;
-extern const omp_impex_t omp_impex;
-
 void foo() {}
 
 struct S1 {
@@ -250,6 +244,7 @@ int main(int argc, char **argv) {
 #pragma omp task threadset(omp_team)
   foo();
 
+#pragma omp task transparent
 #pragma omp task transparent(omp_not_impex)
 #pragma omp task transparent(omp_import)
 #pragma omp task transparent(omp_export)
@@ -273,9 +268,11 @@ int main(int argc, char **argv) {
   // CHECK60: #pragma omp task transparent(omp_import)
   // CHECK60: #pragma omp taskloop transparent(omp_impex)
   // CHECK60: #pragma omp task transparent(omp_import)
+  // CHECK60: #pragma omp taskloop transparent(omp_impex)
   // CHECK60: #pragma omp task threadset(omp_pool)
   // CHECK60: #pragma omp task threadset(omp_team)
   // CHECK60-NEXT: foo();
+  // CHECK60: #pragma omp task transparent(omp_impex)
   // CHECK60: #pragma omp task transparent(omp_not_impex)
   // CHECK60-NEXT: #pragma omp task transparent(omp_import)
   // CHECK60-NEXT: #pragma omp task transparent(omp_export)
diff --git a/clang/test/OpenMP/task_codegen.cpp 
b/clang/test/OpenMP/task_codegen.cpp
index faa9c3dfbcf61..5483d690e50a2 100644
--- a/clang/test/OpenMP/task_codegen.cpp
+++ b/clang/test/OpenMP/task_codegen.cpp
@@ -240,6 +240,8 @@ void test_threadset()
 
 void test_transparent()
 {
+#pragma omp task transparent
+  {}
 #pragma omp task transparent(omp_not_impex)
   {}
 #pragma omp task transparent(omp_import)
@@ -10308,6 +10310,7 @@ void test_transparent()
 // CHECK6-NEXT:       [[AGG_CAPTURED2:%.*]] = alloca [[STRUCT_ANON_29:%.*]], 
align 1
 // CHECK6-NEXT:       [[AGG_CAPTURED5:%.*]] = alloca [[STRUCT_ANON_31:%.*]], 
align 1
 // CHECK6-NEXT:       [[AGG_CAPTURED8:%.*]] = alloca [[STRUCT_ANON_33:%.*]], 
align 1
+// CHECK6-NEXT:        [[AGG_CAPTURED11:%.*]] = alloca [[STRUCT_ANON_35:%.*]], 
align 1
 // CHECK6-NEXT:       [[V:%.*]] = alloca ptr, align 8
 // CHECK6-NEXT:       [[AGG_CAPTURED11:%.*]] = alloca [[STRUCT_ANON_35:%.*]], 
align 1
 //CHECK6-NEXT:        [[AGG_CAPTURED14:%.*]] = alloca [[STRUCT_ANON_37:%.*]], 
align 1
@@ -10348,5 +10351,10 @@ void test_transparent()
  // CHECK6-NEXT:       [[TMP19:%.*]] = getelementptr inbounds nuw 
%struct.kmp_task_t_with_privates{{.*}}, ptr [[TMP18]], i32 0, i32 0
  // CHECK6-NEXT:       [[OMP_GLOBAL_THREAD_NUM19:%.*]] = call i32 
@__kmpc_global_thread_num(ptr @43)
  // CHECK6-NEXT:       [[TMP20:%.*]] = call i32 @__kmpc_omp_task(ptr @1, i32 
[[OMP_GLOBAL_THREAD_NUM19]], ptr [[TMP18]])
+// CHECK6-NEXT:        [[OMP_GLOBAL_THREAD_NUM21:%.*]] = call i32 
@__kmpc_global_thread_num(ptr @45)
+// CHECK6-NEXT:        [[TMP21:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr @1, 
i32 [[OMP_GLOBAL_THREAD_NUM21]], i32 257, i64 40, i64 1, ptr 
@.omp_task_entry..[[ENTRY43:[0-9]+]])
+// CHECK6-NEXT:         [[TMP22:%.*]] = getelementptr inbounds nuw 
%struct.kmp_task_t_with_privates{{.*}}, ptr [[TMP21]], i32 0, i32 0
+// CHECK6-NEXT:         [[OMP_GLOBAL_THREAD_NUM22:%.*]] = call i32 
@__kmpc_global_thread_num(ptr @45)
+// CHECK6-NEXT:         [[TMP23:%.*]] = call i32 @__kmpc_omp_task(ptr @1, i32 
[[OMP_GLOBAL_THREAD_NUM22]], ptr [[TMP21]])
 // CHECK6-NEXT:  ret void
 // CHECK6-NEXT:}
diff --git a/clang/test/OpenMP/taskloop_ast_print.cpp 
b/clang/test/OpenMP/taskloop_ast_print.cpp
index 9bca586937347..7805620f845a3 100644
--- a/clang/test/OpenMP/taskloop_ast_print.cpp
+++ b/clang/test/OpenMP/taskloop_ast_print.cpp
@@ -104,14 +104,17 @@ int main(int argc, char **argv) {
   }
 }
 
-#pragma omp taskloop transparent(omp_not_impex)
+#pragma omp taskloop transparent
   for (int i = 0; i < 10; ++i) {
-#pragma omp task transparent(omp_import)
+#pragma omp taskloop transparent(omp_not_impex)
     for (int i = 0; i < 10; ++i) {
-#pragma omp task transparent(omp_export)
+#pragma omp task transparent(omp_import)
       for (int i = 0; i < 10; ++i) {
+#pragma omp task transparent(omp_export)
+        for (int i = 0; i < 10; ++i) {
 #pragma omp task transparent(omp_impex)
-       foo();
+          foo();
+        }
       }
     }
   }
@@ -122,6 +125,7 @@ int main(int argc, char **argv) {
  // CHECK60-NEXT: for (int j = 0; j < 10; ++j) {
  // CHECK60-NEXT: foo();
 
+// CHECK60: #pragma omp taskloop transparent(omp_impex)
 // CHECK60: #pragma omp taskloop transparent(omp_not_impex)
 // CHECK60-NEXT: for (int i = 0; i < 10; ++i) {
 // CHECK60-NEXT: #pragma omp task transparent(omp_import)
diff --git a/clang/test/OpenMP/taskloop_codegen.cpp 
b/clang/test/OpenMP/taskloop_codegen.cpp
index 9073a2376f5b4..a9e7da82bec48 100644
--- a/clang/test/OpenMP/taskloop_codegen.cpp
+++ b/clang/test/OpenMP/taskloop_codegen.cpp
@@ -265,6 +265,9 @@ void test_threadset()
 
 void test_transparent()
 {
+#pragma omp taskloop transparent
+  for (int i = 0; i < 10; ++i) {
+  }
 #pragma omp taskloop transparent(omp_not_impex)
   for (int i = 0; i < 10; ++i) {
   }

``````````

</details>


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

Reply via email to