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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
   Last reconfirmed|2018-04-30 00:00:00         |2021-4-15
                 CC|                            |msebor at gcc dot gnu.org
      Known to fail|8.0.1                       |10.2.0, 11.0, 8.3.0, 9.3.0

--- Comment #18 from Martin Sebor <msebor at gcc dot gnu.org> ---
Reconfirming with GCC 11.

Inverting the reachability expression:

  ((CONSP (Vframe_list)) ? (void) 0 : __builtin_unreachable ());

to

  (!(CONSP (Vframe_list)) ? __builtin_unreachable () : (void) 0);

or changing it to a corresponding if statement avoids the warning and improves
the emitted code, implying there is a missed optimization opportunity there
somewhere.

I also reduced the test from comment #6 a bit further to make it easier to
read:

struct A
{
  struct A *p, *q;
};

extern void *p;

inline _Bool
f (void* a)
{
  return ((__INTPTR_TYPE__) (a) & ~(- (1 << 3))) == 3;
}

inline struct A *
g (void* a)
{
  return (struct A *)((char *)a - 3);
}

extern void* foo (void*);

void bar (void)
{
#if NOWARN
  if (!f (p))
    __builtin_unreachable ();
#else
  f (p) ? (void)0 : __builtin_unreachable ();
#endif

  void* q;
  for (void *r = p; f (r) && ((q = g (r)->p), 1); r = g (r)->q)
    ;

  foo (q);
}

Reply via email to