https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95869

            Bug ID: 95869
           Summary: ICE when "target parallel" construct used with "if"
                    clause in Fortran
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: fortran
          Assignee: unassigned at gcc dot gnu.org
          Reporter: kcy at codesourcery dot com
  Target Milestone: ---

Compiling the following program results in an ICE:

program target_parallel_if
  implicit none

  integer, parameter :: N = 100
  integer, parameter :: LIMIT = 60
  integer :: i, j
  integer, dimension(N) :: a = (/ (i, i = 1,N) /)
  do j = 1, N
    !$omp target parallel if(j .lt. LIMIT) map(tofrom: a(1:N))
    do i = 1, N
      a(i) = a(i) + 1
    end do
    !$omp end target parallel
    end do
end program

$ x86_64-none-linux-gnu-gfortran target_parallel_if.f90 -O -fopenmp -S -o
target_parallel_if.s 
target_parallel_if.f90:9:0:

    9 |     !$omp target parallel if(j .lt. LIMIT) map(tofrom: a(1:N))
      | 
internal compiler error: in gimplify_var_or_parm_decl, at gimplify.c:2830
0xf6c765 gimplify_var_or_parm_decl
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:2830
0xf9efdc gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:14071
0xf76084 gimplify_modify_expr
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:5782
0xf9d09b gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:13612
0xf7a44b gimplify_stmt(tree_node**, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:6825
0xf696fc gimplify_statement_list
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:1869
0xf9ef01 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:14055
0xf7a44b gimplify_stmt(tree_node**, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:6825
0xf67d53 gimplify_bind_expr
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:1424
0xf9ddfc gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:13812
0xf7a44b gimplify_stmt(tree_node**, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:6825
0xf696fc gimplify_statement_list
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:1869
0xf9ef01 gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:14055
0xf7a44b gimplify_stmt(tree_node**, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:6825
0xf67d53 gimplify_bind_expr
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:1424
0xf9ddfc gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:13812
0xf7a44b gimplify_stmt(tree_node**, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:6825
0xf65136 gimplify_and_add(tree_node*, gimple**)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:486
0xf6960a gimplify_loop_expr
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:1843
0xf9de1d gimplify_expr(tree_node**, gimple**, gimple**, bool (*)(tree_node*),
int)
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/gimplify.c:13816
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <https://sourcery.mentor.com/GNUToolchain/> for instructions.

The issue seems to have been present since GCC 8. In GCC 7, it also ICEs but
with a different backtrace:

$ x86_64-none-linux-gnu-gfortran target_parallel_if.f90 -O -fopenmp -S -o
target_parallel_if.s                                                            
f951: internal compiler error: in parse_omp_structured_block, at
fortran/parse.c:5096                                                    
0x89fec2 parse_omp_structured_block                                             
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:5096 
0x8a02f5 parse_executable                                                       
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:5345 
0x89f541 parse_do_block                                                         
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:4649 
0x8a0280 parse_executable                                                       
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:5299 
0x8a0c04 parse_progunit                                                         
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:5659 
0x8a1af4 gfc_parse_file()                                                       
        /scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/parse.c:6161 
0x8f89f1 gfc_be_parse_file                                                      
       
/scratch/kyeung/openacc/trunk/src/gcc-mainline/gcc/fortran/f95-lang.c:204

The problem does not occur if the 'target parallel' is changed to 'target
parallel do', or if the 'if' clause is omitted. An equivalent program in C also
does not trigger the ICE.

Reply via email to