https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95109
--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> --- (In reply to Martin Liška from comment #3) > Any update on the failing target1.f90 test-case? Not yet. What needs to be done is to mark loop variables as "private" – and attach this to the proper OpenMP directive; with "teams", "distribute" and multiple loops this can get rather complex. The middle end does this for "for" loops – but the Fortran FE *only* generates them for OpenMP loops – in particular for "simd". For normal Fortran loops, the ME does not recognize the loop variable. Hence, the complex algorithm of "2.19.1.1 Variables Referenced in a Construct" has to be implemented – i.e. skipping the private for those which already have firstprivate/lastprivate/private and attaching it to the correct directive. The ICE occurs if the private is attached to the wrong OpenMP directive which the ME then confuses. There can be a large number of directives combined (see target1.f90): !$omp target teams distribute parallel do … do i = 1, 10 do j = 1, 10 with some clauses like collapse(1) or collapse(2) or … The FE adds the "private" in gfc_resolve_do_iterator – and later in gfc_trans_omp_do (only for the OpenMP loops, there can be "normal" loops in between) and for combined directives above, they get split in gfc_split_omp_clauses – hence, the predetermined …private has end up on the right directive. I think adding 'private' only for non-OpenMP will avoid some split issues – but to do this, one has to evaluate 'collapse' etc. to know whether a loop becomes a ME-treated 'for' loop or not. And for nested omp directives, one has to attach the directive to the right directive. Example: !$omp teams !$omp distribute !$omp do do i = 1,n ! Omp loop, handled by ME do j = 1, m ! Fortran loop, unless collapse(2) … do i = 1,n … ! Fortran loop – not 'omp do' but inside 'omp distribute' To which directive should "private(i)" and private(j) be attached to? How differs this if there is a private/lastprivate/firstprivate on any of the directives? (The patch which causes this fail fixed other ICEs with another test case, but caused the target1.f90 fail. Thus, by undoing/doing those bits of r11-349 one can toggle between ICEs in the same ME function.)