https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117003
Bug ID: 117003 Summary: pr104783.c is miscompiled with offloading and results in segmentation fault during host-only execution for -O1 and above Product: gcc Version: 15.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: prathamesh3492 at gcc dot gnu.org Target Milestone: --- Hi, The following test (libgomp/pr104783.c): int main (void) { unsigned val = 0; #pragma omp target map(tofrom: val) #pragma omp simd for (int i = 0 ; i < 1 ; i++) { #pragma omp atomic update val = val + 1; } if (val != 1) __builtin_abort (); return 0; } Compiling with -O1 -fopenmp -foffload=nvptx-none and forcing host-only execution results in segfault. The issue here seems to be during omp lowering. D.4569 = .GOMP_USE_SIMT (); if (D.4569 != 0) goto <D.4570>; else goto <D.4571>; <D.4570>: { void * simduid.2; void * .omp_simt.3; int i; simduid.2 = .GOMP_SIMT_ENTER (simduid.2); .omp_simt.3 = .GOMP_SIMT_ENTER_ALLOC (simduid.2); #pragma omp simd _simduid_(simduid.2) _simt_ linear(i:1) for (i = 0; i < 1; i = i + 1) D.4577 = .omp_data_i->val; #pragma omp atomic_load relaxed D.4558 = *D.4577 D.4559 = D.4558 + 1; #pragma omp atomic_store relaxed (D.4559) #pragma omp continue (i, i) .GOMP_SIMT_EXIT (.omp_simt.3); #pragma omp return(nowait) } goto <D.4572>; <D.4571>: { int i; #pragma omp simd linear(i:1) for (i = 0; i < 1; i = i + 1) #pragma omp atomic_load relaxed D.4558 = *&*D.4577 D.4559 = D.4558 + 1; #pragma omp atomic_store relaxed (D.4559) #pragma omp continue (i, i) #pragma omp return(nowait) } <D.4572>: ... In the following stmt in simd code-path: #pragma omp atomic_load relaxed D.4558 = *&*D.4577 D.4577 is uninitialized. D.4577 is initialized in the sibling if-block containing simt code-path: D.4577 = .omp_data_i->val; which doesn't reach the use in atomic_load relaxed stmt, and gets expanded to following in ompexp dump: <bb 10> : __atomic_fetch_add_4 (D.4590, 1, 0); and thus we end up passing uninitialized pointer to __atomic_fetch_add_4, which results in segfault. While in the corresponding simt code-path, it's initialized correctly: <bb 5> : D.4590 = .omp_data_i->val; __atomic_fetch_add_4 (D.4590, 1, 0); Thanks, Prathamesh