[clang] 5048808 - [OpenACC] Implement 'default' Sema for 'data' clause

via cfe-commits cfe-commits at lists.llvm.org
Thu Dec 12 12:54:07 PST 2024


Author: erichkeane
Date: 2024-12-12T12:54:02-08:00
New Revision: 5048808859eece3aaa680aaecb4a89dfabe9627b

URL: https://github.com/llvm/llvm-project/commit/5048808859eece3aaa680aaecb4a89dfabe9627b
DIFF: https://github.com/llvm/llvm-project/commit/5048808859eece3aaa680aaecb4a89dfabe9627b.diff

LOG: [OpenACC] Implement 'default' Sema for 'data' clause

No additional rules here beyond enabling it, this patch just enables
'default' and adds tests.

Added: 
    clang/test/SemaOpenACC/data-construct-default-ast.cpp
    clang/test/SemaOpenACC/data-construct-default-clause.c

Modified: 
    clang/lib/Sema/SemaOpenACC.cpp
    clang/test/AST/ast-print-openacc-data-construct.cpp
    clang/test/SemaOpenACC/combined-construct-default-ast.cpp
    clang/test/SemaOpenACC/combined-construct-default-clause.c
    clang/test/SemaOpenACC/compute-construct-default-clause.c
    clang/test/SemaOpenACC/data-construct-ast.cpp
    clang/test/SemaOpenACC/data-construct-if-ast.cpp
    clang/test/SemaOpenACC/data-construct-if-clause.c
    clang/test/SemaOpenACC/data-construct.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index 655d3b4ad6347d..99daa3eba6287a 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -587,14 +587,6 @@ class SemaOpenACCClauseVisitor {
 
 OpenACCClause *SemaOpenACCClauseVisitor::VisitDefaultClause(
     SemaOpenACC::OpenACCParsedClause &Clause) {
-  // Restrictions only properly implemented on 'compute'/'combined' constructs,
-  // and 'compute'/'combined' constructs are the only construct that can do
-  // anything with this yet, so skip/treat as unimplemented in this case.
-  // Only 'data' is left.
-  if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind()) &&
-      !isOpenACCCombinedDirectiveKind(Clause.getDirectiveKind()))
-    return isNotImplemented();
-
   // Don't add an invalid clause to the AST.
   if (Clause.getDefaultClauseKind() == OpenACCDefaultClauseKind::Invalid)
     return nullptr;

