public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
@ 2021-06-29 17:21 johnnybit at gmail dot com
  2021-06-29 17:54 ` [Bug middle-end/101262] " jakub at gcc dot gnu.org
                   ` (8 more replies)
  0 siblings, 9 replies; 10+ messages in thread
From: johnnybit at gmail dot com @ 2021-06-29 17:21 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 101262
           Summary: GCC11 OpenMP optimization causes sigsegv on aligned
                    constant array in darktable
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: johnnybit at gmail dot com
  Target Milestone: ---

A loop with constant length arrays with openmp and simd optimization crashes
with sigsegv when compilled with GCC11. Same code works with previous versions
and with various Clang versions

the code in question looks like

#define PIXEL_CHAN 8

static const float centers_ops[PIXEL_CHAN] DT_ALIGNED_ARRAY = {-56.0f / 7.0f,
// = -8.0f
                                                               -48.0f / 7.0f,
                                                               -40.0f / 7.0f,
                                                               -32.0f / 7.0f,
                                                               -24.0f / 7.0f,
                                                               -16.0f / 7.0f,
                                                                -8.0f / 7.0f,
                                                                 0.0f / 7.0f};

#pragma omp simd aligned(centers_ops, factors:64) safelen(PIXEL_CHAN)
reduction(+:result)
  for(int i = 0; i < PIXEL_CHAN; ++i)
    result += gaussian_func(expo - centers_ops[i], gauss_denom) * factors[i];


centers_ops is static const float [PIXEL_CHAN]
factors is const float *const restric factors (which is PIXEL_CHAN length)

the crash is on

result += gaussian_func(expo - centers_ops[i], gauss_denom) * factors[i];

line.

The reports in darktable are 
https://github.com/darktable-org/darktable/issues/9340
https://github.com/darktable-org/darktable/issues/9002

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
@ 2021-06-29 17:54 ` jakub at gcc dot gnu.org
  2021-06-29 19:06 ` johnnybit at gmail dot com
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-06-29 17:54 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |WAITING
                 CC|                            |jakub at gcc dot gnu.org
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2021-06-29

