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

            Bug ID: 118509
           Summary: Front-end produced uninitialized memory reference when
                    compiling Nektar
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: dizhao at os dot amperecomputing.com
  Target Milestone: ---

Created attachment 60170
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=60170&action=edit
preprocessed cpp code

The problem is found when building Nektar++:
https://gitlab.nektar.info/nektar/nektar, file
library/LocalRegions/QuadExp.cpp .

Attached is a preprocessed version of the code, so it would be
easier to reproduce the problem. (Sorry the source file has a 
big 2Mb size, I've tried to remove some codes, but it's rather
difficult and time consuming to go on with that...) The compile
option is "g++ -std=c++17 -Ofast -c".

The bug is exposed after commit b25d3201 (gcc-15), On function:
"struct shared_ptr
std::__invoke_impl<std::shared_ptr<Nektar::NekMatrix<Nektar::NekMatrix<Nektar::NekMatrix<double,
Nektar::StandardMatrixTag>, Nektar::ScaledMatrixTag>, Nektar::BlockMatrixTag>
>,
std::shared_ptr<Nektar::NekMatrix<Nektar::NekMatrix<Nektar::NekMatrix<double,
Nektar::StandardMatrixTag>, Nektar::ScaledMatrixTag>, Nektar::BlockMatrixTag> >
(Nektar::LocalRegions::Expansion::*&)(const Nektar::LocalRegions::MatrixKey&),
Nektar::LocalRegions::QuadExp*&, const Nektar::LocalRegions::MatrixKey&>
(struct ..." 
.

After this commit, the gimple code at 007.gimple is like:

  ...
  struct QuadExp * D.278923;    //The problematic pointer.

  D.271234 = MEM[(struct QuadExp * &)__t];
  D.271235 = *__f;
  _1 = D.271235.__delta;
  _2 = _1 & 1;
  if (_2 != 0) goto <D.278921>; else goto <D.278922>;
  <D.278921>:
  D.278923 = D.271234;    //Assigned in one of the if-else branch.
  _3 = D.271235.__delta;
  _4 = _3 >> 1;
  _5 = (sizetype) _4;
  _6 = D.278923->D.217872._vptr.StdExpansion2D;
  _7 = _6 + 18446744073709551472;
  _8 = MEM[(long int *)_7];
  _9 = (sizetype) _8;
  _10 = _5 + _9;
  _11 = D.278923 + _10;
  _12 = MEM[(int (*) () * *)_11];
  _13 = D.271235.__pfn;
  _14 = (sizetype) _13;
  _15 = _12 + _14;
  iftmp.53 = *_15;
  goto <D.278924>;
  <D.278922>:
  iftmp.53 = D.271235.__pfn;
  <D.278924>:
  iftmp.54_16 = iftmp.53;
  _17 = D.271235.__delta;
  _18 = _17 >> 1;
  _19 = (sizetype) _18;
  _20 = D.278923->D.217872._vptr.StdExpansion2D;  //Used after if-else.
  _21 = _20 + 18446744073709551472;
  _22 = MEM[(long int *)_21];
  _23 = (sizetype) _22;
  _24 = _19 + _23;
  _25 = D.278923 + _24;
  *<retval> = iftmp.54_16 (_25, __args#0); [return slot optimization]
  return <retval>;

While before the commit, the gimple code was like:

  D.379618 = MEM[(struct QuadExp * &)__t]; //Only this variable is used.
  D.379620 = *__f;
  _1 = D.379620.__delta;
  _2 = _1 & 1;
  if (_2 != 0) goto <D.379621>; else goto <D.379622>;
  <D.379621>:
  _3 = D.379620.__delta;
  _4 = _3 >> 1;
  _5 = (sizetype) _4;
  _6 = D.379618->D.283369.D.273899._vptr.StdExpansion2D;
  _7 = _6 + 18446744073709551096;
  _8 = MEM[(long int *)_7];
  _9 = (sizetype) _8;
  _10 = _5 + _9;
  _11 = D.379618 + _10;
  _12 = MEM[(int (*) () * *)_11];
  _13 = D.379620.__pfn;
  _14 = (sizetype) _13;
  _15 = _12 + _14;
  iftmp.82 = *_15;
  goto <D.379623>;
  <D.379622>:
  iftmp.82 = D.379620.__pfn;
  <D.379623>:
  iftmp.83_16 = iftmp.82;
  _17 = D.379620.__delta;
  _18 = _17 >> 1;
  _19 = (sizetype) _18;
  _20 = D.379618->D.283369.D.273899._vptr.StdExpansion2D;
  _21 = _20 + 18446744073709551096;
  _22 = MEM[(long int *)_21];
  _23 = (sizetype) _22;
  _24 = _19 + _23;
  _25 = D.379618 + _24;
  *<retval> = iftmp.83_16 (_25, __args#0); [return slot optimization]
  return <retval>;

Reply via email to