diff  --git a/clang/test/AST/ast-print-openacc-data-construct.cpp b/clang/test/AST/ast-print-openacc-data-construct.cpp
index 8e1d3efbf3c4d5..3e828b594bc9c7 100644
--- a/clang/test/AST/ast-print-openacc-data-construct.cpp
+++ b/clang/test/AST/ast-print-openacc-data-construct.cpp
@@ -6,8 +6,7 @@ void foo() {
   // them, so the 'check' lines should start to include those once we implement
   // them.  For now, they don't emit those because they are 'not implemented'.
 
-// CHECK: #pragma acc data
-// CHECK-NOT: default(none)
+// CHECK: #pragma acc data default(none)
 #pragma acc data default(none)
   ;
 
@@ -32,7 +31,7 @@ void foo() {
   int *iPtr;
   int array[5];
 
-// CHECK: #pragma acc data if(i == array[1])
+// CHECK: #pragma acc data default(none) if(i == array[1])
 #pragma acc data default(none) if(i == array[1])
   ;
 // CHECK: #pragma acc enter data if(i == array[1])
@@ -45,7 +44,7 @@ void foo() {
 #pragma acc host_data use_device(Var) if(i == array[1])
   ;
 
-// CHECK: #pragma acc data async(i)
+// CHECK: #pragma acc data default(none) async(i)
 #pragma acc data default(none) async(i)
   ;
 // CHECK: #pragma acc enter data async(i)
@@ -53,7 +52,7 @@ void foo() {
 // CHECK: #pragma acc exit data async
 #pragma acc exit data copyout(i) async
 
-// CHECK: #pragma acc data wait
+// CHECK: #pragma acc data default(none) wait
 #pragma acc data default(none) wait()
   ;
 
@@ -63,7 +62,7 @@ void foo() {
 // CHECK: #pragma acc exit data wait(*iPtr, i)
 #pragma acc exit data copyout(Var) wait(*iPtr, i)
 
-// CHECK: #pragma acc data wait(queues: *iPtr, i)
+// CHECK: #pragma acc data default(none) wait(queues: *iPtr, i)
 #pragma acc data default(none) wait(queues:*iPtr, i)
   ;
 
@@ -72,4 +71,12 @@ void foo() {
 
 // CHECK: #pragma acc exit data wait(devnum: i : queues: *iPtr, i)
 #pragma acc exit data copyout(Var) wait(devnum:i:queues:*iPtr, i)
+
+// CHECK: #pragma acc data default(none)
+#pragma acc data default(none)
+  ;
+
+// CHECK: #pragma acc data default(present)
+#pragma acc data default(present)
+  ;
 }

diff  --git a/clang/test/SemaOpenACC/combined-construct-default-ast.cpp b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp
index 2ff24b32afe7b9..8f09e749073183 100644
--- a/clang/test/SemaOpenACC/combined-construct-default-ast.cpp
+++ b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp
@@ -1,4 +1,3 @@
-
 // RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
 
 // Test this with PCH.

diff  --git a/clang/test/SemaOpenACC/combined-construct-default-clause.c b/clang/test/SemaOpenACC/combined-construct-default-clause.c
index 7e384ccfc17a07..43c2883f131845 100644
--- a/clang/test/SemaOpenACC/combined-construct-default-clause.c
+++ b/clang/test/SemaOpenACC/combined-construct-default-clause.c
@@ -28,7 +28,6 @@ void SingleOnly() {
   #pragma acc kernels loop default(none)
   for(int i = 0; i < 5; ++i);
 
-  // expected-warning at +1{{OpenACC clause 'default' not yet implemented}}
   #pragma acc data default(none)
   while(0);
 

diff  --git a/clang/test/SemaOpenACC/compute-construct-default-clause.c b/clang/test/SemaOpenACC/compute-construct-default-clause.c
index 4aef2cbd7aec4c..dfa5cd3f1c0d3e 100644
--- a/clang/test/SemaOpenACC/compute-construct-default-clause.c
+++ b/clang/test/SemaOpenACC/compute-construct-default-clause.c
@@ -28,7 +28,6 @@ void SingleOnly() {
   #pragma acc kernels default(none)
   for(int i = 0; i < 5; ++i);
 
-  // expected-warning at +1{{OpenACC clause 'default' not yet implemented}}
   #pragma acc data default(none)
   while(0);
 

diff  --git a/clang/test/SemaOpenACC/data-construct-ast.cpp b/clang/test/SemaOpenACC/data-construct-ast.cpp
index 9a7fe2cb793a73..60ed295fcd42eb 100644
--- a/clang/test/SemaOpenACC/data-construct-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-ast.cpp
@@ -22,6 +22,7 @@ void NormalFunc() {
 #pragma acc data default(none)
   while (Var);
   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: WhileStmt
   // CHECK: NullStmt
 #pragma acc enter data copyin(Var)
@@ -49,6 +50,7 @@ void TemplFunc() {
 #pragma acc data default(none)
   while (Var);
   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: WhileStmt
   // CHECK: NullStmt
 #pragma acc enter data copyin(Var)
@@ -71,6 +73,7 @@ void TemplFunc() {
   // CHECK-NEXT: VarDecl
 
   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: WhileStmt
   // CHECK: NullStmt
 

diff  --git a/clang/test/SemaOpenACC/data-construct-default-ast.cpp b/clang/test/SemaOpenACC/data-construct-default-ast.cpp
new file mode 100644
index 00000000000000..ef9b1348c6709c
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-default-ast.cpp
@@ -0,0 +1,68 @@
+// RUN: %clang_cc1 %s -fopenacc -ast-dump | FileCheck %s
+
+// Test this with PCH.
+// RUN: %clang_cc1 %s -fopenacc -emit-pch -o %t %s
+// RUN: %clang_cc1 %s -fopenacc -include-pch %t -ast-dump-all | FileCheck %s
+
+#ifndef PCH_HELPER
+#define PCH_HELPER
+void NormalFunc() {
+  // CHECK-LABEL: NormalFunc
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(none)
+#pragma acc data  default(none)
+  // CHECK: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(present)
+#pragma acc data default(present)
+    ;
+}
+template<typename T>
+void TemplFunc() {
+#pragma acc data default(none)
+  for (unsigned i = 0; i < 5; ++i) {
+    typename T::type I;
+  }
+
+#pragma acc data default(present)
+  for (unsigned i = 0; i < 5; ++i) {
+    typename T::type I;
+  }
+
+  // CHECK-LABEL: FunctionTemplateDecl {{.*}}TemplFunc
+  // CHECK-NEXT: TemplateTypeParmDecl
+
+  // Template Pattern:
+  // CHECK-NEXT: FunctionDecl
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(none)
+  // CHECK: VarDecl{{.*}} I 'typename T::type'
+
+  // CHECK-NEXT: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(present)
+  // CHECK: VarDecl{{.*}} I 'typename T::type'
+
+  // Check instantiation.
+  // CHECK-LABEL: FunctionDecl{{.*}} used TemplFunc 'void ()' implicit_instantiation
+  // CHECK-NEXT: TemplateArgument type 'S'
+  // CHECK-NEXT: RecordType
+  // CHECK-NEXT: CXXRecord
+  // CHECK-NEXT: CompoundStmt
+  // CHECK-NEXT: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(none)
+  // CHECK: VarDecl{{.*}} I 'typename S::type':'int'
+  // CHECK-NEXT: OpenACCDataConstruct {{.*}}data
+  // CHECK-NEXT: default(present)
+  // CHECK: VarDecl{{.*}} I 'typename S::type':'int'
+
+}
+struct S {
+  using type = int;
+};
+
+void use() {
+  TemplFunc<S>();
+}
+
+#endif

diff  --git a/clang/test/SemaOpenACC/data-construct-default-clause.c b/clang/test/SemaOpenACC/data-construct-default-clause.c
new file mode 100644
index 00000000000000..e09004d7404c0c
--- /dev/null
+++ b/clang/test/SemaOpenACC/data-construct-default-clause.c
@@ -0,0 +1,24 @@
+// RUN: %clang_cc1 %s -fopenacc -verify
+
+void use() {
+  // expected-error at +1{{invalid value for 'default' clause; expected 'present' or 'none'}}
+#pragma acc data default(garbage)
+  ;
+#pragma acc data default(present)
+  ;
+#pragma acc data default(none)
+  ;
+  // expected-error at +2{{OpenACC 'default' clause cannot appear more than once on a 'data' directive}}
+  // expected-note at +1{{previous clause is here}}
+#pragma acc data default(none) default(present)
+  ;
+  // expected-error at +1{{OpenACC 'default' clause is not valid on 'enter data' directive}}
+#pragma acc enter data default(present)
+  ;
+  // expected-error at +1{{OpenACC 'default' clause is not valid on 'exit data' directive}}
+#pragma acc exit data default(none)
+  ;
+  // expected-error at +1{{OpenACC 'default' clause is not valid on 'host_data' directive}}
+#pragma acc host_data default(present)
+  ;
+}

diff  --git a/clang/test/SemaOpenACC/data-construct-if-ast.cpp b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
index 5a7e5942211d38..a522b30357df89 100644
--- a/clang/test/SemaOpenACC/data-construct-if-ast.cpp
+++ b/clang/test/SemaOpenACC/data-construct-if-ast.cpp
@@ -21,6 +21,7 @@ void NormalFunc(int j, float f) {
   // CHECK-NEXT: DeclRefExpr{{.*}} 'int' lvalue ParmVar{{.*}} 'j' 'int'
   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>
   // CHECK-NEXT: DeclRefExpr{{.*}} 'float' lvalue ParmVar{{.*}} 'f' 'float'
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: NullStmt
 
 }
@@ -39,6 +40,7 @@ void TemplFunc() {
 #pragma acc data default(none) if(T::SomeFloat < typename T::IntTy{})
   ;
   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} '<dependent type>' '<'
   // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' lvalue
@@ -79,6 +81,7 @@ void TemplFunc() {
   // CHECK-NEXT: CompoundStmt
 
   // CHECK-NEXT: OpenACCDataConstruct{{.*}}data
+  // CHECK-NEXT: default(none)
   // CHECK-NEXT: if clause
   // CHECK-NEXT: BinaryOperator{{.*}} 'bool' '<'
   // CHECK-NEXT: ImplicitCastExpr{{.*}} 'float' <LValueToRValue>

diff  --git a/clang/test/SemaOpenACC/data-construct-if-clause.c b/clang/test/SemaOpenACC/data-construct-if-clause.c
index b57eb28d29dba2..906b252d219b44 100644
--- a/clang/test/SemaOpenACC/data-construct-if-clause.c
+++ b/clang/test/SemaOpenACC/data-construct-if-clause.c
@@ -2,10 +2,8 @@
 
 void Foo() {
   int Var;
-  // expected-warning at +1{{OpenACC clause 'default' not yet implemented}}
 #pragma acc data default(present) if(1)
   ;
-  // expected-warning at +3{{OpenACC clause 'default' not yet implemented}}
   // expected-error at +2{{OpenACC 'if' clause cannot appear more than once on a 'data' directive}}
   // expected-note at +1{{previous clause is here}}
 #pragma acc data default(present) if(1) if (2)

diff  --git a/clang/test/SemaOpenACC/data-construct.cpp b/clang/test/SemaOpenACC/data-construct.cpp
index 1e145c197834b0..2df68cc9bba4bb 100644
--- a/clang/test/SemaOpenACC/data-construct.cpp
+++ b/clang/test/SemaOpenACC/data-construct.cpp
@@ -45,7 +45,6 @@ void AtLeastOneOf() {
   // expected-warning at +1{{OpenACC clause 'attach' not yet implemented}}
 #pragma acc data attach(Var)
   ;
-  // expected-warning at +1{{OpenACC clause 'default' not yet implemented}}
 #pragma acc data default(none)
   ;
 


        


More information about the cfe-commits mailing list