--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Please provide a small self-contained testcase, the above can't be compiled.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
  2021-06-29 17:54 ` [Bug middle-end/101262] " jakub at gcc dot gnu.org
@ 2021-06-29 19:06 ` johnnybit at gmail dot com
  2021-06-29 22:45 ` jakub at gcc dot gnu.org
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: johnnybit at gmail dot com @ 2021-06-29 19:06 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #2 from Hubert Kowalski <johnnybit at gmail dot com> ---
I've tried producing a minimum reproducer in form of code below, however I run
on gcc 10.3. And it depends on optimization type.

According to user reports - it's enough to compile darktable using GCC 11 with
RelWithDebInfo target (it applies -O2). Builds with Release target (-O3) are
apparently "fine"

(below code theoretically reproduces issue, but afaik it might not reliably
reproduce the problem)

#include <math.h>
#include <stdlib.h>
#include <omp.h>

#if defined(__GNUC__)
#pragma GCC optimize ("unroll-loops", "tree-loop-if-convert", \
                      "tree-loop-distribution", "no-strict-aliasing", \
                      "loop-interchange", "loop-nest-optimize", "tree-loop-im",
\
                      "unswitch-loops", "tree-loop-ivcanon",
"ira-loop-pressure", \
                      "split-ivs-in-unroller",
"variable-expansion-in-unroller", \
                      "split-loops", "ivopts", "predictive-commoning",\
                      "tree-loop-linear", "loop-block", "loop-strip-mine", \
                      "finite-math-only", "fp-contract=fast", "fast-math")
#endif

#define dt_omp_firstprivate(...) firstprivate(__VA_ARGS__)
#define __DT_CLONE_TARGETS__ __attribute__((target_clones("default", "sse2",
"sse3", "sse4.1", "sse4.2", "popcnt", "avx", "avx2", "avx512f", "fma4")))
#define DT_ALIGNED_ARRAY __attribute__((aligned(64)))
#define PIXEL_CHAN 8
#define UI_SAMPLES 256

// radial distances used for pixel ops
static const float centers_ops[PIXEL_CHAN] DT_ALIGNED_ARRAY = {-56.0f / 7.0f,
// = -8.0f
                                                               -48.0f / 7.0f,
                                                               -40.0f / 7.0f,
                                                               -32.0f / 7.0f,
                                                               -24.0f / 7.0f,
                                                               -16.0f / 7.0f,
                                                                -8.0f / 7.0f,
                                                                 0.0f / 7.0f};

typedef struct dt_iop_toneequalizer_gui_data_t
{
  // Mem arrays 64-bits aligned - contiguous memory
  float factors[PIXEL_CHAN] DT_ALIGNED_ARRAY;
  float gui_lut[UI_SAMPLES] DT_ALIGNED_ARRAY; // LUT for the UI graph
  float sigma;
} dt_iop_toneequalizer_gui_data_t;

#pragma omp declare simd
__DT_CLONE_TARGETS__
static inline float fast_clamp(const float value, const float bottom, const
float top)
{
  // vectorizable clamping between bottom and top values
  return fmaxf(fminf(value, top), bottom);
}

#pragma omp declare simd
__DT_CLONE_TARGETS__
static float gaussian_denom(const float sigma)
{
  // Gaussian function denominator such that y = exp(- radius^2 / denominator)
  // this is the constant factor of the exponential, so we don't need to
recompute it
  // for every single pixel
  return 2.0f * sigma * sigma;
}

#pragma omp declare simd
__DT_CLONE_TARGETS__
static float gaussian_func(const float radius, const float denominator)
{
  // Gaussian function without normalization
  // this is the variable part of the exponential
  // the denominator should be evaluated with `gaussian_denom`
  // ahead of the array loop for optimal performance
  return expf(- radius * radius / denominator);
}

__DT_CLONE_TARGETS__
static inline float pixel_correction(const float exposure,
                                     const float *const restrict factors,
                                     const float sigma)
{
  // build the correction for the current pixel
  // as the sum of the contribution of each luminance channel
  float result = 0.0f;
  const float gauss_denom = gaussian_denom(sigma);
  const float expo = fast_clamp(exposure, -8.0f, 0.0f);

#pragma omp simd aligned(centers_ops, factors:64) safelen(PIXEL_CHAN)
reduction(+:result)
  for(int i = 0; i < PIXEL_CHAN; ++i)
    result += gaussian_func(expo - centers_ops[i], gauss_denom) * factors[i];

  return fast_clamp(result, 0.25f, 4.0f);
}

__DT_CLONE_TARGETS__
static inline void compute_lut_correction(struct
dt_iop_toneequalizer_gui_data_t *g,
                                          const float offset,
                                          const float scaling)
{
  // Compute the LUT of the exposure corrections in EV,
  // offset and scale it for display in GUI widget graph

  float *const restrict LUT = g->gui_lut;
  const float *const restrict factors = g->factors;
  const float sigma = g->sigma;

#pragma omp parallel for simd schedule(static) default(none) \
  dt_omp_firstprivate(factors, sigma, offset, scaling, LUT) \
  aligned(LUT, factors:64)
  for(int k = 0; k < UI_SAMPLES; k++)
  {
    // build the inset graph curve LUT
    // the x range is [-14;+2] EV
    const float x = (8.0f * (((float)k) / ((float)(UI_SAMPLES - 1)))) - 8.0f;
    LUT[k] = offset - log2f(pixel_correction(x, factors, sigma)) / scaling;
  }
}

int main() {
    dt_iop_toneequalizer_gui_data_t *g = calloc(1,
sizeof(dt_iop_toneequalizer_gui_data_t));
    compute_lut_correction(g, 0.5f, 4.0f);
}

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
  2021-06-29 17:54 ` [Bug middle-end/101262] " jakub at gcc dot gnu.org
  2021-06-29 19:06 ` johnnybit at gmail dot com
@ 2021-06-29 22:45 ` jakub at gcc dot gnu.org
  2021-06-30  4:22 ` johnnybit at gmail dot com
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: jakub at gcc dot gnu.org @ 2021-06-29 22:45 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Can't reproduce with -O2 -fopenmp, neither with 10.3.1 20210422, nor current 11
branch, nor current trunk.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (2 preceding siblings ...)
  2021-06-29 22:45 ` jakub at gcc dot gnu.org
@ 2021-06-30  4:22 ` johnnybit at gmail dot com
  2021-06-30  4:42 ` marxin at gcc dot gnu.org
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: johnnybit at gmail dot com @ 2021-06-30  4:22 UTC (permalink / raw)
  To: gcc-bugs

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

