Author: erichkeane Date: 2025-01-07T08:20:20-08:00 New Revision: dd1e8aa09c0ab453a0566165b68e6a62fcd055e1
URL: https://github.com/llvm/llvm-project/commit/dd1e8aa09c0ab453a0566165b68e6a62fcd055e1 DIFF: https://github.com/llvm/llvm-project/commit/dd1e8aa09c0ab453a0566165b68e6a62fcd055e1.diff LOG: [OpenACC] Enable 'if' and 'if_present' for 'update' construct The only restriction on 'if' is that only 1 can appear on an update construct, so this enforces that. 'if_present' has no restrictions. Added: Modified: clang/lib/Sema/SemaOpenACC.cpp clang/test/AST/ast-print-openacc-update-construct.cpp clang/test/ParserOpenACC/parse-clauses.c clang/test/SemaOpenACC/update-construct-ast.cpp clang/test/SemaOpenACC/update-construct.cpp Removed: ################################################################################ diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp index 1ab033cbbfc1a8..716749f08c5831 100644 --- a/clang/lib/Sema/SemaOpenACC.cpp +++ b/clang/lib/Sema/SemaOpenACC.cpp @@ -709,18 +709,11 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitTileClause( OpenACCClause *SemaOpenACCClauseVisitor::VisitIfClause( SemaOpenACC::OpenACCParsedClause &Clause) { - // Restrictions only properly implemented on 'compute'/'combined'/'data' - // constructs, and 'compute'/'combined'/'data' constructs are the only - // constructs that can do anything with this yet, so skip/treat as - // unimplemented in this case. - if (!isDirectiveKindImplemented(Clause.getDirectiveKind())) - return isNotImplemented(); - // There is no prose in the standard that says duplicates aren't allowed, // but this diagnostic is present in other compilers, as well as makes // sense. Prose DOES exist for 'data' and 'host_data', 'set', 'enter data' and // 'exit data' both don't, but other implmementations do this. OpenACC issue - // 519 filed for the latter two. + // 519 filed for the latter two. Prose also exists for 'update'. // GCC allows this on init/shutdown, presumably for good reason, so we do too. if (Clause.getDirectiveKind() != OpenACCDirectiveKind::Init && Clause.getDirectiveKind() != OpenACCDirectiveKind::Shutdown && @@ -1744,8 +1737,6 @@ OpenACCClause *SemaOpenACCClauseVisitor::VisitFinalizeClause( OpenACCClause *SemaOpenACCClauseVisitor::VisitIfPresentClause( SemaOpenACC::OpenACCParsedClause &Clause) { - if (!isDirectiveKindImplemented(Clause.getDirectiveKind())) - return isNotImplemented(); // There isn't anything to do here, this is only valid on one construct, and // has no associated rules. return OpenACCIfPresentClause::Create(Ctx, Clause.getBeginLoc(), diff --git a/clang/test/AST/ast-print-openacc-update-construct.cpp b/clang/test/AST/ast-print-openacc-update-construct.cpp index db9d1c0855c982..89210cc0124ca1 100644 --- a/clang/test/AST/ast-print-openacc-update-construct.cpp +++ b/clang/test/AST/ast-print-openacc-update-construct.cpp @@ -1,5 +1,10 @@ // RUN: %clang_cc1 -fopenacc -ast-print %s -o - | FileCheck %s -void uses() { +void uses(bool cond) { // CHECK: #pragma acc update #pragma acc update + +// CHECK: #pragma acc update if_present +#pragma acc update if_present +// CHECK: #pragma acc update if(cond) +#pragma acc update if(cond) } diff --git a/clang/test/ParserOpenACC/parse-clauses.c b/clang/test/ParserOpenACC/parse-clauses.c index 3da06c3af63f37..9b88c147d0faa2 100644 --- a/clang/test/ParserOpenACC/parse-clauses.c +++ b/clang/test/ParserOpenACC/parse-clauses.c @@ -347,16 +347,14 @@ void SelfUpdate() { #pragma acc update self for(int i = 0; i < 5;++i) {} - // expected-error@+5{{use of undeclared identifier 'zero'}} - // expected-error@+4{{expected ','}} - // expected-error@+3{{expected expression}} - // expected-warning@+2{{OpenACC clause 'self' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC clause 'if_present' not yet implemented, clause ignored}} + // expected-error@+4{{use of undeclared identifier 'zero'}} + // expected-error@+3{{expected ','}} + // expected-error@+2{{expected expression}} + // expected-warning@+1{{OpenACC clause 'self' not yet implemented, clause ignored}} #pragma acc update self(zero : s.array[s.value : 5], s.value), if_present for(int i = 0; i < 5;++i) {} - // expected-warning@+2{{OpenACC clause 'self' not yet implemented, clause ignored}} - // expected-warning@+1{{OpenACC clause 'if_present' not yet implemented, clause ignored}} + // expected-warning@+1{{OpenACC clause 'self' not yet implemented, clause ignored}} #pragma acc update self(s.array[s.value : 5], s.value), if_present for(int i = 0; i < 5;++i) {} } diff --git a/clang/test/SemaOpenACC/update-construct-ast.cpp b/clang/test/SemaOpenACC/update-construct-ast.cpp index 0e793428ec9b82..097ca6fc97d405 100644 --- a/clang/test/SemaOpenACC/update-construct-ast.cpp +++ b/clang/test/SemaOpenACC/update-construct-ast.cpp @@ -6,12 +6,26 @@ #ifndef PCH_HELPER #define PCH_HELPER + +int some_int(); +long some_long(); + void NormalFunc() { // CHECK-LABEL: NormalFunc // CHECK-NEXT: CompoundStmt -#pragma acc update +#pragma acc update if_present if (some_int() < some_long()) // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update + // CHECK-NEXT: if_present clause + // CHECK-NEXT: if clause + // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' + // CHECK-NEXT: ImplicitCastExpr{{.*}}'long' + // CHECK-NEXT: CallExpr{{.*}}'int' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr{{.*}}'some_int' 'int ()' + // CHECK-NEXT: CallExpr{{.*}} 'long' + // CHECK-NEXT: ImplicitCastExpr + // CHECK-NEXT: DeclRefExpr{{.*}}'some_long' 'long ()' } template<typename T> @@ -22,8 +36,14 @@ void TemplFunc(T t) { // CHECK-NEXT: ParmVarDecl{{.*}} t 'T' // CHECK-NEXT: CompoundStmt -#pragma acc update +#pragma acc update if_present if (T::value < t) // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update + // CHECK-NEXT: if_present clause + // CHECK-NEXT: if clause + // CHECK-NEXT: BinaryOperator{{.*}}'<dependent type>' '<' + // CHECK-NEXT: DependentScopeDeclRefExpr{{.*}} '<dependent type>' + // CHECK-NEXT: NestedNameSpecifier TypeSpec 'T' + // CHECK-NEXT: DeclRefExpr{{.*}}'t' 'T' // Instantiation: // CHECK-NEXT: FunctionDecl{{.*}} TemplFunc 'void (SomeStruct)' implicit_instantiation @@ -34,6 +54,16 @@ void TemplFunc(T t) { // CHECK-NEXT: CompoundStmt // CHECK-NEXT: OpenACCUpdateConstruct{{.*}}update + // CHECK-NEXT: if_present clause + // CHECK-NEXT: if clause + // CHECK-NEXT: BinaryOperator{{.*}}'bool' '<' + // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int' + // CHECK-NEXT: DeclRefExpr{{.*}}'value' 'const unsigned int' + // CHECK-NEXT: NestedNameSpecifier TypeSpec 'SomeStruct' + // CHECK-NEXT: ImplicitCastExpr {{.*}}'unsigned int' + // CHECK-NEXT: CXXMemberCallExpr{{.*}}'unsigned int' + // CHECK-NEXT: MemberExpr{{.*}}.operator unsigned int + // CHECk-NEXT: DeclRefExpr{{.*}}'t' 'SomeStruct' } struct SomeStruct{ diff --git a/clang/test/SemaOpenACC/update-construct.cpp b/clang/test/SemaOpenACC/update-construct.cpp index 3bada827a7a3cd..c9998cdc5ff14d 100644 --- a/clang/test/SemaOpenACC/update-construct.cpp +++ b/clang/test/SemaOpenACC/update-construct.cpp @@ -1,5 +1,6 @@ // RUN: %clang_cc1 %s -fopenacc -verify +struct NotConvertible{} NC; void uses() { int Var; // expected-warning@+2{{OpenACC clause 'async' not yet implemented}} @@ -11,10 +12,8 @@ void uses() { // expected-warning@+2{{OpenACC clause 'self' not yet implemented}} // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} #pragma acc update self(Var) device_type(I) - // expected-warning@+2{{OpenACC clause 'if' not yet implemented}} // expected-warning@+1{{OpenACC clause 'self' not yet implemented}} #pragma acc update if(true) self(Var) - // expected-warning@+2{{OpenACC clause 'if_present' not yet implemented}} // expected-warning@+1{{OpenACC clause 'self' not yet implemented}} #pragma acc update if_present self(Var) // expected-warning@+1{{OpenACC clause 'self' not yet implemented}} @@ -30,13 +29,11 @@ void uses() { // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented}} // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} #pragma acc update self(Var) device_type(I) device_type(I) - // expected-warning@+3{{OpenACC clause 'self' not yet implemented}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented}} - // expected-warning@+1{{OpenACC clause 'if' not yet implemented}} + // expected-warning@+2{{OpenACC clause 'self' not yet implemented}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} #pragma acc update self(Var) device_type(I) if(true) - // expected-warning@+3{{OpenACC clause 'self' not yet implemented}} - // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented}} - // expected-warning@+1{{OpenACC clause 'if_present' not yet implemented}} + // expected-warning@+2{{OpenACC clause 'self' not yet implemented}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} #pragma acc update self(Var) device_type(I) if_present // expected-warning@+2{{OpenACC clause 'device_type' not yet implemented}} // expected-warning@+1{{OpenACC clause 'self' not yet implemented}} @@ -65,14 +62,15 @@ void uses() { #pragma acc update wait // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} #pragma acc update device_type(I) - // expected-warning@+1{{OpenACC clause 'if' not yet implemented}} #pragma acc update if(true) - // expected-warning@+1{{OpenACC clause 'if_present' not yet implemented}} #pragma acc update if_present - // TODO: OpenACC: There should only be a max of 1 'if'. - // expected-warning@+2{{OpenACC clause 'if' not yet implemented}} - // expected-warning@+1{{OpenACC clause 'if' not yet implemented}} + // expected-error@+2{{value of type 'struct NotConvertible' is not contextually convertible to 'bool'}} + // expected-warning@+1{{OpenACC clause 'device_type' not yet implemented}} +#pragma acc update if (NC) device_type(I) + + // expected-error@+2{{OpenACC 'if' clause cannot appear more than once on a 'update' directive}} + // expected-note@+1{{previous clause is here}} #pragma acc update if(true) if (false) // TODO: OpenACC: There is restrictions on the contents of a 'varlist', so _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits