| !RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=52 %s | FileCheck --ignore-case --check-prefix="UNPARSE" %s |
| !RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=52 %s | FileCheck --check-prefix="PARSE-TREE" %s |
| |
| !Directive specification where directives have arguments |
| |
| subroutine f00(x) |
| integer :: x(10) |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & allocate(x)) |
| end |
| |
| !UNPARSE: SUBROUTINE f00 (x) |
| !UNPARSE: INTEGER x(10_4) |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: ALLOCATE(x)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = allocate |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'x' |
| !PARSE-TREE: | | | OmpClauseList -> |
| |
| subroutine f01(x) |
| integer :: x |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & critical(x)) |
| end |
| |
| !UNPARSE: SUBROUTINE f01 (x) |
| !UNPARSE: INTEGER x |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: CRITICAL(x)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = critical |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'x' |
| !PARSE-TREE: | | | OmpClauseList -> |
| |
| subroutine f02 |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & declare mapper(mymapper : integer :: v) map(tofrom: v)) |
| end |
| |
| !UNPARSE: SUBROUTINE f02 |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: DECLARE MAPPER(mymapper:INTEGER::& |
| !UNPARSE: !$OMP&v) MAP(TOFROM: v)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare mapper |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpMapperSpecifier |
| !PARSE-TREE: | | | | string = 'mymapper' |
| !PARSE-TREE: | | | | TypeSpec -> IntrinsicTypeSpec -> IntegerTypeSpec -> |
| !PARSE-TREE: | | | | Name = 'v' |
| !PARSE-TREE: | | | OmpClauseList -> OmpClause -> Map -> OmpMapClause |
| !PARSE-TREE: | | | | Modifier -> OmpMapType -> Value = Tofrom |
| !PARSE-TREE: | | | | OmpObjectList -> OmpObject -> Designator -> DataRef -> Name = 'v' |
| !PARSE-TREE: | | | | bool = 'true' |
| !PARSE-TREE: ImplicitPart -> |
| |
| subroutine f03 |
| type :: tt1 |
| integer :: x |
| endtype |
| type :: tt2 |
| real :: x |
| endtype |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & declare reduction(+ : tt1, tt2 : omp_out%x = omp_in%x + omp_out%x)) |
| end |
| |
| !UNPARSE: SUBROUTINE f03 |
| !UNPARSE: TYPE :: tt1 |
| !UNPARSE: INTEGER :: x |
| !UNPARSE: END TYPE |
| !UNPARSE: TYPE :: tt2 |
| !UNPARSE: REAL :: x |
| !UNPARSE: END TYPE |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: DECLARE REDUCTION(+:tt1, tt2: omp& |
| !UNPARSE: !$OMP&_out%x = omp_in%x + omp_out%x)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare reduction |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpReductionSpecifier |
| !PARSE-TREE: | | | | OmpReductionIdentifier -> DefinedOperator -> IntrinsicOperator = Add |
| !PARSE-TREE: | | | | OmpTypeNameList -> OmpTypeName -> TypeSpec -> DerivedTypeSpec |
| !PARSE-TREE: | | | | | Name = 'tt1' |
| !PARSE-TREE: | | | | OmpTypeName -> TypeSpec -> DerivedTypeSpec |
| !PARSE-TREE: | | | | | Name = 'tt2' |
| !PARSE-TREE: | | | | OmpCombinerExpression -> OmpStylizedInstance |
| !PARSE-TREE: | | | | | OmpStylizedDeclaration |
| !PARSE-TREE: | | | | | OmpStylizedDeclaration |
| !PARSE-TREE: | | | | | Instance -> AssignmentStmt = 'omp_out%x=omp_in%x+omp_out%x' |
| !PARSE-TREE: | | | | | | Variable = 'omp_out%x' |
| !PARSE-TREE: | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | DataRef -> Name = 'omp_out' |
| !PARSE-TREE: | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | | | | Expr = 'omp_in%x+omp_out%x' |
| !PARSE-TREE: | | | | | | | Add |
| !PARSE-TREE: | | | | | | | | Expr = 'omp_in%x' |
| !PARSE-TREE: | | | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | | | DataRef -> Name = 'omp_in' |
| !PARSE-TREE: | | | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | | | | | | Expr = 'omp_out%x' |
| !PARSE-TREE: | | | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | | | DataRef -> Name = 'omp_out' |
| !PARSE-TREE: | | | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | | OmpStylizedInstance |
| !PARSE-TREE: | | | | | OmpStylizedDeclaration |
| !PARSE-TREE: | | | | | OmpStylizedDeclaration |
| !PARSE-TREE: | | | | | Instance -> AssignmentStmt = 'omp_out%x=omp_in%x+omp_out%x' |
| !PARSE-TREE: | | | | | | Variable = 'omp_out%x' |
| !PARSE-TREE: | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | DataRef -> Name = 'omp_out' |
| !PARSE-TREE: | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | | | | Expr = 'omp_in%x+omp_out%x' |
| !PARSE-TREE: | | | | | | | Add |
| !PARSE-TREE: | | | | | | | | Expr = 'omp_in%x' |
| !PARSE-TREE: | | | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | | | DataRef -> Name = 'omp_in' |
| !PARSE-TREE: | | | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | | | | | | Expr = 'omp_out%x' |
| !PARSE-TREE: | | | | | | | | | Designator -> DataRef -> StructureComponent |
| !PARSE-TREE: | | | | | | | | | | DataRef -> Name = 'omp_out' |
| !PARSE-TREE: | | | | | | | | | | Name = 'x' |
| !PARSE-TREE: | | | OmpClauseList -> |
| !PARSE-TREE: | | | Flags = {} |
| |
| subroutine f04 |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & declare simd(f04)) |
| end |
| |
| !UNPARSE: SUBROUTINE f04 |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: DECLARE SIMD(f04)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare simd |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'f04' |
| !PARSE-TREE: | | | OmpClauseList -> |
| !PARSE-TREE: ImplicitPart -> |
| |
| subroutine f05 |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & declare target(f05)) |
| end |
| |
| !UNPARSE: SUBROUTINE f05 |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: DECLARE TARGET(f05)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = declare target |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'f05' |
| !PARSE-TREE: | | | OmpClauseList -> |
| !PARSE-TREE: ImplicitPart -> |
| |
| subroutine f06(x, y) |
| integer :: x, y |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & flush(x, y)) |
| end |
| |
| !UNPARSE: SUBROUTINE f06 (x, y) |
| !UNPARSE: INTEGER x, y |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: FLUSH(x, y)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = flush |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'x' |
| !PARSE-TREE: | | | | OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 'y' |
| !PARSE-TREE: | | | OmpClauseList -> |
| |
| subroutine f07 |
| integer :: t |
| !$omp metadirective when(user={condition(.true.)}: & |
| !$omp & threadprivate(t)) |
| end |
| |
| !UNPARSE: SUBROUTINE f07 |
| !UNPARSE: INTEGER t |
| !UNPARSE: !$OMP METADIRECTIVE WHEN(USER={CONDITION(.true._4)}: THREADPRIVATE(t)) |
| !UNPARSE: END SUBROUTINE |
| |
| !PARSE-TREE: DeclarationConstruct -> SpecificationConstruct -> OpenMPDeclarativeConstruct -> OmpMetadirectiveDirective |
| !PARSE-TREE: | OmpClauseList -> OmpClause -> When -> OmpWhenClause |
| !PARSE-TREE: | | Modifier -> OmpContextSelectorSpecification -> OmpTraitSetSelector |
| !PARSE-TREE: | | | OmpTraitSetSelectorName -> Value = User |
| !PARSE-TREE: | | | OmpTraitSelector |
| !PARSE-TREE: | | | | OmpTraitSelectorName -> Value = Condition |
| !PARSE-TREE: | | | | Properties |
| !PARSE-TREE: | | | | | OmpTraitProperty -> Scalar -> Expr = '.true._4' |
| !PARSE-TREE: | | | | | | LiteralConstant -> LogicalLiteralConstant |
| !PARSE-TREE: | | | | | | | bool = 'true' |
| !PARSE-TREE: | | OmpDirectiveSpecification |
| !PARSE-TREE: | | | OmpDirectiveName -> llvm::omp::Directive = threadprivate |
| !PARSE-TREE: | | | OmpArgumentList -> OmpArgument -> OmpLocator -> OmpObject -> Designator -> DataRef -> Name = 't' |
| !PARSE-TREE: | | | OmpClauseList -> |