--- Comment #4 from Hubert Kowalski <johnnybit at gmail dot com> ---
I tried to generate a reproducer based of off code that in linked reports is
"guaranteed to crash" when compilled with GCC 11. My feel is that since it
doesn't work in isolation there's more moving parts to it. Common points in
linked reports are: same piece of code crashes when compilled with GCC11,
RelWithDebInfo target and the same code works correct when compilled with gcc
10.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (3 preceding siblings ...)
  2021-06-30  4:22 ` johnnybit at gmail dot com
@ 2021-06-30  4:42 ` marxin at gcc dot gnu.org
  2021-06-30  6:36 ` [Bug middle-end/101262] [11/12 Regression] " rguenth at gcc dot gnu.org
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: marxin at gcc dot gnu.org @ 2021-06-30  4:42 UTC (permalink / raw)
  To: gcc-bugs

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

Martin Liška <marxin at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |marxin at gcc dot gnu.org

--- Comment #5 from Martin Liška <marxin at gcc dot gnu.org> ---
I'm willing to debug the original darktable binary, but I will need a proper
reproducer and steps what to do.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] [11/12 Regression] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (4 preceding siblings ...)
  2021-06-30  4:42 ` marxin at gcc dot gnu.org
@ 2021-06-30  6:36 ` rguenth at gcc dot gnu.org
  2021-07-28  7:07 ` rguenth at gcc dot gnu.org
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 10+ messages in thread
From: rguenth at gcc dot gnu.org @ 2021-06-30  6:36 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
            Version|11.0                        |11.1.0
   Target Milestone|---                         |11.2
      Known to fail|                            |11.1.0
           Keywords|                            |wrong-code
            Summary|GCC11 OpenMP optimization   |[11/12 Regression] GCC11
                   |causes sigsegv on aligned   |OpenMP optimization causes
                   |constant array in darktable |sigsegv on aligned constant
                   |                            |array in darktable
      Known to work|                            |10.3.0

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] [11/12 Regression] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (5 preceding siblings ...)
  2021-06-30  6:36 ` [Bug middle-end/101262] [11/12 Regression] " rguenth at gcc dot gnu.org
@ 2021-07-28  7:07 ` rguenth at gcc dot gnu.org
  2022-04-21  7:49 ` rguenth at gcc dot gnu.org
  2023-05-29 10:05 ` [Bug middle-end/101262] [11/12/13/14 " jakub at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: rguenth at gcc dot gnu.org @ 2021-07-28  7:07 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|11.2                        |11.3

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 11.2 is being released, retargeting bugs to GCC 11.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] [11/12 Regression] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (6 preceding siblings ...)
  2021-07-28  7:07 ` rguenth at gcc dot gnu.org
@ 2022-04-21  7:49 ` rguenth at gcc dot gnu.org
  2023-05-29 10:05 ` [Bug middle-end/101262] [11/12/13/14 " jakub at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-04-21  7:49 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|11.3                        |11.4

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
GCC 11.3 is being released, retargeting bugs to GCC 11.4.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Bug middle-end/101262] [11/12/13/14 Regression] GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable
  2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
                   ` (7 preceding siblings ...)
  2022-04-21  7:49 ` rguenth at gcc dot gnu.org
@ 2023-05-29 10:05 ` jakub at gcc dot gnu.org
  8 siblings, 0 replies; 10+ messages in thread
From: jakub at gcc dot gnu.org @ 2023-05-29 10:05 UTC (permalink / raw)
  To: gcc-bugs

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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|11.4                        |11.5

--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
GCC 11.4 is being released, retargeting bugs to GCC 11.5.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-05-29 10:05 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-06-29 17:21 [Bug c/101262] New: GCC11 OpenMP optimization causes sigsegv on aligned constant array in darktable johnnybit at gmail dot com
2021-06-29 17:54 ` [Bug middle-end/101262] " jakub at gcc dot gnu.org
2021-06-29 19:06 ` johnnybit at gmail dot com
2021-06-29 22:45 ` jakub at gcc dot gnu.org
2021-06-30  4:22 ` johnnybit at gmail dot com
2021-06-30  4:42 ` marxin at gcc dot gnu.org
2021-06-30  6:36 ` [Bug middle-end/101262] [11/12 Regression] " rguenth at gcc dot gnu.org
2021-07-28  7:07 ` rguenth at gcc dot gnu.org
2022-04-21  7:49 ` rguenth at gcc dot gnu.org
2023-05-29 10:05 ` [Bug middle-end/101262] [11/12/13/14 " jakub at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).