https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119602
Bug ID: 119602
Summary: [OpenMP] append_args dependent prefer_type uses value
from first instantiation in all instantiations
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: waffl3x at protonmail dot com
Target Milestone: ---
Created attachment 60968
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60968&action=edit
Output with -ftree-dump-gimple
This bug is already fixed in my patch,
I am just posting it for record keeping purposes.
The problem is more evident in the gimple tree dump, but can still be
observed in godbolt. The most obvious indicator is the string literal
with the value for omp_ifr_level_zero is not contained at the top. You
can also observe the incorrect literals being moved into edx before
each instantiation of v_dependent_fr is called.
https://godbolt.org/z/PGvocd9Pv
```
typedef enum omp_interop_t : __UINTPTR_TYPE__
{
omp_interop_none = 0
} omp_interop_t;
typedef enum omp_interop_fr_t
{
omp_ifr_cuda = 1,
omp_ifr_cuda_driver = 2,
omp_ifr_opencl = 3,
omp_ifr_sycl = 4,
omp_ifr_hip = 5,
omp_ifr_level_zero = 6,
omp_ifr_hsa = 7,
omp_ifr_last = omp_ifr_hsa
} omp_interop_fr_t;
template<omp_interop_fr_t V>
struct FR {};
template<omp_interop_fr_t V, typename T2>
void v_dependent_fr(FR<V> x, T2 y) { }
#pragma omp declare variant(v_dependent_fr) match(construct={dispatch}) \
append_args(interop(prefer_type(V)))
template<omp_interop_fr_t V>
void b_dependent_fr(FR<V> x) { }
template<typename T, typename T2>
void v_cuda(T x, T2 y) { }
#pragma omp declare variant(v_cuda) match(construct={dispatch}) \
append_args(interop(prefer_type(omp_ifr_cuda_driver)))
template<typename T>
void b_cuda(T x) { }
template<typename T, typename T2>
void v_hip(T x, T2 y) { }
#pragma omp declare variant(v_hip) match(construct={dispatch}) \
append_args(interop(prefer_type(omp_ifr_hip)))
template<typename T>
void b_hip(T x) { }
template<typename T, typename T2>
void v_hsa(T x, T2 y) { }
#pragma omp declare variant(v_hsa) match(construct={dispatch}) \
append_args(interop(prefer_type(omp_ifr_hsa)))
template<typename T>
void b_hsa(T x) { }
void f ()
{
#pragma omp dispatch
b_dependent_fr (FR<omp_ifr_cuda_driver>{});
#pragma omp dispatch
b_dependent_fr (FR<omp_ifr_hip>{});
#pragma omp dispatch
b_dependent_fr (FR<omp_ifr_level_zero>{});
#pragma omp dispatch
b_dependent_fr (FR<omp_ifr_hsa>{});
#pragma omp dispatch
b_cuda (0);
#pragma omp dispatch
b_hip (0);
#pragma omp dispatch
b_hsa (0);
}
```
To reiterate, this is already fixed and I will post the patch later
this week.