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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
   Target Milestone|---                         |12.3
             Status|UNCONFIRMED                 |NEW
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2023-01-30
            Summary|Incorrect code generation   |[12/13 Regression]
                   |newer intel architectures   |Incorrect code generation
                   |for gcc 12 and 13           |newer intel architectures
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
With just -O3 -march=haswell on following test it started with
r13-4124-g156f523f9582f1e6bcce27ece03f2776960408c8
With -O2 -march=haswell -mtune=skylake-avx512 started with
r12-4240-g2b8453c401b699ed93c085d0413ab4b5030bcdb8
Finally with -O3 -march=haswell -mtune=skylake-avx512 with
r12-2666-g29f0e955c97da002b5adb4e8c9dfd2ea9709e207
__attribute__((noipa, noreturn)) void
bar (const char *, const char *, unsigned int, const char *) noexcept
{
  __builtin_abort ();
}

#  define assert(expr)                                                  \
     (static_cast <bool> (expr)                                         \
      ? void (0)                                                        \
      : bar (#expr, __FILE__, __LINE__, __PRETTY_FUNCTION__))

typedef decltype (sizeof 0) size_t;

struct Stats
{
  size_t _used;
  size_t _hold;
  size_t _dead;
  size_t _extra_used;
  Stats () : _used(0), _hold(0), _dead(0), _extra_used(0) {}
  Stats used (size_t val) { _used += val; return *this; }
  Stats hold (size_t val) { _hold += val; return *this; }
};

void
foo (size_t exp_used, size_t exp_hold, size_t exp_dead,
     size_t exp_extra_used, const Stats stats)
{
  assert (exp_used == stats._used);
  assert (exp_hold == stats._hold);
  assert (exp_dead == stats._dead);
  assert (exp_extra_used == stats._extra_used);
}

int
main ()
{
  foo (16, 0, 0, 0, Stats ().used (16).hold (0));
  foo (16, 16, 0, 0, Stats ().used (16).hold (16));
}

Reply via email to