[PATCH] D108904: [flang][OpenMP] Added semantic checks for sections (associated section(s) should be structured block(s)) and simd constructs (associated loop(s) should be structured block(s))

Peixin Qiao via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 6 04:01:33 PDT 2021


peixin added inline comments.


================
Comment at: flang/test/Semantics/omp-simd01.f90:14
   do i = 1, 10
     do j = 1, 10
       print *, "omp simd"
----------------
NimishMishra wrote:
> peixin wrote:
> > NimishMishra wrote:
> > > peixin wrote:
> > > > Does your implementation support the following code:
> > > > 
> > > > ```
> > > > !$omp simd
> > > > do i = 1, 10
> > > >   30 stop
> > > >   do j = 1, 10
> > > >     goto 30
> > > >   end do
> > > > end do
> > > > !$omp end simd.
> > > > ```
> > > > If no collapse clause specified, it behaves as if only one loop immediately following is associated with the construct. Could you please add the test in your test case?
> > > The present state of the implementation gives a '//STOP statement is not allowed in a SIMD construct//'. Is that what you were looking for?
> > > 
> > > If not, this was added as //void Post(const parser::StopStmt &) { EmitBranchOutError("STOP"); }// in //NoBranchingEnforce// (source: https://reviews.llvm.org/D88655). Possibly @kiranchandramohan can offer some insights. According to his comment there, parallel region can have a STOP. I am not sure about SIMD.
> > > 
> > > 
> > > That said, if I replace that STOP statement with something else (like the example below), no errors are generated. That is expected I believe since branching within SIMD's associated DO loop shouldn't be considered a violation of the structured block restriction.
> > > 
> > > 
> > > ```
> > >  program sample                                                                                                                                                 use omp_lib                                                                                                                                                !$omp simd                                                                                                                                                   do i = 1, 10                                                                                                                                                 30 print*, "sample"                                                                                                                                          do j = 1, 10                                                                                                                                                   goto 30                                                                                                                                                      end do                                                                                                                                                     end do                                                                                                                                                     !$omp end simd                                                                                                                             end program sample
> > > ```
> > You can replace it with print *, "sample". My key point is to check branching out to the nested loop which is not associated with `simd` construct. I thought out one more better test case as follows:
> > 
> > ```
> > !$omp simd collapse(2)
> > do i = 1, 10
> >   30 print *, "This is wrong"
> >   do j = 1, 10
> >     40 print *, "This is OK"
> >     do k = 1, 10
> >       if (expression) then
> >         goto 30
> >       end if
> >       if (expression2) then
> >         goto 40
> >       end if
> >     end do
> >   end do
> > end do
> > !$omp end simd
> > ```
> > If my understanding is correct, please polish this test case and add it.
> The constraint is there, albeit not because of my changes. When I run this case, it gives a //The value of the parameter in the COLLAPSE or ORDERED clause must not be larger than the number of nested loops following the construct. //
> 
> The reason for this, as it seems to me is, that when we give a //COLLAPSE(2)//, it checks for immediately nesting of exactly 2 DO constructs. Anything else simply raises this error. In this vein, the following modification of this test case succeeds:
> 
> 
> ```
> !$omp simd collapse(2)
> do i = 1, 10  ! Removed 30 print*, ...
>   do j = 1, 10
>     40 print *, "This is OK"
>     do k = 1, 10
>       if (expression) then
>         goto 30
>       end if
>       if (expression2) then
>         goto 40
>       end if
>     end do
>   end do
> end do
> !$omp end simd
> ```
> 
> Similarly, trying //COLLAPSE(3)// would force removal of the print statement at label 40. So I think we can be reasonably assured that the simd nesting checks implemented in //check-omp-structure.cpp// will assure absence of any such statements which can violate the structured block restriction.
> 
> Please let me know your thoughts on this.
Thanks for the investigation. OK to me now.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D108904/new/

https://reviews.llvm.org/D108904



More information about the llvm-commits mailing list