Observed issues › catalog/cce19-reduction-task-addrspacecast-ice
Appears to behave incorrectlyCompiler crash · Fortran · OpenMP · Changed in 20.0.2
ftn 19: internal compiler error (invalid addrspacecast) on reduction(task)
Legality: independently confirmed. 2 independent readings find the program legal and the result required. How this is checked
Affected variants
| Compiler | MI300A gfx942 unified memory (XNACK 1) | MI300A gfx942 copy (XNACK 0) | MI250X gfx90a copy (XNACK 0) | MI300X gfx942 copy (XNACK 0) | MI350X gfx950 copy (XNACK 0) | A100 sm_80 separate memory | A100 sm_80 managed memory |
|---|---|---|---|---|---|---|---|
| AFAR 24.3.0 | fails another way | fails another way | fails another way | fails another way | fails another way | n/a | n/a |
| CCE 19.0.0 | behaves incorrectly | behaves incorrectly | behaves incorrectly | unknown not run | unknown not run | n/a | n/a |
| CCE 20.0.2 | fails another way | fails another way | fails another way | unknown not run | unknown not run | n/a | n/a |
| CCE 21.0.3 | fails another way | fails another way | fails another way | unknown not run | unknown not run | n/a | n/a |
| CCE 21.0.4 | fails another way | fails another way | fails another way | unknown not run | unknown not run | n/a | n/a |
| NVHPC 25.11 | n/a | n/a | n/a | n/a | n/a | fails another way | fails another way |
| NVHPC 26.9 | n/a | n/a | n/a | n/a | n/a | fails another way | fails another way |
| GCC 16.2.0 | correct | correct | correct | correct | correct | correct | n/a |
"behaves incorrectly" / "not supported": this issue, confirmed in up to four environments (another build directory, another node, a repeat). "fails another way": a different failure, not counted as this issue. "unknown": not run there, or the runs disagree.
Messages
| Result | Compiler and GPU | Message |
|---|---|---|
| behaves incorrectly | CCE 19.0.0, MI300A unified CCE 19.0.0, MI300A copy CCE 19.0.0, MI250X | showWarning: Headers and libraries from cray-libsci/25.03.0 will be ignored because depends on PE_MPICH which is unavailable.. error: cce19-reduction-task-addrspacecast-ice.f90:25:0: in function gen_prog_$ck_L22_1 void (i64, i64, i64, i64, i64, i64, i64): invalid addrspacecast |
| fails another way | AFAR 24.3.0, MI300A unified AFAR 24.3.0, MI300A copy AFAR 24.3.0, MI250X AFAR 24.3.0, MI300X AFAR 24.3.0, MI350X | showCall parameter type does not match function signature! %.taskred.input = alloca [1 x %kmp_taskred_input_t], align 8, addrspace(5) ptr %.taskred.desc = call ptr @__kmpc_taskred_modifier_init(ptr addrspacecast (ptr addrspace(1) @6 to ptr), i32 %omp_global_thread_num5, i32 1, i32 1, ptr addrspace(5) %.taskred.input) error: failed to create the LLVM module |
| fails another way | CCE 20.0.2, MI300A unified CCE 20.0.2, MI300A copy | showWarning: Headers and libraries from cray-libsci/25.09.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/cooltmpdir-PX87Oe/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/cooltmpdir-PX87Oe/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/cooltmpdir-PX87Oe/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/cooltmpdir-PX87Oe/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | CCE 20.0.2, MI250X | showWarning: Headers and libraries from cray-libsci/25.09.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/cooltmpdir-aYKfdV/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/cooltmpdir-aYKfdV/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/cooltmpdir-aYKfdV/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/cooltmpdir-aYKfdV/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | CCE 21.0.3, MI300A unified CCE 21.0.3, MI300A copy | showWarning: Headers and libraries from cray-libsci/26.03.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/pe_3541644//cooltmpdir-6moNdf/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3541644//cooltmpdir-6moNdf/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/pe_3541644//cooltmpdir-6moNdf/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3541644//cooltmpdir-6moNdf/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | CCE 21.0.3, MI250X | showWarning: Headers and libraries from cray-libsci/26.03.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/pe_3838449//cooltmpdir-dsfbaL/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3838449//cooltmpdir-dsfbaL/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/pe_3838449//cooltmpdir-dsfbaL/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3838449//cooltmpdir-dsfbaL/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | CCE 21.0.4, MI300A unified CCE 21.0.4, MI300A copy | showWarning: Headers and libraries from cray-libsci/26.03.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/pe_3329804//cooltmpdir-hHWwDk/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3329804//cooltmpdir-hHWwDk/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/pe_3329804//cooltmpdir-hHWwDk/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3329804//cooltmpdir-hHWwDk/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | CCE 21.0.4, MI250X | showWarning: Headers and libraries from cray-libsci/26.03.0 will be ignored because depends on PE_MPICH which is unavailable.. lld: error: undefined symbol: _cray$mt_taskred_modifier_init >>> referenced by <dir>/pe_3714279//cooltmpdir-EFcUtD/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3714279//cooltmpdir-EFcUtD/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) lld: error: undefined symbol: _cray$mt_taskred_modifier_fini >>> referenced by <dir>/pe_3714279//cooltmpdir-EFcUtD/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) >>> referenced by <dir>/pe_3714279//cooltmpdir-EFcUtD/repro-cce-openmppost_lld.amdgpu.lto.o:(gen_prog_$ck_L22_1) |
| fails another way | NVHPC 25.11, A100 separate NVHPC 25.11, A100 managed NVHPC 26.9, A100 separate NVHPC 26.9, A100 managed | showNVFORTRAN-S-0034-Syntax error at or near + (cce19-reduction-task-addrspacecast-ice.f90: 25) 0 inform, 0 warnings, 1 severes, 0 fatal for gen_prog |
Reproduce
CCE 19.0.0, MI300A unified
module load cce/19.0.0 craype-accel-amd-gfx942 rocm/6.4.3 module unload cray-mpich ftn -fopenmp -O2 repro.f90 -o repro HSA_XNACK=1 OMP_TARGET_OFFLOAD=mandatory ./repro
GCC 16.2.0, MI300A unified (runs correctly)
export LD_LIBRARY_PATH=$GCC_16_2/lib64:/opt/rocm-7.2.1/lib $GCC_16_2/bin/gfortran -fopenmp -foffload=amdgcn-amdhsa -foffload-options=amdgcn-amdhsa=-march=gfx942 -O2 repro.f90 -o repro HSA_XNACK=1 OMP_TARGET_OFFLOAD=mandatory ./repro
Program (72 lines)
! # Draft finding: omp52-clause-reduction-task on cce19
!
! - compiler: cce19
! - toolchain: cce19; arch: gfx942; machine: tuolumne; memory mode: unified; opt: -O2
! - program: catalog omp52-clause-reduction-task (f90, version 52, sha256 0181c241953a07c1)
! - expected: None (None; )
! - actual: ice (ice: error: omp52-clause-reduction-task.f90:34:0: in function gen_prog_$ck_L31_1 void (i64, i64, i64, i64, i64,
! i64, i64): invalid addrspacecast)
! - verdict: compiler_bug by rule R10-compile-ice: an internal compiler error (or the compiler rejecting code it generated) on a
! legal program: always the compiler's defect
! - reason:
! - citations: RUL-COMPILE-TIME (rulings.md)
! - legality: legal (legal by construction: offload.engine.gen / c_gen / acc_gen check every program against the catalog rules
! and the
! offload scope as it is built (no compiler))
! - witnesses: none
! - withdrawn: none
!
! Generated by compliance.gen (OpenMP 5.2, free-form Fortran). Do not edit.
! id: omp52-clause-reduction-task
! primary atom: omp.clause.reduction.task
! legal: yes
! observable: yes
! ran_on_host: inside the target region of interest
! evidence: construct
! needs: none
! std: f2008
program gen_prog
use omp_lib, only: omp_is_initial_device
implicit none
integer, parameter :: n = 64
integer, allocatable, target :: a(:), b(:)
integer :: ref(n)
integer :: i, host_flag
logical :: ok
integer :: s, sref
allocate(a(n), b(n))
do i = 1, n
a(i) = i
b(i) = 0
ref(i) = 2*i + 1
end do
host_flag = 1
s = 0
sref = 0
do i = 1, n
sref = sref + a(i)
end do
!$omp target map(to: a) map(from: b) map(tofrom: host_flag) map(tofrom: s)
host_flag = merge(1, 0, omp_is_initial_device())
!$omp parallel default(none) shared(a, b, s)
!$omp do reduction(task, +: s)
do i = 1, n
b(i) = 2*a(i) + 1
s = s + a(i)
end do
!$omp end do
!$omp end parallel
!$omp end target
ok = all(b == ref) .and. (s == sref)
print '(a,i0,a,a)', 'RESULT ran_on_host=', host_flag, ' check=', merge('pass', 'fail', ok)
deallocate(a, b)
end program gen_prog
! spec (requirement): The task reduction-modifier on a reduction clause of a parallel or worksharing construct
! privatizes the list item and supports task reductions.
! "If the task reduction-modifier is present for a parallel or worksharing construct, then each list item is
! privatized according to the description and restrictions in Section 5.3" (5.2 §5.5.8 p.135 l.16-18)
! spec (requirement): After the region the original list item contains the result of the reduction.
! "After the end of the region, the original list item contains the result of the reduction." (5.2 §5.5.8 p.135
! l.21-22)
! spec (this program): reduction(task, +: s) on a worksharing do inside a parallel region in a target region must
! leave the sum of a in s; CCE 19 stops with an invalid addrspacecast internal error.
Something to add? Dispute its legality · Report it fixed in a newer release · Report a mistake on this page
Expected and observed
Observed where it behaves incorrectly
Warning: Headers and libraries from cray-libsci/25.03.0 will be ignored because depends on PE_MPICH which is unavailable.. error: cce19-reduction-task-addrspacecast-ice.f90:25:0: in function gen_prog_$ck_L22_1 void (i64, i64, i64, i64, i64, i64, i64): invalid addrspacecast
What the specification requires
The specification text this program relies on and the compiler is expected to support.
OpenMP 5.2 §5.5.8 p.135 l.16-18
If the task reduction-modifier is present for a parallel or worksharing construct, then each list item is privatized according to the description and restrictions in Section 5.3
OpenMP 5.2 §5.5.8 p.135 l.21-22
After the end of the region, the original list item contains the result of the reduction.
Evidence
Same compiler, one change
- reduction(+: s) without the task modifier: AFAR 24.3.0: correct; CCE 19.0.0: correct; CCE 20.0.2: correct; CCE 21.0.3: correct; CCE 21.0.4: correct
Control program
program gen_prog use omp_lib, only: omp_is_initial_device implicit none integer, parameter :: n = 64 integer, allocatable, target :: a(:), b(:) integer :: ref(n) integer :: i, host_flag logical :: ok integer :: s, sref allocate(a(n), b(n)) do i = 1, n a(i) = i b(i) = 0 ref(i) = 2*i + 1 end do host_flag = 1 s = 0 sref = 0 do i = 1, n sref = sref + a(i) end do !$omp target map(to: a) map(from: b) map(tofrom: host_flag) map(tofrom: s) host_flag = merge(1, 0, omp_is_initial_device()) !$omp parallel default(none) shared(a, b, s) !$omp do reduction(+: s) do i = 1, n b(i) = 2*a(i) + 1 s = s + a(i) end do !$omp end do !$omp end parallel !$omp end target ok = all(b == ref) .and. (s == sref) print '(a,i0,a,a)', 'RESULT ran_on_host=', host_flag, ' check=', merge('pass', 'fail', ok) deallocate(a, b) end program gen_prog
Other compilers run it correctly
GCC 16.2.0