/* PR debug/41340 */
/* { dg-do compile } */
/* { dg-options "-O3 -g -fcompare-debug" } */
/* { dg-options "-O3 -g -fcompare-debug -march=i686" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
/* { dg-skip-if "no long pointers" {  { ! ilp32 } && { ! lp64 } } } */

typedef struct { int t; } *T;
struct S1 { unsigned s1; };
struct S2 { struct S1 s2; };
struct S3 { unsigned s3; struct S2 **s4; };
struct S5 { struct S2 *s5; };

__extension__ typedef __INTPTR_TYPE__ ssize_t;

extern void fn0 (void) __attribute__ ((__noreturn__));
T fn6 (struct S3);
void fn7 (void);

static inline __attribute__((always_inline)) int
fn1 (const struct S1 *x)
{
  return x->s1;
}

static inline __attribute__((always_inline)) int
fn2 (const struct S1 *x, unsigned y)
{
  if (y >= x->s1)
    fn0 ();
  return 0;
}

static inline __attribute__((always_inline)) int
fn3 (struct S3 x)
{
  return (x.s3 == fn1 (*x.s4 ? &(*x.s4)->s2 : 0));
}

static inline __attribute__((always_inline)) int
fn4 (struct S3 x)
{
  return fn2 (&(*x.s4)->s2, x.s3);
}

int
fn5 (struct S3 x, T *y)
{
  if (!fn3 (x))
    {
      *y = (T) (ssize_t) fn4 (x);
      return 1;
    }
  return 0;
}

void
test (struct S5 *x)
{
  struct S3 a;
  T b;
  unsigned char c = 0;
  a.s4 = &x->s5;
  while (fn5 (a, &b))
    if (!(b->t & 8))
      c = 1;
  a.s4 = &x->s5;
  while ((b = fn6 (a)))
    ;
  if (!c)
    fn7 ();
}
