81 lines · plain
1! Test the Parse Tree to ensure the OpenMP Loop Transformation Construct Fuse constructs a correct sequence.2 3! RUN: %flang_fc1 -fdebug-dump-parse-tree -fopenmp -fopenmp-version=51 %s | FileCheck %s --check-prefix=CHECK-PARSE4! RUN: %flang_fc1 -fdebug-unparse -fopenmp -fopenmp-version=51 %s | FileCheck %s --check-prefix=CHECK-UNPARSE5 6subroutine loop_transformation_construct7 implicit none8 integer :: I = 109 integer :: j10 11 !$omp do12 !$omp fuse13 do i = 1, I14 continue15 end do16 do j = 1, I17 continue18 end do19 !$omp end fuse20 !$omp end do21end subroutine22 23!CHECK-PARSE: | ExecutionPart -> Block24!CHECK-PARSE-NEXT: | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct25!CHECK-PARSE-NEXT: | | | OmpBeginLoopDirective26!CHECK-PARSE-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = do27!CHECK-PARSE-NEXT: | | | | OmpClauseList ->28!CHECK-PARSE-NEXT: | | | | Flags = {}29!CHECK-PARSE-NEXT: | | | Block30!CHECK-PARSE-NEXT: | | | | ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPLoopConstruct31!CHECK-PARSE-NEXT: | | | | | OmpBeginLoopDirective32!CHECK-PARSE-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = fuse33!CHECK-PARSE-NEXT: | | | | | | OmpClauseList ->34!CHECK-PARSE-NEXT: | | | | | | Flags = {}35!CHECK-PARSE-NEXT: | | | | | Block36!CHECK-PARSE-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct37!CHECK-PARSE-NEXT: | | | | | | | NonLabelDoStmt38!CHECK-PARSE-NEXT: | | | | | | | | LoopControl -> LoopBounds39!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Name = 'i'40!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Expr = '1_4'41!CHECK-PARSE-NEXT: | | | | | | | | | | LiteralConstant -> IntLiteralConstant = '1'42!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Expr = 'i'43!CHECK-PARSE-NEXT: | | | | | | | | | | Designator -> DataRef -> Name = 'i'44!CHECK-PARSE-NEXT: | | | | | | | Block45!CHECK-PARSE-NEXT: | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> ContinueStmt46!CHECK-PARSE-NEXT: | | | | | | | EndDoStmt ->47!CHECK-PARSE-NEXT: | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> DoConstruct48!CHECK-PARSE-NEXT: | | | | | | | NonLabelDoStmt49!CHECK-PARSE-NEXT: | | | | | | | | LoopControl -> LoopBounds50!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Name = 'j'51!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Expr = '1_4'52!CHECK-PARSE-NEXT: | | | | | | | | | | LiteralConstant -> IntLiteralConstant = '1'53!CHECK-PARSE-NEXT: | | | | | | | | | Scalar -> Expr = 'i'54!CHECK-PARSE-NEXT: | | | | | | | | | | Designator -> DataRef -> Name = 'i'55!CHECK-PARSE-NEXT: | | | | | | | Block56!CHECK-PARSE-NEXT: | | | | | | | | ExecutionPartConstruct -> ExecutableConstruct -> ActionStmt -> ContinueStmt57!CHECK-PARSE-NEXT: | | | | | | | EndDoStmt ->58!CHECK-PARSE-NEXT: | | | | | OmpEndLoopDirective59!CHECK-PARSE-NEXT: | | | | | | OmpDirectiveName -> llvm::omp::Directive = fuse60!CHECK-PARSE-NEXT: | | | | | | OmpClauseList ->61!CHECK-PARSE-NEXT: | | | | | | Flags = {}62!CHECK-PARSE-NEXT: | | | OmpEndLoopDirective63!CHECK-PARSE-NEXT: | | | | OmpDirectiveName -> llvm::omp::Directive = do64!CHECK-PARSE-NEXT: | | | | OmpClauseList ->65!CHECK-PARSE-NEXT: | | | | Flags = {}66 67!CHECK-UNPARSE: SUBROUTINE loop_transformation_construct68!CHECK-UNPARSE-NEXT: IMPLICIT NONE69!CHECK-UNPARSE-NEXT: INTEGER :: i = 10_470!CHECK-UNPARSE-NEXT: INTEGER j71!CHECK-UNPARSE-NEXT: !$OMP DO72!CHECK-UNPARSE-NEXT: !$OMP FUSE73!CHECK-UNPARSE-NEXT: DO i=1_4,i74!CHECK-UNPARSE-NEXT: CONTINUE75!CHECK-UNPARSE-NEXT: END DO76!CHECK-UNPARSE-NEXT: DO j=1_4,i77!CHECK-UNPARSE-NEXT: CONTINUE78!CHECK-UNPARSE-NEXT: END DO79!CHECK-UNPARSE-NEXT: !$OMP END FUSE80!CHECK-UNPARSE-NEXT: !$OMP END DO81