Author: erichkeane Date: 2024-11-14T06:41:10-08:00 New Revision: b7f7e6454877846d2ee4be8cae821b2c32501b1e
URL: https://github.com/llvm/llvm-project/commit/b7f7e6454877846d2ee4be8cae821b2c32501b1e DIFF: https://github.com/llvm/llvm-project/commit/b7f7e6454877846d2ee4be8cae821b2c32501b1e.diff LOG: [OpenACC] Implement 'default' clause for Combined Constructs This clause takes one of two fixed values, and can apply to all three of the combined constructs. Tests/etc are all exactly like the compute constructs, so committing them all here. Added: clang/test/SemaOpenACC/combined-construct-default-ast.cpp clang/test/SemaOpenACC/combined-construct-default-clause.c clang/test/SemaOpenACC/combined-construct-default-clause.cpp Modified: clang/lib/Sema/SemaOpenACC.cpp clang/test/AST/ast-print-openacc-combined-construct.cpp clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c clang/test/SemaOpenACC/compute-construct-default-clause.c Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp index dd6558d0afed70..70a0a122d82497 100644 --- a/clang/lib/Sema/SemaOpenACC.cpp +++ b/clang/lib/Sema/SemaOpenACC.cpp @@ -572,10 +572,12 @@ class SemaOpenACCClauseVisitor { OpenACCClause *SemaOpenACCClauseVisitor::VisitDefaultClause( SemaOpenACC::OpenACCParsedClause &Clause) { - // Restrictions only properly implemented on 'compute' constructs, and - // 'compute' constructs are the only construct that can do anything with - // this yet, so skip/treat as unimplemented in this case. - if (!isOpenACCComputeDirectiveKind(Clause.getDirectiveKind())) + // 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. diff --git a/clang/test/AST/ast-print-openacc-combined-construct.cpp b/clang/test/AST/ast-print-openacc-combined-construct.cpp index 14b8d0bab40041..f80500e7852192 100644 --- a/clang/test/AST/ast-print-openacc-combined-construct.cpp +++ b/clang/test/AST/ast-print-openacc-combined-construct.cpp @@ -86,4 +86,14 @@ void foo() { #pragma acc kernels loop if(i == array[1]) for(int i = 0;i<5;++i); +// CHECK: #pragma acc parallel loop default(none) +// CHECK-NEXT: for (int i = 0; i < 5; ++i) +// CHECK-NEXT: ; +#pragma acc parallel loop default(none) + for(int i = 0;i<5;++i); +// CHECK: #pragma acc serial loop default(present) +// CHECK-NEXT: for (int i = 0; i < 5; ++i) +// CHECK-NEXT: ; +#pragma acc serial loop default(present) + for(int i = 0;i<5;++i); } diff --git a/clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c b/clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c index 8a062b6ac1d5d6..9dd0ed922ffc2c 100644 --- a/clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c +++ b/clang/test/SemaOpenACC/combined-construct-auto_seq_independent-clauses.c @@ -56,8 +56,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop auto nohost for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC clause 'default' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop auto default(none) for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop auto if(1) @@ -226,8 +224,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop nohost auto for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop default(none) auto for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop if(1) auto @@ -397,8 +393,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop independent nohost for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop independent default(none) for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop independent if(1) @@ -567,8 +561,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop nohost independent for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop default(none) independent for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop if(1) independent @@ -744,8 +736,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop seq nohost for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop seq default(none) for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop seq if(1) @@ -920,8 +910,6 @@ void uses() { // expected-warning@+1{{OpenACC clause 'nohost' not yet implemented}} #pragma acc parallel loop nohost seq for(unsigned i = 0; i < 5; ++i); - // TODOexpected-error@+1{{OpenACC 'default' clause is not valid on 'parallel loop' directive}} - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc parallel loop default(none) seq for(unsigned i = 0; i < 5; ++i); #pragma acc parallel loop if(1) seq diff --git a/clang/test/SemaOpenACC/combined-construct-default-ast.cpp b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp new file mode 100644 index 00000000000000..2ff24b32afe7b9 --- /dev/null +++ b/clang/test/SemaOpenACC/combined-construct-default-ast.cpp @@ -0,0 +1,76 @@ + +// 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: OpenACCCombinedConstruct {{.*}}parallel loop + // CHECK-NEXT: default(none) +#pragma acc parallel loop default(none) + for (unsigned I = 0; I < 5; ++I) { +#pragma acc kernels loop + for (unsigned J = 0; J < 5; ++J) { + } + // CHECK: OpenACCCombinedConstruct {{.*}}kernels loop + // CHECK: OpenACCCombinedConstruct {{.*}}serial loop + // CHECK-NEXT: default(present) +#pragma acc serial loop default(present) + for (unsigned J = 0; J < 5; ++J) { + } + } +} +template<typename T> +void TemplFunc() { +#pragma acc parallel loop default(none) + for (unsigned i = 0; i < 5; ++i) { + typename T::type I; + } + +#pragma acc serial loop 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: OpenACCCombinedConstruct {{.*}}parallel loop + // CHECK-NEXT: default(none) + // CHECK: VarDecl{{.*}} I 'typename T::type' + + // CHECK-NEXT: OpenACCCombinedConstruct {{.*}}serial loop + // 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: OpenACCCombinedConstruct {{.*}}parallel loop + // CHECK-NEXT: default(none) + // CHECK: VarDecl{{.*}} I 'typename S::type':'int' + // CHECK-NEXT: OpenACCCombinedConstruct {{.*}}serial loop + // 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/combined-construct-default-clause.c b/clang/test/SemaOpenACC/combined-construct-default-clause.c new file mode 100644 index 00000000000000..058a6066c5eacb --- /dev/null +++ b/clang/test/SemaOpenACC/combined-construct-default-clause.c @@ -0,0 +1,52 @@ +// RUN: %clang_cc1 %s -fopenacc -verify + +void SingleOnly() { + #pragma acc parallel loop default(none) + for(int i = 5; i < 10;++i); + + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'serial loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc serial loop default(present) self default(none) + for(int i = 5; i < 10;++i); + + int i; + + // expected-warning@+4{{OpenACC clause 'copy' not yet implemented}} + // expected-warning@+3{{OpenACC clause 'present' not yet implemented}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'kernels loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc kernels loop self default(present) present(i) default(none) copy(i) + for(int i = 5; i < 10;++i); + + // expected-warning@+4{{OpenACC clause 'private' not yet implemented}} + // expected-warning@+3{{OpenACC clause 'copy' not yet implemented}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc parallel loop self default(present) private(i) default(none) copy(i) + for(int i = 0; i < 5; ++i); + + // expected-error@+1{{expected '('}} + #pragma acc serial loop self default private(i) default(none) if(i) + for(int i = 0; i < 5; ++i); + + #pragma acc kernels loop default(none) + for(int i = 0; i < 5; ++i); + + // expected-warning@+2{{OpenACC construct 'data' not yet implemented}} + // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} + #pragma acc data default(none) + while(0); + + // expected-error@+1{{OpenACC 'default' clause is not valid on 'loop' directive}} + #pragma acc loop default(none) + for(int i = 5; i < 10;++i); + + // expected-warning@+2{{OpenACC construct 'wait' not yet implemented}} + // expected-error@+1{{OpenACC 'default' clause is not valid on 'wait' directive}} + #pragma acc wait default(none) + while(0); + + // expected-error@+1{{OpenACC 'default' clause is not valid on 'loop' directive}} +#pragma acc loop default(present) + for(int i = 5; i < 10;++i); +} diff --git a/clang/test/SemaOpenACC/combined-construct-default-clause.cpp b/clang/test/SemaOpenACC/combined-construct-default-clause.cpp new file mode 100644 index 00000000000000..a211b11b6d3ffb --- /dev/null +++ b/clang/test/SemaOpenACC/combined-construct-default-clause.cpp @@ -0,0 +1,39 @@ +// RUN: %clang_cc1 %s -fopenacc -verify + +template<typename T> +void SingleOnly() { + #pragma acc parallel loop default(none) + for (unsigned I = 0; I < 5; ++I); + + int i; + + // expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc parallel loop default(present) async default(none) + for (unsigned I = 0; I < 5; ++I); + + // expected-warning@+4{{OpenACC clause 'copy' not yet implemented, clause ignored}} + // expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'serial loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc serial loop async default(present) copy(i) default(none) self + for (unsigned I = 0; I < 5; ++I); + + // expected-warning@+4{{OpenACC clause 'copy' not yet implemented, clause ignored}} + // expected-warning@+3{{OpenACC clause 'async' not yet implemented, clause ignored}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'kernels loop' directive}} + // expected-note@+1{{previous clause is here}} + #pragma acc kernels loop async default(present) copy(i) default(none) self + for (unsigned I = 0; I < 5; ++I); + + // expected-warning@+3{{OpenACC clause 'copy' not yet implemented, clause ignored}} + // expected-warning@+2{{OpenACC clause 'async' not yet implemented, clause ignored}} + // expected-error@+1{{expected '('}} + #pragma acc parallel loop async default(none) copy(i) default self + for (unsigned I = 0; I < 5; ++I); +} + +void Instantiate() { + SingleOnly<int>(); +} diff --git a/clang/test/SemaOpenACC/compute-construct-default-clause.c b/clang/test/SemaOpenACC/compute-construct-default-clause.c index 17f1b27a9b5838..15d6c512d6e654 100644 --- a/clang/test/SemaOpenACC/compute-construct-default-clause.c +++ b/clang/test/SemaOpenACC/compute-construct-default-clause.c @@ -16,10 +16,10 @@ void SingleOnly() { #pragma acc kernels self default(present) present(i) default(none) copy(i) while(0); - // expected-warning@+4{{OpenACC clause 'default' not yet implemented}} - // expected-warning@+3{{OpenACC clause 'private' not yet implemented}} - // expected-warning@+2{{OpenACC clause 'default' not yet implemented}} - // expected-warning@+1{{OpenACC clause 'copy' not yet implemented}} + // expected-warning@+4{{OpenACC clause 'private' not yet implemented}} + // expected-warning@+3{{OpenACC clause 'copy' not yet implemented}} + // expected-error@+2{{OpenACC 'default' clause cannot appear more than once on a 'parallel loop' directive}} + // expected-note@+1{{previous clause is here}} #pragma acc parallel loop self default(present) private(i) default(none) copy(i) for(int i = 0; i < 5; ++i); @@ -27,7 +27,6 @@ void SingleOnly() { #pragma acc serial loop self default private(i) default(none) if(i) for(int i = 0; i < 5; ++i); - // expected-warning@+1{{OpenACC clause 'default' not yet implemented}} #pragma acc kernels loop default(none) for(int i = 0; i < 5; ++i); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits